diff --git a/CMakeLists.txt b/CMakeLists.txt index 7b055af0..18f30e54 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.24) -project(MinecraftConsoles LANGUAGES C CXX) +project(MinecraftConsoles LANGUAGES C CXX ASM_MASM) if(NOT WIN32) message(FATAL_ERROR "This CMake build currently supports Windows only.") @@ -28,7 +28,11 @@ target_compile_definitions(MinecraftWorld PRIVATE $<$>:_LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_LIB;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64> ) if(MSVC) - target_compile_options(MinecraftWorld PRIVATE /W3 /MP /EHsc) + target_compile_options(MinecraftWorld PRIVATE + $<$:/W3> + $<$:/MP> + $<$:/EHsc> + ) endif() add_executable(MinecraftClient WIN32 ${MINECRAFT_CLIENT_SOURCES}) @@ -43,7 +47,11 @@ target_compile_definitions(MinecraftClient PRIVATE $<$>:_LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64> ) if(MSVC) - target_compile_options(MinecraftClient PRIVATE /W3 /MP /EHsc) + target_compile_options(MinecraftClient PRIVATE + $<$:/W3> + $<$:/MP> + $<$:/EHsc> + ) endif() set_target_properties(MinecraftClient PROPERTIES @@ -55,18 +63,20 @@ target_link_libraries(MinecraftClient PRIVATE d3d11 XInput9_1_0 Shcore + wsock32 + legacy_stdio_definitions "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/Iggy/lib/iggy_w64.lib" + "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/Iggy/lib/iggyperfmon_w64.lib" + "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/Iggy/lib/iggyexpruntime_w64.lib" "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/Miles/lib/mss64.lib" $<$: "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Input_d.lib" "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Storage_d.lib" - "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Profile_d.lib" "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Render_PC_d.lib" > $<$>: - "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Input_r.lib" - "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Storage_r.lib" - "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Profile_r.lib" + "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Input.lib" + "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Storage.lib" "${CMAKE_CURRENT_SOURCE_DIR}/Minecraft.Client/Windows64/4JLibs/libs/4J_Render_PC.lib" > ) diff --git a/Minecraft.Client/AbstractProjectileDispenseBehavior.cpp b/Minecraft.Client/AbstractProjectileDispenseBehavior.cpp new file mode 100644 index 00000000..5e4b888b --- /dev/null +++ b/Minecraft.Client/AbstractProjectileDispenseBehavior.cpp @@ -0,0 +1,37 @@ +#include "stdafx.h" +#include "..\Minecraft.World\net.minecraft.core.h" +#include "..\Minecraft.World\net.minecraft.world.entity.projectile.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" +#include "AbstractProjectileDispenseBehavior.h" + +shared_ptr AbstractProjectileDispenseBehavior::execute(BlockSource *source, shared_ptr dispensed) +{ + Level *world = source->getWorld(); + Position position = DispenserTile::getDispensePosition(source); + FacingEnum *facing = DispenserTile::getFacing(source->getData()); + + shared_ptr arrow = getProjectile(world, position); + arrow->shoot(facing->getStepX(), facing->getStepY() + .1f, facing->getStepZ(), getPower(), getUncertainty()); + world->addEntity(arrow); + + dispensed->remove(1); + + return dispensed; +} + +void AbstractProjectileDispenseBehavior::playSound(BlockSource *source) +{ + source->getWorld()->levelEvent(LevelEvent::SOUND_LAUNCH, source->getBlockX(), source->getBlockY(), source->getBlockZ(), 0); +} + + +float AbstractProjectileDispenseBehavior::getUncertainty() +{ + return 6; +} + +float AbstractProjectileDispenseBehavior::getPower() +{ + return 1.1f; +} diff --git a/Minecraft.Client/AbstractProjectileDispenseBehavior.h b/Minecraft.Client/AbstractProjectileDispenseBehavior.h new file mode 100644 index 00000000..30705a8a --- /dev/null +++ b/Minecraft.Client/AbstractProjectileDispenseBehavior.h @@ -0,0 +1,17 @@ +#pragma once + +#include "..\Minecraft.World\DefaultDispenseItemBehavior.h" + +class Projectile; + +class AbstractProjectileDispenseBehavior : public DefaultDispenseItemBehavior +{ +public: + shared_ptr execute(BlockSource *source, shared_ptr dispensed); + +protected: + virtual void playSound(BlockSource *source); + virtual shared_ptr getProjectile(Level *world, Position *position) = 0; + virtual float getUncertainty(); + virtual float getPower(); +}; \ No newline at end of file diff --git a/Minecraft.Client/AbstractTexturePack.cpp b/Minecraft.Client/AbstractTexturePack.cpp index a4eb7f01..80799a4c 100644 --- a/Minecraft.Client/AbstractTexturePack.cpp +++ b/Minecraft.Client/AbstractTexturePack.cpp @@ -187,30 +187,34 @@ wstring AbstractTexturePack::getAnimationString(const wstring &textureName, cons wstring animationDefinitionFile = textureName + L".txt"; bool requiresFallback = !hasFile(L"\\" + textureName + L".png", false); - - 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..52cec351 100644 --- a/Minecraft.Client/ClientConnection.cpp +++ b/Minecraft.Client/ClientConnection.cpp @@ -13,7 +13,9 @@ #include "..\Minecraft.World\net.minecraft.world.level.chunk.h" #include "..\Minecraft.World\net.minecraft.stats.h" #include "..\Minecraft.World\net.minecraft.world.entity.h" +#include "..\Minecraft.World\net.minecraft.world.entity.ai.attributes.h" #include "..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\Minecraft.World\net.minecraft.world.entity.animal.h" #include "..\Minecraft.World\net.minecraft.world.entity.npc.h" #include "..\Minecraft.World\net.minecraft.world.entity.item.h" #include "..\Minecraft.World\net.minecraft.world.entity.projectile.h" @@ -41,6 +43,7 @@ #include "MinecraftServer.h" #include "ClientConstants.h" #include "..\Minecraft.World\SoundTypes.h" +#include "..\Minecraft.World\BasicTypeContainers.h" #include "TexturePackRepository.h" #ifdef _XBOX #include "Common\XUI\XUI_Scene_Trading.h" @@ -65,15 +68,15 @@ ClientConnection::ClientConnection(Minecraft *minecraft, const wstring& ip, int // 4J - added initiliasers random = new Random(); done = false; - level = false; - started = false; + level = false; + started = false; - this->minecraft = minecraft; + this->minecraft = minecraft; Socket *socket; if( gNetworkManager.IsHost() ) { - socket = new Socket(); // 4J - Local connection + socket = new Socket(); // 4J - Local connection } else { @@ -82,7 +85,7 @@ ClientConnection::ClientConnection(Minecraft *minecraft, const wstring& ip, int createdOk = socket->createdOk; if( createdOk ) { - connection = new Connection(socket, L"Client", this); + connection = new Connection(socket, L"Client", this); } else { @@ -97,12 +100,12 @@ ClientConnection::ClientConnection(Minecraft *minecraft, Socket *socket, int iUs // 4J - added initiliasers random = new Random(); done = false; - level = NULL; - started = false; + level = NULL; + started = false; savedDataStorage = new SavedDataStorage(NULL); maxPlayers = 20; - this->minecraft = minecraft; + this->minecraft = minecraft; if( iUserIndex < 0 ) { @@ -115,13 +118,13 @@ ClientConnection::ClientConnection(Minecraft *minecraft, Socket *socket, int iUs if( socket == NULL ) { - socket = new Socket(); // 4J - Local connection + socket = new Socket(); // 4J - Local connection } createdOk = socket->createdOk; if( createdOk ) { - connection = new Connection(socket, L"Client", this); + connection = new Connection(socket, L"Client", this); } else { @@ -129,6 +132,8 @@ ClientConnection::ClientConnection(Minecraft *minecraft, Socket *socket, int iUs // TODO 4J Stu - This will cause issues since the session player owns the socket //delete socket; } + + deferredEntityLinkPackets = vector(); } ClientConnection::~ClientConnection() @@ -140,8 +145,8 @@ ClientConnection::~ClientConnection() void ClientConnection::tick() { - if (!done) connection->tick(); - connection->flush(); + if (!done) connection->tick(); + connection->flush(); } INetworkPlayer *ClientConnection::getNetworkPlayer() @@ -152,7 +157,7 @@ INetworkPlayer *ClientConnection::getNetworkPlayer() void ClientConnection::handleLogin(shared_ptr packet) { - if (done) return; + if (done) return; PlayerUID OnlineXuid; ProfileManager.GetXUID(m_userIndex,&OnlineXuid,true); // online xuid @@ -405,26 +410,18 @@ void ClientConnection::handleLogin(shared_ptr packet) void ClientConnection::handleAddEntity(shared_ptr packet) { - double x = packet->x / 32.0; - double y = packet->y / 32.0; - double z = packet->z / 32.0; - shared_ptr e; - boolean setRot = true; + double x = packet->x / 32.0; + double y = packet->y / 32.0; + double z = packet->z / 32.0; + shared_ptr e; + bool setRot = true; // 4J-PB - replacing this massive if nest with switch switch(packet->type) { - case AddEntityPacket::MINECART_RIDEABLE: - e = shared_ptr( new Minecart(level, x, y, z, Minecart::RIDEABLE) ); + case AddEntityPacket::MINECART: + e = Minecart::createMinecart(level, x, y, z, packet->data); 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::FISH_HOOK: { // 4J Stu - Brought forward from 1.4 to be able to drop XP from fishing @@ -446,9 +443,10 @@ void ClientConnection::handleAddEntity(shared_ptr packet) } } } - shared_ptr player = dynamic_pointer_cast(owner); - if (player != NULL) + + if (owner->instanceof(eTYPE_PLAYER)) { + shared_ptr player = dynamic_pointer_cast(owner); shared_ptr hook = shared_ptr( new FishingHook(level, x, y, z, player) ); e = hook; // 4J Stu - Move the player->fishing out of the ctor as we cannot reference 'this' @@ -463,17 +461,17 @@ void ClientConnection::handleAddEntity(shared_ptr packet) case AddEntityPacket::SNOWBALL: e = shared_ptr( new Snowball(level, x, y, z) ); break; - case AddEntityPacket::ITEM_FRAME: + case AddEntityPacket::ITEM_FRAME: { int ix=(int) x; int iy=(int) y; int iz = (int) z; app.DebugPrintf("ClientConnection ITEM_FRAME xyz %d,%d,%d\n",ix,iy,iz); } - e = shared_ptr(new ItemFrame(level, (int) x, (int) y, (int) z, packet->data)); - packet->data = 0; - setRot = false; - break; + e = shared_ptr(new ItemFrame(level, (int) x, (int) y, (int) z, packet->data)); + packet->data = 0; + setRot = false; + break; case AddEntityPacket::THROWN_ENDERPEARL: e = shared_ptr( new ThrownEnderpearl(level, x, y, z) ); break; @@ -481,7 +479,7 @@ void ClientConnection::handleAddEntity(shared_ptr packet) e = shared_ptr( new EyeOfEnderSignal(level, x, y, z) ); break; case AddEntityPacket::FIREBALL: - e = shared_ptr( new Fireball(level, x, y, z, packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0) ); + e = shared_ptr( new LargeFireball(level, x, y, z, packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0) ); packet->data = 0; break; case AddEntityPacket::SMALL_FIREBALL: @@ -507,7 +505,7 @@ void ClientConnection::handleAddEntity(shared_ptr packet) e = shared_ptr( new Boat(level, x, y, z) ); break; case AddEntityPacket::PRIMED_TNT: - e = shared_ptr( new PrimedTnt(level, x, y, z) ); + e = shared_ptr( new PrimedTnt(level, x, y, z, nullptr) ); break; case AddEntityPacket::ENDER_CRYSTAL: e = shared_ptr( new EnderCrystal(level, x, y, z) ); @@ -519,14 +517,28 @@ void ClientConnection::handleAddEntity(shared_ptr packet) e = shared_ptr( new FallingTile(level, x, y, z, packet->data & 0xFFFF, packet->data >> 16) ); packet->data = 0; break; - - - + case AddEntityPacket::WITHER_SKULL: + e = shared_ptr(new WitherSkull(level, x, y, z, packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0)); + packet->data = 0; + break; + case AddEntityPacket::FIREWORKS: + e = shared_ptr(new FireworksRocketEntity(level, x, y, z, nullptr)); + break; + case AddEntityPacket::LEASH_KNOT: + e = shared_ptr(new LeashFenceKnotEntity(level, (int) x, (int) y, (int) z)); + packet->data = 0; + break; +#ifndef _FINAL_BUILD + default: + // Not a known entity (?) + assert(0); +#endif } + /* if (packet->type == AddEntityPacket::MINECART_RIDEABLE) e = shared_ptr( new Minecart(level, x, y, z, Minecart::RIDEABLE) ); - if (packet->type == AddEntityPacket::MINECART_CHEST) e = shared_ptr( new Minecart(level, x, y, z, Minecart::CHEST) ); - if (packet->type == AddEntityPacket::MINECART_FURNACE) e = shared_ptr( new Minecart(level, x, y, z, Minecart::FURNACE) ); - if (packet->type == AddEntityPacket::FISH_HOOK) + if (packet->type == AddEntityPacket::MINECART_CHEST) e = shared_ptr( new Minecart(level, x, y, z, Minecart::CHEST) ); + if (packet->type == AddEntityPacket::MINECART_FURNACE) e = shared_ptr( new Minecart(level, x, y, z, Minecart::FURNACE) ); + if (packet->type == AddEntityPacket::FISH_HOOK) { // 4J Stu - Brought forward from 1.4 to be able to drop XP from fishing shared_ptr owner = getEntity(packet->data); @@ -558,21 +570,21 @@ void ClientConnection::handleAddEntity(shared_ptr packet) packet->data = 0; } - if (packet->type == AddEntityPacket::ARROW) e = shared_ptr( new Arrow(level, x, y, z) ); - if (packet->type == AddEntityPacket::SNOWBALL) e = shared_ptr( new Snowball(level, x, y, z) ); + if (packet->type == AddEntityPacket::ARROW) e = shared_ptr( new Arrow(level, x, y, z) ); + if (packet->type == AddEntityPacket::SNOWBALL) e = shared_ptr( new Snowball(level, x, y, z) ); if (packet->type == AddEntityPacket::THROWN_ENDERPEARL) e = shared_ptr( new ThrownEnderpearl(level, x, y, z) ); if (packet->type == AddEntityPacket::EYEOFENDERSIGNAL) e = shared_ptr( new EyeOfEnderSignal(level, x, y, z) ); - if (packet->type == AddEntityPacket::FIREBALL) + if (packet->type == AddEntityPacket::FIREBALL) { - e = shared_ptr( new Fireball(level, x, y, z, packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0) ); - packet->data = 0; - } + e = shared_ptr( new Fireball(level, x, y, z, packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0) ); + packet->data = 0; + } if (packet->type == AddEntityPacket::SMALL_FIREBALL) { e = shared_ptr( new SmallFireball(level, x, y, z, packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0) ); packet->data = 0; } - if (packet->type == AddEntityPacket::EGG) e = shared_ptr( new ThrownEgg(level, x, y, z) ); + if (packet->type == AddEntityPacket::EGG) e = shared_ptr( new ThrownEgg(level, x, y, z) ); if (packet->type == AddEntityPacket::THROWN_POTION) { e = shared_ptr( new ThrownPotion(level, x, y, z, packet->data) ); @@ -583,20 +595,20 @@ void ClientConnection::handleAddEntity(shared_ptr packet) e = shared_ptr( new ThrownExpBottle(level, x, y, z) ); packet->data = 0; } - if (packet->type == AddEntityPacket::BOAT) e = shared_ptr( new Boat(level, x, y, z) ); - if (packet->type == AddEntityPacket::PRIMED_TNT) e = shared_ptr( new PrimedTnt(level, x, y, z) ); + if (packet->type == AddEntityPacket::BOAT) e = shared_ptr( new Boat(level, x, y, z) ); + if (packet->type == AddEntityPacket::PRIMED_TNT) e = shared_ptr( new PrimedTnt(level, x, y, z) ); if (packet->type == AddEntityPacket::ENDER_CRYSTAL) e = shared_ptr( new EnderCrystal(level, x, y, z) ); - if (packet->type == AddEntityPacket::FALLING_SAND) e = shared_ptr( new FallingTile(level, x, y, z, Tile::sand->id) ); - if (packet->type == AddEntityPacket::FALLING_GRAVEL) e = shared_ptr( new FallingTile(level, x, y, z, Tile::gravel->id) ); + if (packet->type == AddEntityPacket::FALLING_SAND) e = shared_ptr( new FallingTile(level, x, y, z, Tile::sand->id) ); + if (packet->type == AddEntityPacket::FALLING_GRAVEL) e = shared_ptr( new FallingTile(level, x, y, z, Tile::gravel->id) ); if (packet->type == AddEntityPacket::FALLING_EGG) e = shared_ptr( new FallingTile(level, x, y, z, Tile::dragonEgg_Id) ); */ - if (e != NULL) + if (e != NULL) { - e->xp = packet->x; - e->yp = packet->y; - e->zp = packet->z; + e->xp = packet->x; + e->yp = packet->y; + e->zp = packet->z; float yRot = packet->yRot * 360 / 256.0f; float xRot = packet->xRot * 360 / 256.0f; @@ -622,20 +634,29 @@ void ClientConnection::handleAddEntity(shared_ptr packet) } } - // Note - not doing this move for frame, as the ctor for these objects does some adjustments on the position based on direction to move the object out slightly from what it is attached to, and this just overwrites it - if( packet->type != AddEntityPacket::ITEM_FRAME ) + if (packet->type == AddEntityPacket::LEASH_KNOT) { - 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 +674,18 @@ void ClientConnection::handleAddEntity(shared_ptr packet) } } - if (dynamic_pointer_cast(owner) != NULL) + if ( owner != NULL && owner->instanceof(eTYPE_LIVINGENTITY) ) { - dynamic_pointer_cast(e)->owner = dynamic_pointer_cast(owner); - } - } + dynamic_pointer_cast(e)->owner = dynamic_pointer_cast(owner); + } + } - e->lerpMotion(packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0); - } + e->lerpMotion(packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0); + } + + // 4J: Check our deferred entity link packets + checkDeferredEntityLinkPackets(e->entityId); } - } void ClientConnection::handleAddExperienceOrb(shared_ptr packet) @@ -679,43 +702,43 @@ void ClientConnection::handleAddExperienceOrb(shared_ptr void ClientConnection::handleAddGlobalEntity(shared_ptr packet) { - double x = packet->x / 32.0; - double y = packet->y / 32.0; - double z = packet->z / 32.0; - shared_ptr e;// = nullptr; - if (packet->type == AddGlobalEntityPacket::LIGHTNING) e = shared_ptr( new LightningBolt(level, x, y, z) ); - if (e != NULL) + double x = packet->x / 32.0; + double y = packet->y / 32.0; + double z = packet->z / 32.0; + shared_ptr e;// = nullptr; + if (packet->type == AddGlobalEntityPacket::LIGHTNING) e = shared_ptr( new LightningBolt(level, x, y, z) ); + if (e != NULL) { - e->xp = packet->x; - e->yp = packet->y; - e->zp = packet->z; - e->yRot = 0; - e->xRot = 0; - e->entityId = packet->id; - level->addGlobalEntity(e); - } + e->xp = packet->x; + e->yp = packet->y; + e->zp = packet->z; + e->yRot = 0; + e->xRot = 0; + e->entityId = packet->id; + level->addGlobalEntity(e); + } } void ClientConnection::handleAddPainting(shared_ptr packet) { - shared_ptr painting = shared_ptr( new Painting(level, packet->x, packet->y, packet->z, packet->dir, packet->motive) ); - level->putEntity(packet->id, painting); + shared_ptr painting = shared_ptr( new Painting(level, packet->x, packet->y, packet->z, packet->dir, packet->motive) ); + level->putEntity(packet->id, painting); } void ClientConnection::handleSetEntityMotion(shared_ptr packet) { - shared_ptr e = getEntity(packet->id); - if (e == NULL) return; - e->lerpMotion(packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0); + shared_ptr e = getEntity(packet->id); + if (e == NULL) return; + e->lerpMotion(packet->xa / 8000.0, packet->ya / 8000.0, packet->za / 8000.0); } void ClientConnection::handleSetEntityData(shared_ptr packet) { - shared_ptr e = getEntity(packet->id); - if (e != NULL && packet->getUnpackedData() != NULL) + shared_ptr e = getEntity(packet->id); + if (e != NULL && packet->getUnpackedData() != NULL) { - e->getEntityData()->assignValues(packet->getUnpackedData()); - } + e->getEntityData()->assignValues(packet->getUnpackedData()); + } } void ClientConnection::handleAddPlayer(shared_ptr packet) @@ -750,15 +773,15 @@ void ClientConnection::handleAddPlayer(shared_ptr packet) } #endif - double x = packet->x / 32.0; - double y = packet->y / 32.0; - double z = packet->z / 32.0; - float yRot = packet->yRot * 360 / 256.0f; - float xRot = packet->xRot * 360 / 256.0f; - shared_ptr player = shared_ptr( new RemotePlayer(minecraft->level, packet->name) ); - player->xo = player->xOld = player->xp = packet->x; - player->yo = player->yOld = player->yp = packet->y; - player->zo = player->zOld = player->zp = packet->z; + double x = packet->x / 32.0; + double y = packet->y / 32.0; + double z = packet->z / 32.0; + float yRot = packet->yRot * 360 / 256.0f; + float xRot = packet->xRot * 360 / 256.0f; + shared_ptr player = shared_ptr( new RemotePlayer(minecraft->level, packet->name) ); + player->xo = player->xOld = player->xp = packet->x; + player->yo = player->yOld = player->yp = packet->y; + player->zo = player->zOld = player->zp = packet->z; player->xRotp = packet->xRot; player->yRotp = packet->yRot; player->yHeadRot = packet->yHeadRot * 360 / 256.0f; @@ -767,24 +790,24 @@ void ClientConnection::handleAddPlayer(shared_ptr packet) #ifdef _DURANGO // On Durango request player display name from network manager INetworkPlayer *networkPlayer = g_NetworkManager.GetPlayerByXuid(player->getXuid()); - if (networkPlayer != NULL) player->displayName = networkPlayer->GetDisplayName(); + if (networkPlayer != NULL) player->m_displayName = networkPlayer->GetDisplayName(); #else // On all other platforms display name is just gamertag so don't check with the network manager - player->displayName = player->name; + player->m_displayName = player->name; #endif // printf("\t\t\t\t%d: Add player\n",packet->id,packet->yRot); - int item = packet->carriedItem; - if (item == 0) + int item = packet->carriedItem; + if (item == 0) { - player->inventory->items[player->inventory->selected] = shared_ptr(); // NULL; - } + player->inventory->items[player->inventory->selected] = shared_ptr(); // NULL; + } else { - player->inventory->items[player->inventory->selected] = shared_ptr( new ItemInstance(item, 1, 0) ); - } - player->absMoveTo(x, y, z, yRot, xRot); + player->inventory->items[player->inventory->selected] = shared_ptr( new ItemInstance(item, 1, 0) ); + } + player->absMoveTo(x, y, z, yRot, xRot); player->setPlayerIndex( packet->m_playerIndex ); player->setCustomSkin( packet->m_skinId ); @@ -824,7 +847,7 @@ void ClientConnection::handleAddPlayer(shared_ptr packet) app.DebugPrintf("Custom cape for player %ls is %ls\n",player->name.c_str(),player->customTextureUrl2.c_str()); - level->putEntity(packet->id, player); + level->putEntity(packet->id, player); vector > *unpackedData = packet->getUnpackedData(); if (unpackedData != NULL) @@ -836,37 +859,44 @@ void ClientConnection::handleAddPlayer(shared_ptr packet) void ClientConnection::handleTeleportEntity(shared_ptr packet) { - shared_ptr e = getEntity(packet->id); - if (e == NULL) return; - e->xp = packet->x; - e->yp = packet->y; - e->zp = packet->z; - double x = e->xp / 32.0; - double y = e->yp / 32.0 + 1 / 64.0f; - double z = e->zp / 32.0; + shared_ptr e = getEntity(packet->id); + if (e == NULL) return; + e->xp = packet->x; + e->yp = packet->y; + e->zp = packet->z; + double x = e->xp / 32.0; + double y = e->yp / 32.0 + 1 / 64.0f; + double z = e->zp / 32.0; // 4J - make sure xRot stays within -90 -> 90 range int ixRot = packet->xRot; if( ixRot >= 128 ) ixRot -= 256; - float yRot = packet->yRot * 360 / 256.0f; - float xRot = ixRot * 360 / 256.0f; + float yRot = packet->yRot * 360 / 256.0f; + float xRot = ixRot * 360 / 256.0f; e->yRotp = packet->yRot; e->xRotp = ixRot; // printf("\t\t\t\t%d: Teleport to %d (lerp to %f)\n",packet->id,packet->yRot,yRot); - e->lerpTo(x, y, z, yRot, xRot, 3); + e->lerpTo(x, y, z, yRot, xRot, 3); +} + +void ClientConnection::handleSetCarriedItem(shared_ptr packet) +{ + if (packet->slot >= 0 && packet->slot < Inventory::getSelectionSize()) { + Minecraft::GetInstance()->localplayers[m_userIndex].get()->inventory->selected = packet->slot; + } } void ClientConnection::handleMoveEntity(shared_ptr packet) { - shared_ptr e = getEntity(packet->id); - if (e == NULL) return; - e->xp += packet->xa; - e->yp += packet->ya; - e->zp += packet->za; - double x = e->xp / 32.0; + shared_ptr e = getEntity(packet->id); + if (e == NULL) return; + e->xp += packet->xa; + e->yp += packet->ya; + e->zp += packet->za; + double x = e->xp / 32.0; // 4J - The original code did not add the 1/64.0f like the teleport above did, which caused minecarts to fall through the ground - double y = e->yp / 32.0 + 1 / 64.0f; - double z = e->zp / 32.0; + double y = e->yp / 32.0 + 1 / 64.0f; + double z = e->zp / 32.0; // 4J - have changed rotation to be relative here too e->yRotp += packet->yRot; e->xRotp += packet->xRot; @@ -874,7 +904,7 @@ void ClientConnection::handleMoveEntity(shared_ptr packet) float xRot = ( e->xRotp * 360 ) / 256.0f; // float yRot = packet->hasRot ? packet->yRot * 360 / 256.0f : e->yRot; // float xRot = packet->hasRot ? packet->xRot * 360 / 256.0f : e->xRot; - e->lerpTo(x, y, z, yRot, xRot, 3); + e->lerpTo(x, y, z, yRot, xRot, 3); } void ClientConnection::handleRotateMob(shared_ptr packet) @@ -887,15 +917,15 @@ void ClientConnection::handleRotateMob(shared_ptr packet) void ClientConnection::handleMoveEntitySmall(shared_ptr packet) { - shared_ptr e = getEntity(packet->id); - if (e == NULL) return; - e->xp += packet->xa; - e->yp += packet->ya; - e->zp += packet->za; - double x = e->xp / 32.0; + shared_ptr e = getEntity(packet->id); + if (e == NULL) return; + e->xp += packet->xa; + e->yp += packet->ya; + e->zp += packet->za; + double x = e->xp / 32.0; // 4J - The original code did not add the 1/64.0f like the teleport above did, which caused minecarts to fall through the ground - double y = e->yp / 32.0 + 1 / 64.0f; - double z = e->zp / 32.0; + double y = e->yp / 32.0 + 1 / 64.0f; + double z = e->zp / 32.0; // 4J - have changed rotation to be relative here too e->yRotp += packet->yRot; e->xRotp += packet->xRot; @@ -903,7 +933,7 @@ void ClientConnection::handleMoveEntitySmall(shared_ptr p float xRot = ( e->xRotp * 360 ) / 256.0f; // float yRot = packet->hasRot ? packet->yRot * 360 / 256.0f : e->yRot; // float xRot = packet->hasRot ? packet->xRot * 360 / 256.0f : e->xRot; - e->lerpTo(x, y, z, yRot, xRot, 3); + e->lerpTo(x, y, z, yRot, xRot, 3); } void ClientConnection::handleRemoveEntity(shared_ptr packet) @@ -916,51 +946,51 @@ void ClientConnection::handleRemoveEntity(shared_ptr packe void ClientConnection::handleMovePlayer(shared_ptr packet) { - shared_ptr player = minecraft->localplayers[m_userIndex]; //minecraft->player; + 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 +999,7 @@ void ClientConnection::handleMovePlayer(shared_ptr packet) { ui.CloseUIScenes(m_userIndex); } - } + } } @@ -1067,24 +1097,37 @@ void ClientConnection::handleBlockRegionUpdate(shared_ptrbIsFullChunk) { y1 = Level::maxBuildHeight; - if(packet->buffer.length > 0) LevelChunk::reorderBlocksAndDataToXZY(packet->y, packet->xs, packet->ys, packet->zs, &packet->buffer); + if(packet->buffer.length > 0) + { + PIXBeginNamedEvent(0, "Reordering to XZY"); + LevelChunk::reorderBlocksAndDataToXZY(packet->y, packet->xs, packet->ys, packet->zs, &packet->buffer); + PIXEndNamedEvent(); + } } + PIXBeginNamedEvent(0,"Clear rest region"); dimensionLevel->clearResetRegion(packet->x, packet->y, packet->z, packet->x + packet->xs - 1, y1 - 1, packet->z + packet->zs - 1); + PIXEndNamedEvent(); + PIXBeginNamedEvent(0,"setBlocksAndData"); // Only full chunks send lighting information now - added flag to end of this call dimensionLevel->setBlocksAndData(packet->x, packet->y, packet->z, packet->xs, packet->ys, packet->zs, packet->buffer, packet->bIsFullChunk); + PIXEndNamedEvent(); // OutputDebugString("END BRU\n"); + PIXBeginNamedEvent(0,"removeUnusedTileEntitiesInRegion"); // 4J - remove any tite entities in this region which are associated with a tile that is now no longer a tile entity. Without doing this we end up with stray // tile entities kicking round, which leads to a bug where chests can't be properly placed again in a location after (say) a chest being removed by TNT dimensionLevel->removeUnusedTileEntitiesInRegion(packet->x, packet->y, packet->z, packet->x + packet->xs, y1, packet->z + packet->zs ); + PIXEndNamedEvent(); // If this is a full packet for a chunk, make sure that the cache now considers that it has data for this chunk - this is used to determine whether to bother // rendering mobs or not, so we don't have them in crazy positions before the data is there if( packet->bIsFullChunk ) { + PIXBeginNamedEvent(0,"dateReceivedForChunk"); dimensionLevel->dataReceivedForChunk( packet->x >> 4, packet->z >> 4 ); + PIXEndNamedEvent(); } PIXEndNamedEvent(); } @@ -1150,22 +1193,22 @@ void ClientConnection::handleTileUpdate(shared_ptr packet) void ClientConnection::handleDisconnect(shared_ptr packet) { connection->close(DisconnectPacket::eDisconnect_Kicked); - done = true; + done = true; Minecraft *pMinecraft = Minecraft::GetInstance(); pMinecraft->connectionDisconnected( m_userIndex , packet->reason ); app.SetDisconnectReason( packet->reason ); app.SetAction(m_userIndex,eAppAction_ExitWorld,(void *)TRUE); - //minecraft->setLevel(NULL); + //minecraft->setLevel(NULL); //minecraft->setScreen(new DisconnectedScreen(L"disconnect.disconnected", L"disconnect.genericReason", &packet->reason)); } void ClientConnection::onDisconnect(DisconnectPacket::eDisconnectReason reason, void *reasonObjects) { - if (done) return; - done = true; + if (done) return; + done = true; Minecraft *pMinecraft = Minecraft::GetInstance(); pMinecraft->connectionDisconnected( m_userIndex , reason ); @@ -1180,34 +1223,34 @@ void ClientConnection::onDisconnect(DisconnectPacket::eDisconnectReason reason, { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_EXITING_GAME, IDS_GENERIC_ERROR, uiIDA, 1, ProfileManager.GetPrimaryPad(),&ClientConnection::HostDisconnectReturned,NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_EXITING_GAME, IDS_GENERIC_ERROR, uiIDA, 1, ProfileManager.GetPrimaryPad(),&ClientConnection::HostDisconnectReturned,NULL); } else { app.SetAction(m_userIndex,eAppAction_ExitWorld,(void *)TRUE); } - //minecraft->setLevel(NULL); - //minecraft->setScreen(new DisconnectedScreen(L"disconnect.lost", reason, reasonObjects)); + //minecraft->setLevel(NULL); + //minecraft->setScreen(new DisconnectedScreen(L"disconnect.lost", reason, reasonObjects)); } void ClientConnection::sendAndDisconnect(shared_ptr packet) { - if (done) return; - connection->send(packet); - connection->sendAndQuit(); + if (done) return; + connection->send(packet); + connection->sendAndQuit(); } void ClientConnection::send(shared_ptr packet) { - if (done) return; - connection->send(packet); + if (done) return; + connection->send(packet); } void ClientConnection::handleTakeItemEntity(shared_ptr packet) { - shared_ptr from = getEntity(packet->itemId); - shared_ptr to = dynamic_pointer_cast(getEntity(packet->playerId)); + shared_ptr from = getEntity(packet->itemId); + shared_ptr to = dynamic_pointer_cast(getEntity(packet->playerId)); // 4J - the original game could assume that if getEntity didn't find the player, it must be the local player. We // need to search all local players @@ -1225,15 +1268,15 @@ void ClientConnection::handleTakeItemEntity(shared_ptr pac } } - if (to == NULL) + if (to == NULL) { // Don't know if this should ever really happen, but seems safest to try and remove the entity that has been collected even if we can't // create a particle as we don't know what really collected it level->removeEntity(packet->itemId); - return; - } + return; + } - if (from != NULL) + if (from != NULL) { // If this is a local player, then we only want to do processing for it if this connection is associated with the player it is for. In // particular, we don't want to remove the item entity until we are processing it for the right connection, or else we won't have a valid @@ -1277,7 +1320,7 @@ void ClientConnection::handleTakeItemEntity(shared_ptr pac minecraft->particleEngine->add( shared_ptr( new TakeAnimationParticle(minecraft->level, from, to, -0.5f) ) ); level->removeEntity(packet->itemId); } - } + } } @@ -1287,6 +1330,10 @@ void ClientConnection::handleChat(shared_ptr packet) int iPos; bool displayOnGui = true; + bool replacePlayer = false; + bool replaceEntitySource = false; + bool replaceItem = false; + wstring playerDisplayName = L""; wstring sourceDisplayName = L""; @@ -1337,134 +1384,213 @@ void ClientConnection::handleChat(shared_ptr packet) break; case ChatPacket::e_ChatDeathInFire: message=app.GetString(IDS_DEATH_INFIRE); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathOnFire: message=app.GetString(IDS_DEATH_ONFIRE); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathLava: message=app.GetString(IDS_DEATH_LAVA); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathInWall: message=app.GetString(IDS_DEATH_INWALL); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathDrown: message=app.GetString(IDS_DEATH_DROWN); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathStarve: message=app.GetString(IDS_DEATH_STARVE); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathCactus: message=app.GetString(IDS_DEATH_CACTUS); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathFall: message=app.GetString(IDS_DEATH_FALL); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathOutOfWorld: message=app.GetString(IDS_DEATH_OUTOFWORLD); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathGeneric: message=app.GetString(IDS_DEATH_GENERIC); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathExplosion: message=app.GetString(IDS_DEATH_EXPLOSION); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathMagic: message=app.GetString(IDS_DEATH_MAGIC); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathAnvil: message=app.GetString(IDS_DEATH_FALLING_ANVIL); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathFallingBlock: message=app.GetString(IDS_DEATH_FALLING_TILE); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathDragonBreath: message=app.GetString(IDS_DEATH_DRAGON_BREATH); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatDeathMob: message=app.GetString(IDS_DEATH_MOB); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); - message = replaceAll(message,L"{*SOURCE*}",app.getEntityName((eINSTANCEOF)packet->m_intArgs[0])); + replacePlayer = true; + replaceEntitySource = true; break; case ChatPacket::e_ChatDeathPlayer: message=app.GetString(IDS_DEATH_PLAYER); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); - message = replaceAll(message,L"{*SOURCE*}",sourceDisplayName); + replacePlayer = true; + replaceEntitySource = true; break; case ChatPacket::e_ChatDeathArrow: message=app.GetString(IDS_DEATH_ARROW); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); - if(packet->m_intArgs[0] == eTYPE_SERVERPLAYER) - { - message = replaceAll(message,L"{*SOURCE*}",sourceDisplayName); - } - else - { - message = replaceAll(message,L"{*SOURCE*}",app.getEntityName((eINSTANCEOF)packet->m_intArgs[0])); - } + replacePlayer = true; + replaceEntitySource = true; break; case ChatPacket::e_ChatDeathFireball: message=app.GetString(IDS_DEATH_FIREBALL); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); - if(packet->m_intArgs[0] == eTYPE_SERVERPLAYER) - { - message = replaceAll(message,L"{*SOURCE*}",packet->m_stringArgs[1]); - } - else - { - message = replaceAll(message,L"{*SOURCE*}",app.getEntityName((eINSTANCEOF)packet->m_intArgs[0])); - } + replacePlayer = true; + replaceEntitySource = true; break; case ChatPacket::e_ChatDeathThrown: message=app.GetString(IDS_DEATH_THROWN); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); - if(packet->m_intArgs[0] == eTYPE_SERVERPLAYER) - { - message = replaceAll(message,L"{*SOURCE*}",sourceDisplayName); - } - else - { - message = replaceAll(message,L"{*SOURCE*}",app.getEntityName((eINSTANCEOF)packet->m_intArgs[0])); - } + replacePlayer = true; + replaceEntitySource = true; break; case ChatPacket::e_ChatDeathIndirectMagic: message=app.GetString(IDS_DEATH_INDIRECT_MAGIC); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); - if(packet->m_intArgs[0] == eTYPE_SERVERPLAYER) - { - message = replaceAll(message,L"{*SOURCE*}",sourceDisplayName); - } - else - { - message = replaceAll(message,L"{*SOURCE*}",app.getEntityName((eINSTANCEOF)packet->m_intArgs[0])); - } + replacePlayer = true; + replaceEntitySource = true; break; case ChatPacket::e_ChatDeathThorns: message=app.GetString(IDS_DEATH_THORNS); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); - if(packet->m_intArgs[0] == eTYPE_SERVERPLAYER) - { - message = replaceAll(message,L"{*SOURCE*}",sourceDisplayName); - } - else - { - message = replaceAll(message,L"{*SOURCE*}",app.getEntityName((eINSTANCEOF)packet->m_intArgs[0])); - } + replacePlayer = true; + replaceEntitySource = true; break; + + + case ChatPacket::e_ChatDeathFellAccidentLadder: + message=app.GetString(IDS_DEATH_FELL_ACCIDENT_LADDER); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathFellAccidentVines: + message=app.GetString(IDS_DEATH_FELL_ACCIDENT_VINES); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathFellAccidentWater: + message=app.GetString(IDS_DEATH_FELL_ACCIDENT_WATER); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathFellAccidentGeneric: + message=app.GetString(IDS_DEATH_FELL_ACCIDENT_GENERIC); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathFellKiller: + //message=app.GetString(IDS_DEATH_FELL_KILLER); + //replacePlayer = true; + //replaceEntitySource = true; + + // 4J Stu - The correct string for here, IDS_DEATH_FELL_KILLER is incorrect. We can't change localisation, so use a different string for now + message=app.GetString(IDS_DEATH_FALL); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathFellAssist: + message=app.GetString(IDS_DEATH_FELL_ASSIST); + replacePlayer = true; + replaceEntitySource = true; + break; + case ChatPacket::e_ChatDeathFellAssistItem: + message=app.GetString(IDS_DEATH_FELL_ASSIST_ITEM); + replacePlayer = true; + replaceEntitySource = true; + replaceItem = true; + break; + case ChatPacket::e_ChatDeathFellFinish: + message=app.GetString(IDS_DEATH_FELL_FINISH); + replacePlayer = true; + replaceEntitySource = true; + break; + case ChatPacket::e_ChatDeathFellFinishItem: + message=app.GetString(IDS_DEATH_FELL_FINISH_ITEM); + replacePlayer = true; + replaceEntitySource = true; + replaceItem = true; + break; + case ChatPacket::e_ChatDeathInFirePlayer: + message=app.GetString(IDS_DEATH_INFIRE_PLAYER); + replacePlayer = true; + replaceEntitySource = true; + break; + case ChatPacket::e_ChatDeathOnFirePlayer: + message=app.GetString(IDS_DEATH_ONFIRE_PLAYER); + replacePlayer = true; + replaceEntitySource = true; + break; + case ChatPacket::e_ChatDeathLavaPlayer: + message=app.GetString(IDS_DEATH_LAVA_PLAYER); + replacePlayer = true; + replaceEntitySource = true; + break; + case ChatPacket::e_ChatDeathDrownPlayer: + message=app.GetString(IDS_DEATH_DROWN_PLAYER); + replacePlayer = true; + replaceEntitySource = true; + break; + case ChatPacket::e_ChatDeathCactusPlayer: + message=app.GetString(IDS_DEATH_CACTUS_PLAYER); + replacePlayer = true; + replaceEntitySource = true; + break; + case ChatPacket::e_ChatDeathExplosionPlayer: + message=app.GetString(IDS_DEATH_EXPLOSION_PLAYER); + replacePlayer = true; + replaceEntitySource = true; + break; + case ChatPacket::e_ChatDeathWither: + message=app.GetString(IDS_DEATH_WITHER); + replacePlayer = true; + break; + case ChatPacket::e_ChatDeathPlayerItem: + message=app.GetString(IDS_DEATH_PLAYER_ITEM); + replacePlayer = true; + replaceEntitySource = true; + replaceItem = true; + break; + case ChatPacket::e_ChatDeathArrowItem: + message=app.GetString(IDS_DEATH_ARROW_ITEM); + replacePlayer = true; + replaceEntitySource = true; + replaceItem = true; + break; + case ChatPacket::e_ChatDeathFireballItem: + message=app.GetString(IDS_DEATH_FIREBALL_ITEM); + replacePlayer = true; + replaceEntitySource = true; + replaceItem = true; + break; + case ChatPacket::e_ChatDeathThrownItem: + message=app.GetString(IDS_DEATH_THROWN_ITEM); + replacePlayer = true; + replaceEntitySource = true; + replaceItem = true; + break; + case ChatPacket::e_ChatDeathIndirectMagicItem: + message=app.GetString(IDS_DEATH_INDIRECT_MAGIC_ITEM); + replacePlayer = true; + replaceEntitySource = true; + replaceItem = true; + break; + case ChatPacket::e_ChatPlayerEnteredEnd: message=app.GetString(IDS_PLAYER_ENTERED_END); iPos=message.find(L"%s"); @@ -1498,6 +1624,9 @@ void ClientConnection::handleChat(shared_ptr packet) case ChatPacket::e_ChatPlayerMaxWolves: message=app.GetString(IDS_MAX_WOLVES_SPAWNED); break; + case ChatPacket::e_ChatPlayerMaxBats: + message=app.GetString(IDS_MAX_BATS_SPAWNED); + break; // Breeding case ChatPacket::e_ChatPlayerMaxBredPigsSheepCows: @@ -1535,23 +1664,23 @@ void ClientConnection::handleChat(shared_ptr packet) case ChatPacket::e_ChatCommandTeleportSuccess: message=app.GetString(IDS_COMMAND_TELEPORT_SUCCESS); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; if(packet->m_intArgs[0] == eTYPE_SERVERPLAYER) { - message = replaceAll(message,L"{*DESTINATION*}",packet->m_stringArgs[1]); + message = replaceAll(message,L"{*DESTINATION*}", sourceDisplayName); } else { - message = replaceAll(message,L"{*DESTINATION*}",app.getEntityName((eINSTANCEOF)packet->m_intArgs[0])); + message = replaceAll(message,L"{*DESTINATION*}", app.getEntityName((eINSTANCEOF)packet->m_intArgs[0])); } break; case ChatPacket::e_ChatCommandTeleportMe: message=app.GetString(IDS_COMMAND_TELEPORT_ME); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; case ChatPacket::e_ChatCommandTeleportToMe: message=app.GetString(IDS_COMMAND_TELEPORT_TO_ME); - message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + replacePlayer = true; break; default: @@ -1559,30 +1688,63 @@ void ClientConnection::handleChat(shared_ptr packet) break; } + + if(replacePlayer) + { + message = replaceAll(message,L"{*PLAYER*}",playerDisplayName); + } + + if(replaceEntitySource) + { + if(packet->m_intArgs[0] == eTYPE_SERVERPLAYER) + { + message = replaceAll(message,L"{*SOURCE*}", sourceDisplayName); + } + else + { + wstring entityName; + + // Check for a custom mob name + if (packet->m_stringArgs.size() >= 2 && !packet->m_stringArgs[1].empty()) + { + entityName = packet->m_stringArgs[1]; + } + else + { + entityName = app.getEntityName((eINSTANCEOF) packet->m_intArgs[0]); + } + + message = replaceAll(message,L"{*SOURCE*}", entityName); + } + } + + if (replaceItem) + { + message = replaceAll(message,L"{*ITEM*}", packet->m_stringArgs[2]); + } + // flag that a message is a death message - bool bIsDeathMessage = (packet->m_messageType>=ChatPacket::e_ChatDeathInFire) && (packet->m_messageType<=ChatPacket::e_ChatDeathDragonBreath); + bool bIsDeathMessage = (packet->m_messageType>=ChatPacket::e_ChatDeathInFire) && (packet->m_messageType<=ChatPacket::e_ChatDeathIndirectMagicItem); if( displayOnGui ) minecraft->gui->addMessage(message,m_userIndex, bIsDeathMessage); } void ClientConnection::handleAnimate(shared_ptr packet) { - shared_ptr e = getEntity(packet->id); - if (e == NULL) return; - if (packet->action == AnimatePacket::SWING) + shared_ptr e = getEntity(packet->id); + if (e == NULL) return; + if (packet->action == AnimatePacket::SWING) { - shared_ptr player = dynamic_pointer_cast(e); - if(player != NULL) player->swing(); - } + if (e->instanceof(eTYPE_LIVINGENTITY)) dynamic_pointer_cast(e)->swing(); + } else if (packet->action == AnimatePacket::HURT) { - e->animateHurt(); - } + e->animateHurt(); + } else if (packet->action == AnimatePacket::WAKE_UP) { - shared_ptr player = dynamic_pointer_cast(e); - if(player != NULL) player->stopSleepInBed(false, false, false); - } + if (e->instanceof(eTYPE_PLAYER)) dynamic_pointer_cast(e)->stopSleepInBed(false, false, false); + } else if (packet->action == AnimatePacket::RESPAWN) { } @@ -1597,27 +1759,27 @@ void ClientConnection::handleAnimate(shared_ptr packet) shared_ptr critParticle = shared_ptr( new CritParticle(minecraft->level, e, eParticleType_magicCrit) ); critParticle->CritParticlePostConstructor(); minecraft->particleEngine->add(critParticle); - } - else if (packet->action == AnimatePacket::EAT && dynamic_pointer_cast(e) != NULL) + } + else if ( (packet->action == AnimatePacket::EAT) && e->instanceof(eTYPE_REMOTEPLAYER) ) { - } + } } void ClientConnection::handleEntityActionAtPosition(shared_ptr packet) { - shared_ptr e = getEntity(packet->id); - if (e == NULL) return; - if (packet->action == EntityActionAtPositionPacket::START_SLEEP) + shared_ptr e = getEntity(packet->id); + if (e == NULL) return; + if (packet->action == EntityActionAtPositionPacket::START_SLEEP) { - shared_ptr player = dynamic_pointer_cast(e); - player->startSleepInBed(packet->x, packet->y, packet->z); + shared_ptr player = dynamic_pointer_cast(e); + player->startSleepInBed(packet->x, packet->y, packet->z); if( player == minecraft->localplayers[m_userIndex] ) { TelemetryManager->RecordEnemyKilledOrOvercome(m_userIndex, 0, player->y, 0, 0, 0, 0, eTelemetryInGame_UseBed); } - } + } } void ClientConnection::handlePreLogin(shared_ptr packet) @@ -1660,7 +1822,7 @@ void ClientConnection::handlePreLogin(shared_ptr packet) PlayerUID playerXuid = INVALID_XUID; if( ProfileManager.IsSignedInLive(idx) ) { - ProfileManager.GetXUID(idx,&playerXuid,true); + ProfileManager.GetXUID(idx,&playerXuid,true); } if( playerXuid != INVALID_XUID ) { @@ -1690,7 +1852,7 @@ void ClientConnection::handlePreLogin(shared_ptr packet) PlayerUID playerXuid = INVALID_XUID; if( ProfileManager.IsSignedInLive(m_userIndex) ) { - ProfileManager.GetXUID(m_userIndex,&playerXuid,true); + ProfileManager.GetXUID(m_userIndex,&playerXuid,true); } if( playerXuid != INVALID_XUID ) { @@ -1718,11 +1880,11 @@ void ClientConnection::handlePreLogin(shared_ptr packet) if( ProfileManager.IsSignedInLive(idx) ) { // need to use the XUID here - PlayerUID playerXUID = INVALID_XUID; + PlayerUID playerXUID = INVALID_XUID; if( !ProfileManager.IsGuest( idx ) ) { // Guest don't have an offline XUID as they cannot play offline, so use their online one - ProfileManager.GetXUID(idx,&playerXUID,true); + ProfileManager.GetXUID(idx,&playerXUID,true); } if( ProfileManager.AreXUIDSEqual(playerXUID,packet->m_playerXuids[i]) ) localPlayer = true; } @@ -1995,8 +2157,8 @@ void ClientConnection::handlePreLogin(shared_ptr packet) app.DebugPrintf("Exiting player %d on handling Pre-Login packet due UGC privileges: %d\n", m_userIndex, reason); UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - if(!isFriendsWithHost) ui.RequestMessageBox( IDS_CANTJOIN_TITLE, IDS_NOTALLOWED_FRIENDSOFFRIENDS, uiIDA,1,m_userIndex,NULL,NULL, app.GetStringTable()); - else ui.RequestMessageBox( IDS_CANTJOIN_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL, uiIDA,1,m_userIndex,NULL,NULL, app.GetStringTable()); + if(!isFriendsWithHost) ui.RequestErrorMessage( IDS_CANTJOIN_TITLE, IDS_NOTALLOWED_FRIENDSOFFRIENDS, uiIDA,1,m_userIndex); + else ui.RequestErrorMessage( IDS_CANTJOIN_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL, uiIDA,1,m_userIndex); app.SetDisconnectReason( reason ); @@ -2029,7 +2191,9 @@ void ClientConnection::handlePreLogin(shared_ptr packet) app.DebugPrintf("Could not select texture pack %d from Pre-Login packet, requesting from host\n", packet->m_texturePackId); // 4J-PB - we need to upsell the texture pack to the player - //app.SetAction(m_userIndex,eAppAction_TexturePackRequired); +#if defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ + app.SetAction(m_userIndex,eAppAction_TexturePackRequired); +#endif // Let the player go into the game, and we'll check that they are using the right texture pack when in } } @@ -2039,12 +2203,12 @@ void ClientConnection::handlePreLogin(shared_ptr packet) Minecraft::GetInstance()->progressRenderer->progressStagePercentage((eCCPreLoginReceived * 100)/ (eCCConnected)); } // need to use the XUID here - PlayerUID offlineXUID = INVALID_XUID; + PlayerUID offlineXUID = INVALID_XUID; PlayerUID onlineXUID = INVALID_XUID; if( ProfileManager.IsSignedInLive(m_userIndex) ) { // Guest don't have an offline XUID as they cannot play offline, so use their online one - ProfileManager.GetXUID(m_userIndex,&onlineXUID,true); + ProfileManager.GetXUID(m_userIndex,&onlineXUID,true); } #ifdef __PSVITA__ if(CGameNetworkManager::usingAdhocMode() && onlineXUID.getOnlineID()[0] == 0) @@ -2060,7 +2224,7 @@ void ClientConnection::handlePreLogin(shared_ptr packet) #endif { // All other players we use their offline XUID so that they can play the game offline - ProfileManager.GetXUID(m_userIndex,&offlineXUID,false); + ProfileManager.GetXUID(m_userIndex,&offlineXUID,false); } BOOL allAllowed, friendsAllowed; ProfileManager.AllowedPlayerCreatedContent(m_userIndex,true,&allAllowed,&friendsAllowed); @@ -2074,25 +2238,25 @@ void ClientConnection::handlePreLogin(shared_ptr packet) } #else // 4J - removed - if (packet->loginKey.equals("-")) { - send(new LoginPacket(minecraft->user.name, SharedConstants.NETWORK_PROTOCOL_VERSION)); - } else { - try { - URL url = new URL("http://www.minecraft->net/game/joinserver.jsp?user=" + minecraft->user.name + "&sessionId=" + minecraft->user.sessionId + "&serverId=" + packet->loginKey); - BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream())); - String msg = br.readLine(); - br.close(); + if (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 +2264,8 @@ void ClientConnection::close() { // If it's already done, then we don't need to do anything here. And in fact trying to do something could cause a crash if(done) return; - done = true; - connection->flush(); + done = true; + connection->flush(); connection->close(DisconnectPacket::eDisconnect_Closed); } @@ -2113,7 +2277,7 @@ void ClientConnection::handleAddMob(shared_ptr packet) float yRot = packet->yRot * 360 / 256.0f; float xRot = packet->xRot * 360 / 256.0f; - shared_ptr mob = dynamic_pointer_cast(EntityIO::newById(packet->type, level)); + shared_ptr mob = dynamic_pointer_cast(EntityIO::newById(packet->type, level)); mob->xp = packet->x; mob->yp = packet->y; mob->zp = packet->z; @@ -2160,43 +2324,83 @@ void ClientConnection::handleAddMob(shared_ptr packet) void ClientConnection::handleSetTime(shared_ptr packet) { - minecraft->level->setTime(packet->time); + minecraft->level->setGameTime(packet->gameTime); + minecraft->level->setDayTime(packet->dayTime); } void ClientConnection::handleSetSpawn(shared_ptr packet) { - //minecraft->player->setRespawnPosition(new Pos(packet->x, packet->y, packet->z)); - minecraft->localplayers[m_userIndex]->setRespawnPosition(new Pos(packet->x, packet->y, packet->z)); - minecraft->level->getLevelData()->setSpawn(packet->x, packet->y, packet->z); + //minecraft->player->setRespawnPosition(new Pos(packet->x, packet->y, packet->z)); + minecraft->localplayers[m_userIndex]->setRespawnPosition(new Pos(packet->x, packet->y, packet->z), true); + minecraft->level->getLevelData()->setSpawn(packet->x, packet->y, packet->z); } -void ClientConnection::handleRidePacket(shared_ptr packet) +void ClientConnection::handleEntityLinkPacket(shared_ptr packet) { - shared_ptr rider = getEntity(packet->riderId); - shared_ptr ridden = getEntity(packet->riddenId); + shared_ptr sourceEntity = getEntity(packet->sourceId); + shared_ptr destEntity = getEntity(packet->destId); - shared_ptr boat = dynamic_pointer_cast(ridden); - //if (packet->riderId == minecraft->player->entityId) rider = minecraft->player; - if (packet->riderId == minecraft->localplayers[m_userIndex]->entityId) + // 4J: If the destination entity couldn't be found, defer handling of this packet + // This was added to support leashing (the entity link packet is sent before the add entity packet) + if (destEntity == NULL && packet->destId >= 0) { - rider = minecraft->localplayers[m_userIndex]; + // We don't handle missing source entities because it shouldn't happen + assert(!(sourceEntity == NULL && packet->sourceId >= 0)); - if (boat) boat->setDoLerp(false); + deferredEntityLinkPackets.push_back(DeferredEntityLinkPacket(packet)); + return; } - else if (boat) + + if (packet->type == SetEntityLinkPacket::RIDING) { - boat->setDoLerp(true); - } - if (rider == NULL) return; + bool displayMountMessage = false; + if (packet->sourceId == Minecraft::GetInstance()->localplayers[m_userIndex].get()->entityId) + { + sourceEntity = Minecraft::GetInstance()->localplayers[m_userIndex]; - rider->ride(ridden); + if (destEntity != NULL && destEntity->instanceof(eTYPE_BOAT)) (dynamic_pointer_cast(destEntity))->setDoLerp(false); + + displayMountMessage = (sourceEntity->riding == NULL && destEntity != NULL); + } + else if (destEntity != NULL && destEntity->instanceof(eTYPE_BOAT)) + { + (dynamic_pointer_cast(destEntity))->setDoLerp(true); + } + + if (sourceEntity == NULL) return; + + sourceEntity->ride(destEntity); + + // 4J TODO: pretty sure this message is a tooltip so not needed + /* + if (displayMountMessage) { + Options options = minecraft.options; + minecraft.gui.setOverlayMessage(I18n.get("mount.onboard", Options.getTranslatedKeyMessage(options.keySneak.key)), false); + } + */ + } + else if (packet->type == SetEntityLinkPacket::LEASH) + { + if ( (sourceEntity != NULL) && sourceEntity->instanceof(eTYPE_MOB) ) + { + if (destEntity != NULL) + { + + (dynamic_pointer_cast(sourceEntity))->setLeashedTo(destEntity, false); + } + else + { + (dynamic_pointer_cast(sourceEntity))->dropLeash(false, false); + } + } + } } void ClientConnection::handleEntityEvent(shared_ptr packet) { - shared_ptr e = getEntity(packet->entityId); - if (e != NULL) e->handleEntityEvent(packet->eventId); + shared_ptr e = getEntity(packet->entityId); + if (e != NULL) e->handleEntityEvent(packet->eventId); } shared_ptr ClientConnection::getEntity(int entityId) @@ -2326,9 +2530,8 @@ void ClientConnection::handleTextureAndGeometry(shared_ptr packet) { shared_ptr e = getEntity(packet->id); - if (e == NULL) return; + if ( (e == NULL) || !e->instanceof(eTYPE_PLAYER) ) return; shared_ptr player = dynamic_pointer_cast(e); - if( e == NULL) return; bool isLocalPlayer = false; for( int i = 0; i < XUSER_MAX_COUNT; i++ ) @@ -2426,11 +2629,11 @@ void ClientConnection::handleTextureAndGeometryChange(shared_ptr packet) { - //if (packet->dimension != minecraft->player->dimension) + //if (packet->dimension != minecraft->player->dimension) if( packet->dimension != minecraft->localplayers[m_userIndex]->dimension || packet->mapSeed != minecraft->localplayers[m_userIndex]->level->getSeed() ) { int oldDimension = minecraft->localplayers[m_userIndex]->dimension; - started = false; + started = false; // Remove client connection from this level level->removeClientConnection(this, false); @@ -2474,7 +2677,7 @@ void ClientConnection::handleRespawn(shared_ptr packet) //minecraft->player->dimension = packet->dimension; minecraft->localplayers[m_userIndex]->dimension = packet->dimension; - //minecraft->setScreen(new ReceivingLevelScreen(this)); + //minecraft->setScreen(new ReceivingLevelScreen(this)); // minecraft->addPendingLocalConnection(m_userIndex, this); #ifdef _XBOX @@ -2524,15 +2727,15 @@ void ClientConnection::handleRespawn(shared_ptr packet) } app.SetAction( m_userIndex, eAppAction_WaitForDimensionChangeComplete); - } + } - //minecraft->respawnPlayer(minecraft->player->GetXboxPad(),true, packet->dimension); + //minecraft->respawnPlayer(minecraft->player->GetXboxPad(),true, packet->dimension); // Wrap respawnPlayer call up in code to set & restore the player/gamemode etc. as some things // in there assume that we are set up for the player that the respawn is coming in for int oldIndex = minecraft->getLocalPlayerIdx(); minecraft->setLocalPlayerIdx(m_userIndex); - minecraft->respawnPlayer(minecraft->localplayers[m_userIndex]->GetXboxPad(),packet->dimension,packet->m_newEntityId); + minecraft->respawnPlayer(minecraft->localplayers[m_userIndex]->GetXboxPad(),packet->dimension,packet->m_newEntityId); ((MultiPlayerGameMode *) minecraft->localgameModes[m_userIndex])->setLocalMode(packet->playerGameType); minecraft->setLocalPlayerIdx(oldIndex); } @@ -2543,7 +2746,7 @@ void ClientConnection::handleExplosion(shared_ptr packet) { //app.DebugPrintf("Received ExplodePacket with explosion data\n"); PIXBeginNamedEvent(0,"Handling explosion"); - Explosion *e = new Explosion(minecraft->level, nullptr, packet->x, packet->y, packet->z, packet->r); + Explosion *e = new Explosion(minecraft->level, nullptr, packet->x, packet->y, packet->z, packet->r); PIXBeginNamedEvent(0,"Finalizing"); // Fix for #81758 - TCR 006 BAS Non-Interactive Pause: TU9: Performance: Gameplay: After detonating bunch of TNT, game enters unresponsive state for couple of seconds. @@ -2575,9 +2778,38 @@ void ClientConnection::handleContainerOpen(shared_ptr packe shared_ptr player = minecraft->localplayers[m_userIndex]; switch(packet->type) { + case ContainerOpenPacket::BONUS_CHEST: + case ContainerOpenPacket::LARGE_CHEST: + case ContainerOpenPacket::ENDER_CHEST: case ContainerOpenPacket::CONTAINER: + case ContainerOpenPacket::MINECART_CHEST: { - if( player->openContainer(shared_ptr( new SimpleContainer(packet->title, packet->size) ))) + int chestString; + switch (packet->type) + { + case ContainerOpenPacket::MINECART_CHEST: chestString = IDS_ITEM_MINECART; break; + case ContainerOpenPacket::BONUS_CHEST: chestString = IDS_BONUS_CHEST; break; + case ContainerOpenPacket::LARGE_CHEST: chestString = IDS_CHEST_LARGE; break; + case ContainerOpenPacket::ENDER_CHEST: chestString = IDS_TILE_ENDERCHEST; break; + case ContainerOpenPacket::CONTAINER: chestString = IDS_CHEST; break; + default: assert(false); chestString = -1; break; + } + + if( player->openContainer(shared_ptr( new SimpleContainer(chestString, packet->title, packet->customName, packet->size) ))) + { + player->containerMenu->containerId = packet->containerId; + } + else + { + failed = true; + } + } + break; + case ContainerOpenPacket::HOPPER: + { + shared_ptr hopper = shared_ptr(new HopperTileEntity()); + if (packet->customName) hopper->setCustomName(packet->title); + if(player->openHopper(hopper)) { player->containerMenu->containerId = packet->containerId; } @@ -2589,7 +2821,9 @@ void ClientConnection::handleContainerOpen(shared_ptr packe break; case ContainerOpenPacket::FURNACE: { - if( player->openFurnace(shared_ptr( new FurnaceTileEntity() )) ) + shared_ptr furnace = shared_ptr(new FurnaceTileEntity()); + if (packet->customName) furnace->setCustomName(packet->title); + if(player->openFurnace(furnace)) { player->containerMenu->containerId = packet->containerId; } @@ -2601,7 +2835,10 @@ void ClientConnection::handleContainerOpen(shared_ptr packe break; case ContainerOpenPacket::BREWING_STAND: { - if( player->openBrewingStand(shared_ptr( new BrewingStandTileEntity() )) ) + shared_ptr brewingStand = shared_ptr(new BrewingStandTileEntity()); + if (packet->customName) brewingStand->setCustomName(packet->title); + + if( player->openBrewingStand(brewingStand)) { player->containerMenu->containerId = packet->containerId; } @@ -2611,9 +2848,27 @@ void ClientConnection::handleContainerOpen(shared_ptr packe } } break; + case ContainerOpenPacket::DROPPER: + { + shared_ptr dropper = shared_ptr(new DropperTileEntity()); + if (packet->customName) dropper->setCustomName(packet->title); + + if( player->openTrap(dropper)) + { + player->containerMenu->containerId = packet->containerId; + } + else + { + failed = true; + } + } + break; case ContainerOpenPacket::TRAP: { - if( player->openTrap(shared_ptr( new DispenserTileEntity() )) ) + shared_ptr dispenser = shared_ptr(new DispenserTileEntity()); + if (packet->customName) dispenser->setCustomName(packet->title); + + if( player->openTrap(dispenser)) { player->containerMenu->containerId = packet->containerId; } @@ -2637,7 +2892,7 @@ void ClientConnection::handleContainerOpen(shared_ptr packe break; case ContainerOpenPacket::ENCHANTMENT: { - if( player->startEnchanting(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)) ) + if( player->startEnchanting(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z), packet->customName ? packet->title : L"") ) { player->containerMenu->containerId = packet->containerId; } @@ -2649,9 +2904,9 @@ void ClientConnection::handleContainerOpen(shared_ptr packe break; case ContainerOpenPacket::TRADER_NPC: { - shared_ptr csm = shared_ptr(new ClientSideMerchant(player,packet->title)); + shared_ptr csm = shared_ptr(new ClientSideMerchant(player, packet->title)); csm->createContainer(); - if(player->openTrading(csm)) + if(player->openTrading(csm, packet->customName ? packet->title : L"")) { player->containerMenu->containerId = packet->containerId; } @@ -2661,6 +2916,21 @@ void ClientConnection::handleContainerOpen(shared_ptr packe } } break; + case ContainerOpenPacket::BEACON: + { + shared_ptr beacon = shared_ptr(new BeaconTileEntity()); + if (packet->customName) beacon->setCustomName(packet->title); + + if(player->openBeacon(beacon)) + { + player->containerMenu->containerId = packet->containerId; + } + else + { + failed = true; + } + } + break; case ContainerOpenPacket::REPAIR_TABLE: { if(player->startRepairing(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z))) @@ -2673,7 +2943,42 @@ void ClientConnection::handleContainerOpen(shared_ptr packe } } break; - }; + case ContainerOpenPacket::HORSE: + { + shared_ptr entity = dynamic_pointer_cast( getEntity(packet->entityId) ); + int iTitle = IDS_CONTAINER_ANIMAL; + switch(entity->getType()) + { + case EntityHorse::TYPE_DONKEY: + iTitle = IDS_DONKEY; + break; + case EntityHorse::TYPE_MULE: + iTitle = IDS_MULE; + break; + }; + if(player->openHorseInventory(dynamic_pointer_cast(entity), shared_ptr(new AnimalChest(iTitle, packet->title, packet->customName, packet->size)))) + { + player->containerMenu->containerId = packet->containerId; + } + else + { + failed = true; + } + } + break; + case ContainerOpenPacket::FIREWORKS: + { + if( player->openFireworks(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)) ) + { + player->containerMenu->containerId = packet->containerId; + } + else + { + failed = true; + } + } + break; + } if(failed) { @@ -2694,13 +2999,13 @@ void ClientConnection::handleContainerOpen(shared_ptr packe void ClientConnection::handleContainerSetSlot(shared_ptr packet) { shared_ptr player = minecraft->localplayers[m_userIndex]; - if (packet->containerId == AbstractContainerMenu::CONTAINER_ID_CARRIED ) + if (packet->containerId == AbstractContainerMenu::CONTAINER_ID_CARRIED ) { - player->inventory->setCarried(packet->item); - } + player->inventory->setCarried(packet->item); + } else { - if (packet->containerId == AbstractContainerMenu::CONTAINER_ID_INVENTORY) + if (packet->containerId == AbstractContainerMenu::CONTAINER_ID_INVENTORY) { // 4J Stu - Reworked a bit to fix a bug where things being collected while the creative menu was up replaced items in the creative menu if(packet->slot >= 36 && packet->slot < 36 + 9) @@ -2718,72 +3023,90 @@ void ClientConnection::handleContainerSetSlot(shared_ptr } else if (packet->containerId == player->containerMenu->containerId) { - player->containerMenu->setItem(packet->slot, packet->item); - } - } + player->containerMenu->setItem(packet->slot, packet->item); + } + } } void ClientConnection::handleContainerAck(shared_ptr packet) { shared_ptr player = minecraft->localplayers[m_userIndex]; - AbstractContainerMenu *menu = NULL; - if (packet->containerId == AbstractContainerMenu::CONTAINER_ID_INVENTORY) + AbstractContainerMenu *menu = NULL; + if (packet->containerId == AbstractContainerMenu::CONTAINER_ID_INVENTORY) { - menu = player->inventoryMenu; - } + menu = player->inventoryMenu; + } else if (packet->containerId == player->containerMenu->containerId) { - menu = player->containerMenu; - } - if (menu != NULL) + menu = player->containerMenu; + } + if (menu != NULL) { - if (!packet->accepted) + if (!packet->accepted) { - send( shared_ptr( new ContainerAckPacket(packet->containerId, packet->uid, true) )); - } - } + send( shared_ptr( new ContainerAckPacket(packet->containerId, packet->uid, true) )); + } + } } void ClientConnection::handleContainerContent(shared_ptr packet) { shared_ptr player = minecraft->localplayers[m_userIndex]; - if (packet->containerId == AbstractContainerMenu::CONTAINER_ID_INVENTORY) + if (packet->containerId == AbstractContainerMenu::CONTAINER_ID_INVENTORY) { - player->inventoryMenu->setAll(&packet->items); - } + player->inventoryMenu->setAll(&packet->items); + } else if (packet->containerId == player->containerMenu->containerId) { - player->containerMenu->setAll(&packet->items); - } + player->containerMenu->setAll(&packet->items); + } +} + +void ClientConnection::handleTileEditorOpen(shared_ptr packet) +{ + shared_ptr tileEntity = level->getTileEntity(packet->x, packet->y, packet->z); + if (tileEntity != NULL) + { + minecraft->localplayers[m_userIndex]->openTextEdit(tileEntity); + } + else if (packet->editorType == TileEditorOpenPacket::SIGN) + { + shared_ptr localSignDummy = shared_ptr(new SignTileEntity()); + localSignDummy->setLevel(level); + localSignDummy->x = packet->x; + localSignDummy->y = packet->y; + localSignDummy->z = packet->z; + minecraft->player->openTextEdit(localSignDummy); + } } void ClientConnection::handleSignUpdate(shared_ptr packet) { app.DebugPrintf("ClientConnection::handleSignUpdate - "); - if (minecraft->level->hasChunkAt(packet->x, packet->y, packet->z)) + if (minecraft->level->hasChunkAt(packet->x, packet->y, packet->z)) { - shared_ptr te = minecraft->level->getTileEntity(packet->x, packet->y, packet->z); + shared_ptr te = minecraft->level->getTileEntity(packet->x, packet->y, packet->z); // 4J-PB - on a client connecting, the line below fails - if (dynamic_pointer_cast(te) != NULL) + if (dynamic_pointer_cast(te) != NULL) { - shared_ptr ste = dynamic_pointer_cast(te); - for (int i = 0; i < MAX_SIGN_LINES; i++) + shared_ptr ste = dynamic_pointer_cast(te); + for (int i = 0; i < MAX_SIGN_LINES; i++) { ste->SetMessage(i,packet->lines[i]); - } + } app.DebugPrintf("verified = %d\tCensored = %d\n",packet->m_bVerified,packet->m_bCensored); ste->SetVerified(packet->m_bVerified); ste->SetCensored(packet->m_bCensored); - ste->setChanged(); - } + ste->setChanged(); + } else { app.DebugPrintf("dynamic_pointer_cast(te) == NULL\n"); } - } + } else { app.DebugPrintf("hasChunkAt failed\n"); @@ -2802,14 +3125,14 @@ void ClientConnection::handleTileEntityData(shared_ptr pac { dynamic_pointer_cast(te)->load(packet->tag); } - //else if (packet.type == TileEntityDataPacket.TYPE_ADV_COMMAND && (te instanceof CommandBlockEntity)) - //{ - // ((CommandBlockEntity) te).load(packet.tag); - //} - //else if (packet.type == TileEntityDataPacket.TYPE_BEACON && (te instanceof BeaconTileEntity)) - //{ - // ((BeaconTileEntity) te).load(packet.tag); - //} + else if (packet->type == TileEntityDataPacket::TYPE_ADV_COMMAND && dynamic_pointer_cast(te) != NULL) + { + dynamic_pointer_cast(te)->load(packet->tag); + } + else if (packet->type == TileEntityDataPacket::TYPE_BEACON && dynamic_pointer_cast(te) != NULL) + { + dynamic_pointer_cast(te)->load(packet->tag); + } else if (packet->type == TileEntityDataPacket::TYPE_SKULL && dynamic_pointer_cast(te) != NULL) { dynamic_pointer_cast(te)->load(packet->tag); @@ -2820,26 +3143,26 @@ void ClientConnection::handleTileEntityData(shared_ptr pac void ClientConnection::handleContainerSetData(shared_ptr packet) { - onUnhandledPacket(packet); - if (minecraft->localplayers[m_userIndex]->containerMenu != NULL && minecraft->localplayers[m_userIndex]->containerMenu->containerId == packet->containerId) + onUnhandledPacket(packet); + if (minecraft->localplayers[m_userIndex]->containerMenu != NULL && minecraft->localplayers[m_userIndex]->containerMenu->containerId == packet->containerId) { - minecraft->localplayers[m_userIndex]->containerMenu->setData(packet->id, packet->value); - } + minecraft->localplayers[m_userIndex]->containerMenu->setData(packet->id, packet->value); + } } void ClientConnection::handleSetEquippedItem(shared_ptr packet) { - shared_ptr entity = getEntity(packet->entity); - if (entity != NULL) + shared_ptr entity = getEntity(packet->entity); + if (entity != NULL) { // 4J Stu - Brought forward change from 1.3 to fix #64688 - Customer Encountered: TU7: Content: Art: Aura of enchanted item is not displayed for other players in online game - entity->setEquippedSlot(packet->slot, packet->getItem() ); - } + entity->setEquippedSlot(packet->slot, packet->getItem() ); + } } void ClientConnection::handleContainerClose(shared_ptr packet) { - minecraft->localplayers[m_userIndex]->closeContainer(); + minecraft->localplayers[m_userIndex]->clientSideCloseContainer(); } void ClientConnection::handleTileEvent(shared_ptr packet) @@ -2861,24 +3184,24 @@ bool ClientConnection::canHandleAsyncPackets() void ClientConnection::handleGameEvent(shared_ptr gameEventPacket) { - int event = gameEventPacket->_event; + int event = gameEventPacket->_event; int param = gameEventPacket->param; - if (event >= 0 && event < GameEventPacket::EVENT_LANGUAGE_ID_LENGTH) + if (event >= 0 && event < GameEventPacket::EVENT_LANGUAGE_ID_LENGTH) { - if (GameEventPacket::EVENT_LANGUAGE_ID[event] > 0) // 4J - was NULL check + if (GameEventPacket::EVENT_LANGUAGE_ID[event] > 0) // 4J - was NULL check { minecraft->localplayers[m_userIndex]->displayClientMessage(GameEventPacket::EVENT_LANGUAGE_ID[event]); - } - } - if (event == GameEventPacket::START_RAINING) + } + } + if (event == GameEventPacket::START_RAINING) { - level->getLevelData()->setRaining(true); - level->setRainLevel(1); - } + level->getLevelData()->setRaining(true); + level->setRainLevel(1); + } else if (event == GameEventPacket::STOP_RAINING) { - level->getLevelData()->setRaining(false); - level->setRainLevel(0); + level->getLevelData()->setRaining(false); + level->setRainLevel(0); } else if (event == GameEventPacket::CHANGE_GAME_MODE) { @@ -2923,6 +3246,11 @@ void ClientConnection::handleGameEvent(shared_ptr gameEventPack { if(!g_NetworkManager.IsHost() ) app.SetGameStarted(true); } + else if ( event == GameEventPacket::SUCCESSFUL_BOW_HIT ) + { + shared_ptr player = minecraft->localplayers[m_userIndex]; + level->playLocalSound(player->x, player->y + player->getHeadHeight(), player->z, eSoundType_RANDOM_BOW_HIT , 0.18f, 0.45f, false); + } } void ClientConnection::handleComplexItemData(shared_ptr packet) @@ -2941,26 +3269,27 @@ void ClientConnection::handleComplexItemData(shared_ptr p void ClientConnection::handleLevelEvent(shared_ptr packet) { - switch(packet->type) + if (packet->type == LevelEvent::SOUND_DRAGON_DEATH) { - case LevelEvent::SOUND_DRAGON_DEATH: + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) { - Minecraft *pMinecraft = Minecraft::GetInstance(); - for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + if(minecraft->localplayers[i] != NULL && minecraft->localplayers[i]->level != NULL && minecraft->localplayers[i]->level->dimension->id == 1) { - if(pMinecraft->localplayers[i] != NULL && pMinecraft->localplayers[i]->level != NULL && pMinecraft->localplayers[i]->level->dimension->id == 1) - { - pMinecraft->localplayers[i]->awardStat(GenericStats::completeTheEnd(),GenericStats::param_noArgs()); - } + minecraft->localplayers[i]->awardStat(GenericStats::completeTheEnd(),GenericStats::param_noArgs()); } } - minecraft->level->levelEvent(packet->type, packet->x, packet->y, packet->z, packet->data); - - break; - default: - 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 +3300,21 @@ void ClientConnection::handleAwardStat(shared_ptr packet) void ClientConnection::handleUpdateMobEffect(shared_ptr packet) { shared_ptr e = getEntity(packet->entityId); - if (e == NULL || dynamic_pointer_cast(e) == NULL) return; + if ( (e == NULL) || !e->instanceof(eTYPE_LIVINGENTITY) ) return; - ( dynamic_pointer_cast(e) )->addEffect(new MobEffectInstance(packet->effectId, packet->effectDurationTicks, packet->effectAmplifier)); + //( dynamic_pointer_cast(e) )->addEffect(new MobEffectInstance(packet->effectId, packet->effectDurationTicks, packet->effectAmplifier)); + + MobEffectInstance *mobEffectInstance = new MobEffectInstance(packet->effectId, packet->effectDurationTicks, packet->effectAmplifier); + mobEffectInstance->setNoCounter(packet->isSuperLongDuration()); + dynamic_pointer_cast(e)->addEffect(mobEffectInstance); } void ClientConnection::handleRemoveMobEffect(shared_ptr packet) { shared_ptr e = getEntity(packet->entityId); - if (e == NULL || dynamic_pointer_cast(e) == NULL) return; + if ( (e == NULL) || !e->instanceof(eTYPE_LIVINGENTITY) ) return; - ( dynamic_pointer_cast(e) )->removeEffectNoUpdate(packet->effectId); + ( dynamic_pointer_cast(e) )->removeEffectNoUpdate(packet->effectId); } bool ClientConnection::isServerPacketListener() @@ -3006,7 +3339,7 @@ void ClientConnection::handlePlayerInfo(shared_ptr packet) app.UpdatePlayerInfo(packet->m_networkSmallId, packet->m_playerColourIndex, packet->m_playerPrivileges); shared_ptr entity = getEntity(packet->m_entityId); - if(entity != NULL && entity->GetType() == eTYPE_PLAYER) + if(entity != NULL && entity->instanceof(eTYPE_PLAYER)) { shared_ptr player = dynamic_pointer_cast(entity); player->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_All, packet->m_playerPrivileges); @@ -3154,11 +3487,12 @@ void ClientConnection::handlePlayerAbilities(shared_ptr p player->abilities.invulnerable = playerAbilitiesPacket->isInvulnerable(); player->abilities.mayfly = playerAbilitiesPacket->canFly(); player->abilities.setFlyingSpeed(playerAbilitiesPacket->getFlyingSpeed()); + player->abilities.setWalkingSpeed(playerAbilitiesPacket->getWalkingSpeed()); } void ClientConnection::handleSoundEvent(shared_ptr packet) { - minecraft->level->playLocalSound(packet->getX(), packet->getY(), packet->getZ(), packet->getSound(), packet->getVolume(), packet->getPitch()); + minecraft->level->playLocalSound(packet->getX(), packet->getY(), packet->getZ(), packet->getSound(), packet->getVolume(), packet->getPitch(), false); } void ClientConnection::handleCustomPayload(shared_ptr customPayloadPacket) @@ -3297,7 +3631,7 @@ int ClientConnection::HostDisconnectReturned(void *pParam,int iPad,C4JStorage::E UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&ClientConnection::ExitGameAndSaveReturned,NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&ClientConnection::ExitGameAndSaveReturned,NULL); } else #else @@ -3312,7 +3646,7 @@ int ClientConnection::HostDisconnectReturned(void *pParam,int iPad,C4JStorage::E UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&ClientConnection::ExitGameAndSaveReturned,NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&ClientConnection::ExitGameAndSaveReturned,NULL); } else #endif @@ -3360,3 +3694,208 @@ wstring ClientConnection::GetDisplayNameByGamertag(wstring gamertag) return gamertag; #endif } + +void ClientConnection::handleAddObjective(shared_ptr packet) +{ +#if 0 + Scoreboard scoreboard = level->getScoreboard(); + + if (packet->method == SetObjectivePacket::METHOD_ADD) + { + Objective objective = scoreboard->addObjective(packet->objectiveName, ObjectiveCriteria::DUMMY); + objective->setDisplayName(packet->displayName); + } + else + { + Objective objective = scoreboard->getObjective(packet->objectiveName); + + if (packet->method == SetObjectivePacket::METHOD_REMOVE) + { + scoreboard->removeObjective(objective); + } + else if (packet->method == SetObjectivePacket::METHOD_CHANGE) + { + objective->setDisplayName(packet->displayName); + } + } +#endif +} + +void ClientConnection::handleSetScore(shared_ptr packet) +{ +#if 0 + Scoreboard scoreboard = level->getScoreboard(); + Objective objective = scoreboard->getObjective(packet->objectiveName); + + if (packet->method == SetScorePacket::METHOD_CHANGE) + { + Score score = scoreboard->getPlayerScore(packet->owner, objective); + score->setScore(packet->score); + } + else if (packet->method == SetScorePacket::METHOD_REMOVE) + { + scoreboard->resetPlayerScore(packet->owner); + } +#endif +} + +void ClientConnection::handleSetDisplayObjective(shared_ptr packet) +{ +#if 0 + Scoreboard scoreboard = level->getScoreboard(); + + if (packet->objectiveName->length() == 0) + { + scoreboard->setDisplayObjective(packet->slot, null); + } + else + { + Objective objective = scoreboard->getObjective(packet->objectiveName); + scoreboard->setDisplayObjective(packet->slot, objective); + } +#endif +} + +void ClientConnection::handleSetPlayerTeamPacket(shared_ptr packet) +{ +#if 0 + Scoreboard scoreboard = level->getScoreboard(); + PlayerTeam *team; + + if (packet->method == SetPlayerTeamPacket::METHOD_ADD) + { + team = scoreboard->addPlayerTeam(packet->name); + } + else + { + team = scoreboard->getPlayerTeam(packet->name); + } + + if (packet->method == SetPlayerTeamPacket::METHOD_ADD || packet->method == SetPlayerTeamPacket::METHOD_CHANGE) + { + team->setDisplayName(packet->displayName); + team->setPrefix(packet->prefix); + team->setSuffix(packet->suffix); + team->unpackOptions(packet->options); + } + + if (packet->method == SetPlayerTeamPacket::METHOD_ADD || packet->method == SetPlayerTeamPacket::METHOD_JOIN) + { + for (int i = 0; i < packet->players.size(); i++) + { + scoreboard->addPlayerToTeam(packet->players[i], team); + } + } + + if (packet->method == SetPlayerTeamPacket::METHOD_LEAVE) + { + for (int i = 0; i < packet->players.size(); i++) + { + scoreboard->removePlayerFromTeam(packet->players[i], team); + } + } + + if (packet->method == SetPlayerTeamPacket::METHOD_REMOVE) + { + scoreboard->removePlayerTeam(team); + } +#endif +} + +void ClientConnection::handleParticleEvent(shared_ptr packet) +{ + for (int i = 0; i < packet->getCount(); i++) + { + double xVarience = random->nextGaussian() * packet->getXDist(); + double yVarience = random->nextGaussian() * packet->getYDist(); + double zVarience = random->nextGaussian() * packet->getZDist(); + double xa = random->nextGaussian() * packet->getMaxSpeed(); + double ya = random->nextGaussian() * packet->getMaxSpeed(); + double za = random->nextGaussian() * packet->getMaxSpeed(); + + // TODO: determine particle ID from name + assert(0); + ePARTICLE_TYPE particleId = eParticleType_heart; + + level->addParticle(particleId, packet->getX() + xVarience, packet->getY() + yVarience, packet->getZ() + zVarience, xa, ya, za); + } +} + +void ClientConnection::handleUpdateAttributes(shared_ptr packet) +{ + shared_ptr entity = getEntity(packet->getEntityId()); + if (entity == NULL) return; + + if ( !entity->instanceof(eTYPE_LIVINGENTITY) ) + { + // Entity is not a living entity! + assert(0); + } + + BaseAttributeMap *attributes = (dynamic_pointer_cast(entity))->getAttributes(); + unordered_set attributeSnapshots = packet->getValues(); + for (AUTO_VAR(it,attributeSnapshots.begin()); it != attributeSnapshots.end(); ++it) + { + UpdateAttributesPacket::AttributeSnapshot *attribute = *it; + AttributeInstance *instance = attributes->getInstance(attribute->getId()); + + if (instance == NULL) + { + // 4J - TODO: revisit, not familiar with the attribute system, why are we passing in MIN_NORMAL (Java's smallest non-zero value conforming to IEEE Standard 754 (?)) and MAX_VALUE + instance = attributes->registerAttribute(new RangedAttribute(attribute->getId(), 0, Double::MIN_NORMAL, Double::MAX_VALUE)); + } + + instance->setBaseValue(attribute->getBase()); + instance->removeModifiers(); + + unordered_set *modifiers = attribute->getModifiers(); + + for (AUTO_VAR(it2,modifiers->begin()); it2 != modifiers->end(); ++it2) + { + AttributeModifier* modifier = *it2; + instance->addModifier(new AttributeModifier(modifier->getId(), modifier->getAmount(), modifier->getOperation() ) ); + } + } +} + +// 4J: Check for deferred entity link packets related to this entity ID and handle them +void ClientConnection::checkDeferredEntityLinkPackets(int newEntityId) +{ + if (deferredEntityLinkPackets.empty()) return; + + for (int i = 0; i < deferredEntityLinkPackets.size(); i++) + { + DeferredEntityLinkPacket *deferred = &deferredEntityLinkPackets[i]; + + bool remove = false; + + // Only consider recently deferred packets + int tickInterval = GetTickCount() - deferred->m_recievedTick; + if (tickInterval < MAX_ENTITY_LINK_DEFERRAL_INTERVAL) + { + // Note: we assume it's the destination entity + if (deferred->m_packet->destId == newEntityId) + { + handleEntityLinkPacket(deferred->m_packet); + remove = true; + } + } + else + { + // This is an old packet, remove (shouldn't really come up but seems prudent) + remove = true; + } + + if (remove) + { + deferredEntityLinkPackets.erase(deferredEntityLinkPackets.begin() + i); + i--; + } + } +} + +ClientConnection::DeferredEntityLinkPacket::DeferredEntityLinkPacket(shared_ptr packet) +{ + m_recievedTick = GetTickCount(); + m_packet = packet; +} \ No newline at end of file diff --git a/Minecraft.Client/ClientConnection.h b/Minecraft.Client/ClientConnection.h index 2ce46ce0..a80c10f7 100644 --- a/Minecraft.Client/ClientConnection.h +++ b/Minecraft.Client/ClientConnection.h @@ -17,6 +17,7 @@ private: eCCLoginReceived, eCCConnected }; + private: bool done; Connection *connection; @@ -58,6 +59,7 @@ public: virtual void handleSetEntityData(shared_ptr packet); virtual void handleAddPlayer(shared_ptr packet); virtual void handleTeleportEntity(shared_ptr packet); + virtual void handleSetCarriedItem(shared_ptr packet); virtual void handleMoveEntity(shared_ptr packet); virtual void handleRotateMob(shared_ptr packet); virtual void handleMoveEntitySmall(shared_ptr packet); @@ -86,7 +88,7 @@ public: virtual void handleAddMob(shared_ptr packet); virtual void handleSetTime(shared_ptr packet); virtual void handleSetSpawn(shared_ptr packet); - virtual void handleRidePacket(shared_ptr packet); + virtual void handleEntityLinkPacket(shared_ptr packet); virtual void handleEntityEvent(shared_ptr packet); private: shared_ptr getEntity(int entityId); @@ -100,6 +102,7 @@ public: virtual void handleContainerSetSlot(shared_ptr packet); virtual void handleContainerAck(shared_ptr packet); virtual void handleContainerContent(shared_ptr packet); + virtual void handleTileEditorOpen(shared_ptr packet); virtual void handleSignUpdate(shared_ptr packet); virtual void handleTileEntityData(shared_ptr packet); virtual void handleContainerSetData(shared_ptr packet); @@ -137,4 +140,27 @@ public: virtual void handleXZ(shared_ptr packet); void displayPrivilegeChanges(shared_ptr player, unsigned int oldPrivileges); + + virtual void handleAddObjective(shared_ptr packet); + virtual void handleSetScore(shared_ptr packet); + virtual void handleSetDisplayObjective(shared_ptr packet); + virtual void handleSetPlayerTeamPacket(shared_ptr packet); + virtual void handleParticleEvent(shared_ptr packet); + virtual void handleUpdateAttributes(shared_ptr packet); + +private: + // 4J: Entity link packet deferred + class DeferredEntityLinkPacket + { + public: + DWORD m_recievedTick; + shared_ptr m_packet; + + DeferredEntityLinkPacket(shared_ptr packet); + }; + + vector deferredEntityLinkPackets; + static const int MAX_ENTITY_LINK_DEFERRAL_INTERVAL = 1000; + + void checkDeferredEntityLinkPackets(int newEntityId); }; \ No newline at end of file diff --git a/Minecraft.Client/ClockTexture.cpp b/Minecraft.Client/ClockTexture.cpp index d8abb785..837532fb 100644 --- a/Minecraft.Client/ClockTexture.cpp +++ b/Minecraft.Client/ClockTexture.cpp @@ -7,14 +7,14 @@ #include "Texture.h" #include "ClockTexture.h" -ClockTexture::ClockTexture() : StitchedTexture(L"compass") +ClockTexture::ClockTexture() : StitchedTexture(L"clock", L"clock") { rot = rota = 0.0; m_dataTexture = NULL; m_iPad = XUSER_INDEX_ANY; } -ClockTexture::ClockTexture(int iPad, ClockTexture *dataTexture) : StitchedTexture(L"compass") +ClockTexture::ClockTexture(int iPad, ClockTexture *dataTexture) : StitchedTexture(L"clock", L"clock") { rot = rota = 0.0; m_dataTexture = dataTexture; diff --git a/Minecraft.Client/Common/App_Defines.h b/Minecraft.Client/Common/App_Defines.h index de1d1bdc..7e96896c 100644 --- a/Minecraft.Client/Common/App_Defines.h +++ b/Minecraft.Client/Common/App_Defines.h @@ -36,8 +36,29 @@ #define GAME_HOST_OPTION_BITMASK_HOSTINVISIBLE 0x00010000 #define GAME_HOST_OPTION_BITMASK_BEDROCKFOG 0x00020000 #define GAME_HOST_OPTION_BITMASK_DISABLESAVE 0x00040000 +#define GAME_HOST_OPTION_BITMASK_NOTOWNER 0x00080000 +#define GAME_HOST_OPTION_BITMASK_WORLDSIZE 0x00700000 // 3 bits, 5 values (unset(0), classic(1), small(2), medium(3), large(4)) +#define GAME_HOST_OPTION_BITMASK_MOBGRIEFING 0x00800000 +#define GAME_HOST_OPTION_BITMASK_KEEPINVENTORY 0x01000000 +#define GAME_HOST_OPTION_BITMASK_DOMOBSPAWNING 0x02000000 +#define GAME_HOST_OPTION_BITMASK_DOMOBLOOT 0x04000000 +#define GAME_HOST_OPTION_BITMASK_DOTILEDROPS 0x08000000 +#define GAME_HOST_OPTION_BITMASK_NATURALREGEN 0x10000000 +#define GAME_HOST_OPTION_BITMASK_DODAYLIGHTCYCLE 0x20000000 #define GAME_HOST_OPTION_BITMASK_ALL 0xFFFFFFFF +#define GAME_HOST_OPTION_BITMASK_WORLDSIZE_BITSHIFT 20 + +enum EGameHostOptionWorldSize +{ + e_worldSize_Unknown = 0, + e_worldSize_Classic, + e_worldSize_Small, + e_worldSize_Medium, + e_worldSize_Large +}; + + #ifdef _XBOX #define PROFILE_VERSION_1 1 #define PROFILE_VERSION_2 2 @@ -53,7 +74,12 @@ #define PROFILE_VERSION_10 12 // 4J-JEV: New Statistics and Achievements for 'NexGen' platforms. -#define PROFILE_VERSION_BUILD_JUNE14 13 +#define PROFILE_VERSION_11 13 + +// Java 1.6.4 +#define PROFILE_VERSION_12 14 + +#define PROFILE_VERSION_CURRENT PROFILE_VERSION_12 #define MAX_FAVORITE_SKINS 10 // these are stored in the profile data so keep it small diff --git a/Minecraft.Client/Common/App_enums.h b/Minecraft.Client/Common/App_enums.h index b6c484dc..db7bf70b 100644 --- a/Minecraft.Client/Common/App_enums.h +++ b/Minecraft.Client/Common/App_enums.h @@ -73,6 +73,7 @@ enum eXuiAction eAppAction_LevelInBanLevelList, eAppAction_ReloadTexturePack, + eAppAction_ReloadFont, eAppAction_TexturePackRequired, // when the user has joined from invite, but doesn't have the texture pack #ifdef __ORBIS__ @@ -380,6 +381,10 @@ enum eMinecraftColour eMinecraftColour_Effect_Hunger, eMinecraftColour_Effect_Weakness, eMinecraftColour_Effect_Poison, + eMinecraftColour_Effect_Wither, + eMinecraftColour_Effect_HealthBoost, + eMinecraftColour_Effect_Absoprtion, + eMinecraftColour_Effect_Saturation, eMinecraftColour_Potion_BaseColour, @@ -425,6 +430,12 @@ enum eMinecraftColour eMinecraftColour_Mob_Ocelot_Colour2, eMinecraftColour_Mob_Villager_Colour1, eMinecraftColour_Mob_Villager_Colour2, + eMinecraftColour_Mob_Bat_Colour1, + eMinecraftColour_Mob_Bat_Colour2, + eMinecraftColour_Mob_Witch_Colour1, + eMinecraftColour_Mob_Witch_Colour2, + eMinecraftColour_Mob_Horse_Colour1, + eMinecraftColour_Mob_Horse_Colour2, eMinecraftColour_Armour_Default_Leather_Colour, @@ -443,6 +454,11 @@ enum eMinecraftColour eMinecraftColour_Sign_Text, eMinecraftColour_Map_Text, + eMinecraftColour_Leash_Light_Colour, + eMinecraftColour_Leash_Dark_Colour, + + eMinecraftColour_Fire_Overlay, + eHTMLColor_0, eHTMLColor_1, eHTMLColor_2, @@ -487,20 +503,20 @@ enum eMinecraftColour eTextColor_RenamedItemTitle, //eHTMLColor_0 = 0x000000, //r:0 , g: 0, b: 0, i: 0 - //eHTMLColor_1 = 0x0000aa, //r:0 , g: 0, b: aa, i: 1 - //eHTMLColor_2 = 0x109e10, // Changed by request of Dave //0x00aa00, //r:0 , g: aa, b: 0, i: 2 - //eHTMLColor_3 = 0x109e9e, // Changed by request of Dave //0x00aaaa, //r:0 , g: aa, b: aa, i: 3 - //eHTMLColor_4 = 0xaa0000, //r:aa , g: 0, b: 0, i: 4 - //eHTMLColor_5 = 0xaa00aa, //r:aa , g: 0, b: aa, i: 5 - //eHTMLColor_6 = 0xffaa00, //r:ff , g: aa, b: 0, i: 6 - //eHTMLColor_7 = 0xaaaaaa, //r:aa , g: aa, b: aa, i: 7 - //eHTMLColor_8 = 0x555555, //r:55 , g: 55, b: 55, i: 8 - //eHTMLColor_9 = 0x5555ff, //r:55 , g: 55, b: ff, i: 9 - //eHTMLColor_a = 0x55ff55, //r:55 , g: ff, b: 55, i: a - //eHTMLColor_b = 0x55ffff, //r:55 , g: ff, b: ff, i: b - //eHTMLColor_c = 0xff5555, //r:ff , g: 55, b: 55, i: c - //eHTMLColor_d = 0xff55ff, //r:ff , g: 55, b: ff, i: d - //eHTMLColor_e = 0xffff55, //r:ff , g: ff, b: 55, i: e + //eHTMLColor_1 = 0x0000aa, //r:0 , g: 0, b: aa, i: 1 // blue, quite dark + //eHTMLColor_2 = 0x109e10, // Changed by request of Dave //0x00aa00, //r:0 , g: aa, b: 0, i: 2 // green + //eHTMLColor_3 = 0x109e9e, // Changed by request of Dave //0x00aaaa, //r:0 , g: aa, b: aa, i: 3 // cyan + //eHTMLColor_4 = 0xaa0000, //r:aa , g: 0, b: 0, i: 4 // red + //eHTMLColor_5 = 0xaa00aa, //r:aa , g: 0, b: aa, i: 5 // purple + //eHTMLColor_6 = 0xffaa00, //r:ff , g: aa, b: 0, i: 6 // orange + //eHTMLColor_7 = 0xaaaaaa, //r:aa , g: aa, b: aa, i: 7 // light gray + //eHTMLColor_8 = 0x555555, //r:55 , g: 55, b: 55, i: 8 // gray + //eHTMLColor_9 = 0x5555ff, //r:55 , g: 55, b: ff, i: 9 // blue + //eHTMLColor_a = 0x55ff55, //r:55 , g: ff, b: 55, i: a // green + //eHTMLColor_b = 0x55ffff, //r:55 , g: ff, b: ff, i: b // cyan + //eHTMLColor_c = 0xff5555, //r:ff , g: 55, b: 55, i: c // red pink + //eHTMLColor_d = 0xff55ff, //r:ff , g: 55, b: ff, i: d // bright pink + //eHTMLColor_e = 0xffff55, //r:ff , g: ff, b: 55, i: e // yellow //eHTMLColor_f = 0xffffff, //r:ff , g: ff, b: ff, i: f //eHTMLColor_0_dark = 0x000000, //r:0 , g: 0, b: 0, i: 10 //eHTMLColor_1_dark = 0x00002a, //r:0 , g: 0, b: 2a, i: 11 @@ -509,12 +525,12 @@ enum eMinecraftColour //eHTMLColor_4_dark = 0x2a0000, //r:2a , g: 0, b: 0, i: 14 //eHTMLColor_5_dark = 0x2a002a, //r:2a , g: 0, b: 2a, i: 15 //eHTMLColor_6_dark = 0x2a2a00, //r:2a , g: 2a, b: 0, i: 16 - //eHTMLColor_7_dark = 0x2a2a2a, //r:2a , g: 2a, b: 2a, i: 17 + //eHTMLColor_7_dark = 0x2a2a2a, //r:2a , g: 2a, b: 2a, i: 17 // dark gray //eHTMLColor_8_dark = 0x151515, //r:15 , g: 15, b: 15, i: 18 //eHTMLColor_9_dark = 0x15153f, //r:15 , g: 15, b: 3f, i: 19 //eHTMLColor_a_dark = 0x153f15, //r:15 , g: 3f, b: 15, i: 1a //eHTMLColor_b_dark = 0x153f3f, //r:15 , g: 3f, b: 3f, i: 1b - //eHTMLColor_c_dark = 0x3f1515, //r:3f , g: 15, b: 15, i: 1c + //eHTMLColor_c_dark = 0x3f1515, //r:3f , g: 15, b: 15, i: 1c // brown //eHTMLColor_d_dark = 0x3f153f, //r:3f , g: 15, b: 3f, i: 1d //eHTMLColor_e_dark = 0x3f3f15, //r:3f , g: 3f, b: 15, i: 1e //eHTMLColor_f_dark = 0x3f3f3f, //r:3f , g: 3f, b: 3f, i: 1f @@ -617,9 +633,19 @@ enum eGameHostOption eGameHostOption_HostCanBeInvisible, eGameHostOption_BedrockFog, eGameHostOption_NoHUD, + eGameHostOption_WorldSize, eGameHostOption_All, eGameHostOption_DisableSaving, + eGameHostOption_WasntSaveOwner, // Added for PS3 save transfer, so we can add a nice message in the future instead of the creative mode one + + eGameHostOption_MobGriefing, + eGameHostOption_KeepInventory, + eGameHostOption_DoMobSpawning, + eGameHostOption_DoMobLoot, + eGameHostOption_DoTileDrops, + eGameHostOption_NaturalRegeneration, + eGameHostOption_DoDaylightCycle, }; // 4J-PB - If any new DLC items are added to the TMSFiles, this array needs updated @@ -639,6 +665,8 @@ enum _TMSFILES TMS_SPM, TMS_SPI, TMS_SPG, + TMS_SPD1, + TMS_SPSW1, TMS_THST, TMS_THIR, @@ -748,6 +776,8 @@ enum _TMSFILES TMS_MPSR_DAT, TMS_MPHA, TMS_MPHA_DAT, + TMS_MPFE, + TMS_MPFE_DAT, TMS_TP01, TMS_TP01_DAT, @@ -761,6 +791,8 @@ enum _TMSFILES TMS_TP06_DAT, TMS_TP07, TMS_TP07_DAT, + TMS_TP08, + TMS_TP08_DAT, TMS_COUNT }; @@ -875,7 +907,7 @@ enum eMCLang eMCLang_plPL, eMCLang_trTR, eMCLang_elEL, - eMCLang_zhCHS, + eMCLang_csCS, eMCLang_zhCHT, eMCLang_laLAS, @@ -910,4 +942,7 @@ enum eMCLang eMCLang_elGR, eMCLang_nnNO, eMCLang_skSK, + + eMCLang_hans, + eMCLang_hant, }; \ No newline at end of file diff --git a/Minecraft.Client/Common/App_structs.h b/Minecraft.Client/Common/App_structs.h index ed321b5f..a7552ec0 100644 --- a/Minecraft.Client/Common/App_structs.h +++ b/Minecraft.Client/Common/App_structs.h @@ -100,6 +100,10 @@ typedef struct // PS3 1.05 - Adding Greek, so need a language unsigned char ucLanguage; + + // 29/Oct/2014 - Language selector. + unsigned char ucLocale; + // 4J Stu - See comment for GAME_SETTINGS_PROFILE_DATA_BYTES below // was 192 //unsigned char ucUnused[192-TUTORIAL_PROFILE_STORAGE_BYTES-sizeof(DWORD)-sizeof(char)-sizeof(char)-sizeof(char)-sizeof(char)-sizeof(LONG)-sizeof(LONG)-sizeof(DWORD)]; diff --git a/Minecraft.Client/Common/Audio/Consoles_SoundEngine.cpp b/Minecraft.Client/Common/Audio/Consoles_SoundEngine.cpp index 269b605b..e440316d 100644 --- a/Minecraft.Client/Common/Audio/Consoles_SoundEngine.cpp +++ b/Minecraft.Client/Common/Audio/Consoles_SoundEngine.cpp @@ -35,4 +35,43 @@ void ConsoleSoundEngine::SetIsPlayingNetherMusic(bool bVal) m_bIsPlayingNetherMusic=bVal; } +void ConsoleSoundEngine::tick() +{ + if (scheduledSounds.empty()) + { + return; + } + for(AUTO_VAR(it,scheduledSounds.begin()); it != scheduledSounds.end();) + { + SoundEngine::ScheduledSound *next = *it; + next->delay--; + + if (next->delay <= 0) + { + play(next->iSound, next->x, next->y, next->z, next->volume, next->pitch); + it =scheduledSounds.erase(it); + delete next; + } + else + { + ++it; + } + } +} + +void ConsoleSoundEngine::schedule(int iSound, float x, float y, float z, float volume, float pitch, int delayTicks) +{ + scheduledSounds.push_back(new SoundEngine::ScheduledSound(iSound, x, y, z, volume, pitch, delayTicks)); +} + +ConsoleSoundEngine::ScheduledSound::ScheduledSound(int iSound, float x, float y, float z, float volume, float pitch, int delay) +{ + this->iSound = iSound; + this->x = x; + this->y = y; + this->z = z; + this->volume = volume; + this->pitch = pitch; + this->delay = delay; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Audio/Consoles_SoundEngine.h b/Minecraft.Client/Common/Audio/Consoles_SoundEngine.h index 4ec76036..b29b4378 100644 --- a/Minecraft.Client/Common/Audio/Consoles_SoundEngine.h +++ b/Minecraft.Client/Common/Audio/Consoles_SoundEngine.h @@ -69,6 +69,25 @@ public: static const WCHAR *wchSoundNames[eSoundType_MAX]; static const WCHAR *wchUISoundNames[eSFX_MAX]; +public: + void tick(); + void schedule(int iSound, float x, float y, float z, float volume, float pitch, int delayTicks); + +private: + class ScheduledSound + { + public: + int iSound; + float x, y, z; + float volume, pitch; + int delay; + + public: + ScheduledSound(int iSound, float x, float y, float z, float volume, float pitch, int delay); + }; + + vector scheduledSounds; + private: // platform specific functions diff --git a/Minecraft.Client/Common/Audio/SoundEngine.cpp b/Minecraft.Client/Common/Audio/SoundEngine.cpp index dfed0de7..4d356c13 100644 --- a/Minecraft.Client/Common/Audio/SoundEngine.cpp +++ b/Minecraft.Client/Common/Audio/SoundEngine.cpp @@ -490,6 +490,12 @@ void SoundEngine::updateMiles() case eSoundType_MOB_ENDERDRAGON_HIT: distanceScaler=100.0f; break; + case eSoundType_FIREWORKS_BLAST: + case eSoundType_FIREWORKS_BLAST_FAR: + case eSoundType_FIREWORKS_LARGE_BLAST: + case eSoundType_FIREWORKS_LARGE_BLAST_FAR: + distanceScaler=100.0f; + break; case eSoundType_MOB_GHAST_MOAN: case eSoundType_MOB_GHAST_SCREAM: case eSoundType_MOB_GHAST_DEATH: @@ -624,6 +630,7 @@ static S32 running = AIL_ms_count(); void SoundEngine::tick(shared_ptr *players, float a) { + ConsoleSoundEngine::tick(); #ifdef __DISABLE_MILES__ return; #endif @@ -1129,6 +1136,11 @@ int SoundEngine::OpenStreamThreadProc( void* lpParameter ) #endif SoundEngine *soundEngine = (SoundEngine *)lpParameter; soundEngine->m_hStream = AIL_open_stream(soundEngine->m_hDriver,soundEngine->m_szStreamName,0); + + if(soundEngine->m_hStream==0) + { + app.DebugPrintf("SoundEngine::OpenStreamThreadProc - Could not open - %s\n",soundEngine->m_szStreamName); + } return 0; } @@ -1225,7 +1237,11 @@ void SoundEngine::playMusicUpdate() char szName[255]; wcstombs(szName,wstrSoundName.c_str(),255); +#if defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ + string strFile="TPACK:/Data/" + string(szName) + ".binka"; +#else string strFile="TPACK:\\Data\\" + string(szName) + ".binka"; +#endif std::string mountedPath = StorageManager.GetMountedPath(strFile); strcpy(m_szStreamName,mountedPath.c_str()); #endif diff --git a/Minecraft.Client/Common/Audio/SoundNames.cpp b/Minecraft.Client/Common/Audio/SoundNames.cpp index 170c87a0..1ab709b2 100644 --- a/Minecraft.Client/Common/Audio/SoundNames.cpp +++ b/Minecraft.Client/Common/Audio/SoundNames.cpp @@ -151,6 +151,78 @@ const WCHAR *ConsoleSoundEngine::wchSoundNames[eSoundType_MAX]= L"dig.snow", // eSoundType_DIG_SNOW L"dig.stone", // eSoundType_DIG_STONE L"dig.wood", // eSoundType_DIG_WOOD + + // 1.6.4 + L"fireworks.launch", //eSoundType_FIREWORKS_LAUNCH, + L"fireworks.blast", //eSoundType_FIREWORKS_BLAST, + L"fireworks.blast_far", //eSoundType_FIREWORKS_BLAST_FAR, + L"fireworks.large_blast", //eSoundType_FIREWORKS_LARGE_BLAST, + L"fireworks.large_blast_far", //eSoundType_FIREWORKS_LARGE_BLAST_FAR, + L"fireworks.twinkle", //eSoundType_FIREWORKS_TWINKLE, + L"fireworks.twinkle_far", //eSoundType_FIREWORKS_TWINKLE_FAR, + + L"mob.bat.idle", //eSoundType_MOB_BAT_IDLE, + L"mob.bat.hurt", //eSoundType_MOB_BAT_HURT, + L"mob.bat.death", //eSoundType_MOB_BAT_DEATH, + L"mob.bat.takeoff", //eSoundType_MOB_BAT_TAKEOFF, + + L"mob.wither.spawn", //eSoundType_MOB_WITHER_SPAWN, + L"mob.wither.idle", //eSoundType_MOB_WITHER_IDLE, + L"mob.wither.hurt", //eSoundType_MOB_WITHER_HURT, + L"mob.wither.death", //eSoundType_MOB_WITHER_DEATH, + L"mob.wither.shoot", //eSoundType_MOB_WITHER_SHOOT, + + L"mob.cow.step", //eSoundType_MOB_COW_STEP, + L"mob.chicken.step", //eSoundType_MOB_CHICKEN_STEP, + L"mob.pig.step", //eSoundType_MOB_PIG_STEP, + L"mob.enderman.stare", //eSoundType_MOB_ENDERMAN_STARE, + L"mob.enderman.scream", //eSoundType_MOB_ENDERMAN_SCREAM, + L"mob.sheep.shear", //eSoundType_MOB_SHEEP_SHEAR, + L"mob.sheep.step", //eSoundType_MOB_SHEEP_STEP, + L"mob.skeleton.death", //eSoundType_MOB_SKELETON_DEATH, + L"mob.skeleton.step", //eSoundType_MOB_SKELETON_STEP, + L"mob.spider.step", //eSoundType_MOB_SPIDER_STEP, + L"mob.wolf.step", //eSoundType_MOB_WOLF_STEP, + L"mob.zombie.step", //eSoundType_MOB_ZOMBIE_STEP, + + L"liquid.swim", //eSoundType_LIQUID_SWIM, + + L"mob.horse.land", //eSoundType_MOB_HORSE_LAND, + L"mob.horse.armor", //eSoundType_MOB_HORSE_ARMOR, + L"mob.horse.leather", //eSoundType_MOB_HORSE_LEATHER, + L"mob.horse.zombie.death", //eSoundType_MOB_HORSE_ZOMBIE_DEATH, + L"mob.horse.skeleton.death", //eSoundType_MOB_HORSE_SKELETON_DEATH, + L"mob.horse.donkey.death", //eSoundType_MOB_HORSE_DONKEY_DEATH, + L"mob.horse.death", //eSoundType_MOB_HORSE_DEATH, + L"mob.horse.zombie.hit", //eSoundType_MOB_HORSE_ZOMBIE_HIT, + L"mob.horse.skeleton.hit", //eSoundType_MOB_HORSE_SKELETON_HIT, + L"mob.horse.donkey.hit", //eSoundType_MOB_HORSE_DONKEY_HIT, + L"mob.horse.hit", //eSoundType_MOB_HORSE_HIT, + L"mob.horse.zombie.idle", //eSoundType_MOB_HORSE_ZOMBIE_IDLE, + L"mob.horse.skeleton.idle", //eSoundType_MOB_HORSE_SKELETON_IDLE, + L"mob.horse.donkey.idle", //eSoundType_MOB_HORSE_DONKEY_IDLE, + L"mob.horse.idle", //eSoundType_MOB_HORSE_IDLE, + L"mob.horse.donkey.angry", //eSoundType_MOB_HORSE_DONKEY_ANGRY, + L"mob.horse.angry", //eSoundType_MOB_HORSE_ANGRY, + L"mob.horse.gallop", //eSoundType_MOB_HORSE_GALLOP, + L"mob.horse.breathe", //eSoundType_MOB_HORSE_BREATHE, + L"mob.horse.wood", //eSoundType_MOB_HORSE_WOOD, + L"mob.horse.soft", //eSoundType_MOB_HORSE_SOFT, + L"mob.horse.jump", //eSoundType_MOB_HORSE_JUMP, + + L"mob.witch.idle", //eSoundType_MOB_WITCH_IDLE, <--- missing + L"mob.witch.hurt", //eSoundType_MOB_WITCH_HURT, <--- missing + L"mob.witch.death", //eSoundType_MOB_WITCH_DEATH, <--- missing + + L"mob.slime.big", //eSoundType_MOB_SLIME_BIG, + L"mob.slime.small", //eSoundType_MOB_SLIME_SMALL, + + L"eating", //eSoundType_EATING <--- missing + L"random.levelup", //eSoundType_RANDOM_LEVELUP + + // 4J-PB - Some sounds were updated, but we can't do that for the 360 or we have to do a new sound bank + // instead, we'll add the sounds as new ones and change the code to reference them + L"fire.new_ignite", }; diff --git a/Minecraft.Client/Common/BuildVer.h b/Minecraft.Client/Common/BuildVer.h index ee558b03..9248a8eb 100644 --- a/Minecraft.Client/Common/BuildVer.h +++ b/Minecraft.Client/Common/BuildVer.h @@ -7,14 +7,14 @@ // This goes up with each build // 4J-JEV: This value is extracted with a regex so it can be placed as the version in the AppX manifest on Durango. -#define VER_PRODUCTBUILD 495 +#define VER_PRODUCTBUILD 560 // This goes up if there is any change to network traffic or code in a build -#define VER_NETWORK 495 +#define VER_NETWORK 560 #define VER_PRODUCTBUILD_QFE 0 -#define VER_FILEVERSION_STRING "1.3" +#define VER_FILEVERSION_STRING "1.6" #define VER_PRODUCTVERSION_STRING VER_FILEVERSION_STRING -#define VER_FILEVERSION_STRING_W L"1.3" +#define VER_FILEVERSION_STRING_W L"1.6" #define VER_PRODUCTVERSION_STRING_W VER_FILEVERSION_STRING_W #define VER_FILEBETA_STR "" #undef VER_FILEVERSION diff --git a/Minecraft.Client/Common/Colours/ColourTable.cpp b/Minecraft.Client/Common/Colours/ColourTable.cpp index dc58cfb1..5c74d5ec 100644 --- a/Minecraft.Client/Common/Colours/ColourTable.cpp +++ b/Minecraft.Client/Common/Colours/ColourTable.cpp @@ -201,6 +201,10 @@ wchar_t *ColourTable::ColourTableElements[eMinecraftColour_COUNT] = L"Effect_Hunger", L"Effect_Weakness", L"Effect_Poison", + L"Effect_Wither", + L"Effect_HealthBoost", + L"Effect_Absorption", + L"Effect_Saturation", L"Potion_BaseColour", @@ -246,6 +250,12 @@ wchar_t *ColourTable::ColourTableElements[eMinecraftColour_COUNT] = L"Mob_Ocelot_Colour2", L"Mob_Villager_Colour1", L"Mob_Villager_Colour2", + L"Mob_Bat_Colour1", + L"Mob_Bat_Colour2", + L"Mob_Witch_Colour1", + L"Mob_Witch_Colour2", + L"Mob_Horse_Colour1", + L"Mob_Horse_Colour2", L"Armour_Default_Leather_Colour", L"Under_Water_Clear_Colour", @@ -262,6 +272,11 @@ wchar_t *ColourTable::ColourTableElements[eMinecraftColour_COUNT] = L"Sign_Text", L"Map_Text", + + L"Leash_Light_Colour", + L"Leash_Dark_Colour", + + L"Fire_Overlay", L"HTMLColor_0", L"HTMLColor_1", diff --git a/Minecraft.Client/Common/Console_Debug_enum.h b/Minecraft.Client/Common/Console_Debug_enum.h index 4e6c2b14..3d2b97af 100644 --- a/Minecraft.Client/Common/Console_Debug_enum.h +++ b/Minecraft.Client/Common/Console_Debug_enum.h @@ -12,15 +12,15 @@ enum eDebugSetting eDebugSetting_CraftAnything, eDebugSetting_UseDpadForDebug, eDebugSetting_MobsDontTick, - eDebugSetting_InstantDestroy, + eDebugSetting_ArtTools, //eDebugSetting_InstantDestroy, eDebugSetting_ShowUIConsole, eDebugSetting_DistributableSave, eDebugSetting_DebugLeaderboards, - eDebugSetting_EnableHeightWaterBiomeOverride, //eDebugSetting_TipsAlwaysOn, + eDebugSetting_EnableHeightWaterOverride, //eDebugSetting_TipsAlwaysOn, eDebugSetting_SuperflatNether, //eDebugSetting_LightDarkBackground, eDebugSetting_RegularLightning, - eDebugSetting_GoToNether, + eDebugSetting_EnableBiomeOverride, //eDebugSetting_GoToNether, //eDebugSetting_GoToEnd, eDebugSetting_GoToOverworld, eDebugSetting_UnlockAllDLC, // eDebugSetting_ToggleFont, diff --git a/Minecraft.Client/Common/Consoles_App.cpp b/Minecraft.Client/Common/Consoles_App.cpp index b047f58e..30bc8533 100644 --- a/Minecraft.Client/Common/Consoles_App.cpp +++ b/Minecraft.Client/Common/Consoles_App.cpp @@ -1,10 +1,12 @@  #include "stdafx.h" - -#include "..\..\Minecraft.World\Recipy.h" -#include "..\..\Minecraft.Client\Options.h" -#include "..\..\Minecraft.World\AABB.h" -#include "..\..\Minecraft.World\Vec3.h" +#include "..\..\Minecraft.World\net.minecraft.world.entity.item.h" +#include "..\..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\..\Minecraft.World\net.minecraft.world.phys.h" +#include "..\..\Minecraft.World\InputOutputStream.h" +#include "..\..\Minecraft.World\compression.h" +#include "..\Options.h" #include "..\MinecraftServer.h" #include "..\MultiPlayerLevel.h" #include "..\GameRenderer.h" @@ -35,8 +37,6 @@ #include "..\ServerPlayer.h" #include "GameRules\ConsoleGameRules.h" #include "GameRules\ConsoleSchematicFile.h" -#include "..\..\Minecraft.World\InputOutputStream.h" -#include "..\..\Minecraft.World\LevelSettings.h" #include "..\User.h" #include "..\..\Minecraft.World\LevelData.h" #include "..\..\Minecraft.World\net.minecraft.world.entity.player.h" @@ -155,8 +155,8 @@ CMinecraftApp::CMinecraftApp() ZeroMemory(&m_InviteData,sizeof(JoinFromInviteData) ); -// m_bRead_TMS_XUIDS_XML=false; -// m_bRead_TMS_DLCINFO_XML=false; + // m_bRead_TMS_XUIDS_XML=false; + // m_bRead_TMS_DLCINFO_XML=false; m_pDLCFileBuffer=NULL; m_dwDLCFileSize=0; @@ -178,6 +178,12 @@ CMinecraftApp::CMinecraftApp() m_uiGameHostSettings=0; +#ifdef _LARGE_WORLDS + m_GameNewWorldSize = 0; + m_bGameNewWorldSizeUseMoat = false; + m_GameNewHellScale = 0; +#endif + ZeroMemory(m_playerColours,MINECRAFT_NET_MAX_PLAYERS); m_iDLCOfferC=0; @@ -198,10 +204,10 @@ CMinecraftApp::CMinecraftApp() m_dwRequiredTexturePackID=0; m_bResetNether=false; - + #ifdef _XBOX -// m_bTransferSavesToXboxOne=false; -// m_uiTransferSlotC=5; + // m_bTransferSavesToXboxOne=false; + // m_uiTransferSlotC=5; #endif #if (defined _CONTENT_PACAKGE) || (defined _XBOX) @@ -308,7 +314,15 @@ LPCWSTR CMinecraftApp::GetString(int iID) void CMinecraftApp::SetAction(int iPad, eXuiAction action, LPVOID param) { - if(m_eXuiAction[iPad] == eAppAction_ExitWorldCapturedThumbnail && action != eAppAction_Idle) + if( ( m_eXuiAction[iPad] == eAppAction_ReloadTexturePack ) && ( action == eAppAction_EthernetDisconnected ) ) + { + app.DebugPrintf("Invalid change of App action for pad %d from %d to %d, ignoring\n", iPad, m_eXuiAction[iPad], action); + } + else if( ( m_eXuiAction[iPad] == eAppAction_ReloadTexturePack ) && ( action == eAppAction_ExitWorld ) ) + { + app.DebugPrintf("Invalid change of App action for pad %d from %d to %d, ignoring\n", iPad, m_eXuiAction[iPad], action); + } + else if(m_eXuiAction[iPad] == eAppAction_ExitWorldCapturedThumbnail && action != eAppAction_Idle) { app.DebugPrintf("Invalid change of App action for pad %d from %d to %d, ignoring\n", iPad, m_eXuiAction[iPad], action); } @@ -352,17 +366,17 @@ void CMinecraftApp::HandleButtonPresses() void CMinecraftApp::HandleButtonPresses(int iPad) { -// // test an update of the profile data -// void *pData=ProfileManager.GetGameDefinedProfileData(iPad); -// -// unsigned char *pchData= (unsigned char *)pData; -// int iCount=0; -// for(int i=0;i player,bool bNavigateBack) @@ -463,7 +477,32 @@ bool CMinecraftApp::LoadCrafting3x3Menu(int iPad,shared_ptr player, return success; } -bool CMinecraftApp::LoadEnchantingMenu(int iPad,shared_ptr inventory, int x, int y, int z, Level *level) +bool CMinecraftApp::LoadFireworksMenu(int iPad,shared_ptr player, int x, int y, int z) +{ + bool success = true; + + FireworksScreenInput* initData = new FireworksScreenInput(); + initData->player = player; + initData->iPad = iPad; + initData->x = x; + initData->y = y; + initData->z = z; + + if(app.GetLocalPlayerCount()>1) + { + initData->bSplitscreen=true; + success = ui.NavigateToScene(iPad,eUIScene_FireworksMenu, initData); + } + else + { + initData->bSplitscreen=false; + success = ui.NavigateToScene(iPad,eUIScene_FireworksMenu, initData); + } + + return success; +} + +bool CMinecraftApp::LoadEnchantingMenu(int iPad,shared_ptr inventory, int x, int y, int z, Level *level, const wstring &name) { bool success = true; @@ -474,6 +513,7 @@ bool CMinecraftApp::LoadEnchantingMenu(int iPad,shared_ptr inventory, initData->y = y; initData->z = z; initData->iPad = iPad; + initData->name = name; if(app.GetLocalPlayerCount()>1) { @@ -634,7 +674,7 @@ bool CMinecraftApp::LoadRepairingMenu(int iPad,shared_ptr inventory, return success; } -bool CMinecraftApp::LoadTradingMenu(int iPad, shared_ptr inventory, shared_ptr trader, Level *level) +bool CMinecraftApp::LoadTradingMenu(int iPad, shared_ptr inventory, shared_ptr trader, Level *level, const wstring &name) { bool success = true; @@ -651,6 +691,71 @@ bool CMinecraftApp::LoadTradingMenu(int iPad, shared_ptr inventory, s return success; } +bool CMinecraftApp::LoadHopperMenu(int iPad ,shared_ptr inventory, shared_ptr hopper) +{ + bool success = true; + + HopperScreenInput *initData = new HopperScreenInput(); + initData->inventory = inventory; + initData->hopper = hopper; + initData->iPad = iPad; + if(app.GetLocalPlayerCount()>1) initData->bSplitscreen=true; + else initData->bSplitscreen=false; + + success = ui.NavigateToScene(iPad,eUIScene_HopperMenu, initData); + + return success; +} + +bool CMinecraftApp::LoadHopperMenu(int iPad ,shared_ptr inventory, shared_ptr hopper) +{ + bool success = true; + + HopperScreenInput *initData = new HopperScreenInput(); + initData->inventory = inventory; + initData->hopper = dynamic_pointer_cast(hopper); + initData->iPad = iPad; + if(app.GetLocalPlayerCount()>1) initData->bSplitscreen=true; + else initData->bSplitscreen=false; + + success = ui.NavigateToScene(iPad,eUIScene_HopperMenu, initData); + + return success; +} + + +bool CMinecraftApp::LoadHorseMenu(int iPad ,shared_ptr inventory, shared_ptr container, shared_ptr horse) +{ + bool success = true; + + HorseScreenInput *initData = new HorseScreenInput(); + initData->inventory = inventory; + initData->container = container; + initData->horse = horse; + initData->iPad = iPad; + if(app.GetLocalPlayerCount()>1) initData->bSplitscreen=true; + else initData->bSplitscreen=false; + + success = ui.NavigateToScene(iPad,eUIScene_HorseMenu, initData); + + return success; +} + +bool CMinecraftApp::LoadBeaconMenu(int iPad ,shared_ptr inventory, shared_ptr beacon) +{ + bool success = true; + + BeaconScreenInput *initData = new BeaconScreenInput(); + initData->inventory = inventory; + initData->beacon = beacon; + initData->iPad = iPad; + if(app.GetLocalPlayerCount()>1) initData->bSplitscreen=true; + else initData->bSplitscreen=false; + + success = ui.NavigateToScene(iPad,eUIScene_BeaconMenu, initData); + + return success; +} ////////////////////////////////////////////// // GAME SETTINGS @@ -750,15 +855,32 @@ int CMinecraftApp::SetDefaultOptions(C_4JProfile::PROFILESETTINGS *pSettings,con // TU 13 GameSettingsA[iPad]->uiMashUpPackWorldsDisplay=0xFFFFFFFF; + // 1.6.4 + app.SetGameHostOption(eGameHostOption_MobGriefing, 1); + app.SetGameHostOption(eGameHostOption_KeepInventory, 0); + app.SetGameHostOption(eGameHostOption_DoMobSpawning, 1 ); + app.SetGameHostOption(eGameHostOption_DoMobLoot, 1 ); + app.SetGameHostOption(eGameHostOption_DoTileDrops, 1 ); + app.SetGameHostOption(eGameHostOption_NaturalRegeneration, 1 ); + app.SetGameHostOption(eGameHostOption_DoDaylightCycle, 1 ); + // 4J-PB - leave these in, or remove from everywhere they are referenced! // Although probably best to leave in unless we split the profile settings into platform specific classes - having different meaning per platform for the same bitmask could get confusing -//#ifdef __PS3__ + //#ifdef __PS3__ // PS3DEC13 SetGameSettings(iPad,eGameSetting_PS3_EULA_Read,0); // EULA not read // PS3 1.05 - added Greek - GameSettingsA[iPad]->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language -//#endif + + // 4J-JEV: We cannot change these in-game, as they could affect localised strings and font. + // XB1: Fix for #172947 - Content: Gameplay: While playing in language different form system default one and resetting options to their defaults in active gameplay causes in-game language to change and HUD to disappear + if (!app.GetGameStarted()) + { + GameSettingsA[iPad]->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language + GameSettingsA[iPad]->ucLocale = MINECRAFT_LANGUAGE_DEFAULT; // use the system locale + } + + //#endif #if (defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) GameSettingsA[iPad]->bSettingsChanged=bWriteProfile; @@ -780,7 +902,7 @@ int CMinecraftApp::DefaultOptionsCallback(LPVOID pParam,C_4JProfile::PROFILESETT pApp->DebugPrintf("Setting default options for player %d", iPad); pApp->SetAction(iPad,eAppAction_SetDefaultOptions, (LPVOID)pSettings); //pApp->SetDefaultOptions(pSettings,iPad); - + // if the profile data has been changed, then force a profile write // It seems we're allowed to break the 5 minute rule if it's the result of a user action //pApp->CheckGameSettingsChanged(); @@ -790,6 +912,28 @@ int CMinecraftApp::DefaultOptionsCallback(LPVOID pParam,C_4JProfile::PROFILESETT #if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__) +wstring CMinecraftApp::toStringOptionsStatus(const C4JStorage::eOptionsCallback &eStatus) +{ +#ifndef _CONTENT_PACKAGE + switch(eStatus) + { + case C4JStorage::eOptions_Callback_Idle: return L"Idle"; + case C4JStorage::eOptions_Callback_Write: return L"Write"; + case C4JStorage::eOptions_Callback_Write_Fail_NoSpace: return L"Write_Fail_NoSpace"; + case C4JStorage::eOptions_Callback_Write_Fail: return L"Write_Fail"; + case C4JStorage::eOptions_Callback_Read: return L"Read"; + case C4JStorage::eOptions_Callback_Read_Fail: return L"Read_Fail"; + case C4JStorage::eOptions_Callback_Read_FileNotFound: return L"Read_FileNotFound"; + case C4JStorage::eOptions_Callback_Read_Corrupt: return L"Read_Corrupt"; + case C4JStorage::eOptions_Callback_Read_CorruptDeletePending: return L"Read_CorruptDeletePending"; + case C4JStorage::eOptions_Callback_Read_CorruptDeleted: return L"Read_CorruptDeleted"; + default: return L"[UNRECOGNISED_OPTIONS_STATUS]"; + } +#else + return L""; +#endif +} + #ifdef __ORBIS__ int CMinecraftApp::OptionsDataCallback(LPVOID pParam,int iPad,unsigned short usVersion,C4JStorage::eOptionsCallback eStatus,int iBlocksRequired) { @@ -808,7 +952,13 @@ int CMinecraftApp::GetOptionsBlocksRequired(int iPad) int CMinecraftApp::OptionsDataCallback(LPVOID pParam,int iPad,unsigned short usVersion,C4JStorage::eOptionsCallback eStatus) { CMinecraftApp *pApp=(CMinecraftApp *)pParam; - pApp->m_eOptionsStatusA[iPad]=eStatus; + +#ifndef _CONTENT_PACKAGE + pApp->DebugPrintf("[OptionsDataCallback] Pad_%i: new status == %ls(%i).\n", iPad, pApp->toStringOptionsStatus(eStatus).c_str(), (int) eStatus); +#endif + + pApp->m_eOptionsStatusA[iPad] = eStatus; + return 0; } #endif @@ -850,7 +1000,7 @@ int CMinecraftApp::OldProfileVersionCallback(LPVOID pParam,unsigned char *pucDat pGameSettings->uiBitmaskValues=0L; // reset pGameSettings->uiBitmaskValues|=GAMESETTING_CLOUDS; //eGameSetting_Clouds - on pGameSettings->uiBitmaskValues|=GAMESETTING_ONLINE; //eGameSetting_GameSetting_Online - on - //eGameSetting_GameSetting_Invite - off + //eGameSetting_GameSetting_Invite - off pGameSettings->uiBitmaskValues|=GAMESETTING_FRIENDSOFFRIENDS; //eGameSetting_GameSetting_FriendsOfFriends - on pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) // TU6 @@ -885,7 +1035,7 @@ int CMinecraftApp::OldProfileVersionCallback(LPVOID pParam,unsigned char *pucDat pGameSettings->uiBitmaskValues=0L; // reset pGameSettings->uiBitmaskValues|=GAMESETTING_CLOUDS; //eGameSetting_Clouds - on pGameSettings->uiBitmaskValues|=GAMESETTING_ONLINE; //eGameSetting_GameSetting_Online - on - //eGameSetting_GameSetting_Invite - off + //eGameSetting_GameSetting_Invite - off pGameSettings->uiBitmaskValues|=GAMESETTING_FRIENDSOFFRIENDS; //eGameSetting_GameSetting_FriendsOfFriends - on pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) // TU6 @@ -917,7 +1067,7 @@ int CMinecraftApp::OldProfileVersionCallback(LPVOID pParam,unsigned char *pucDat case PROFILE_VERSION_4: { GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; - + pGameSettings->uiBitmaskValues&=~GAMESETTING_BEDROCKFOG; //eGameSetting_BedrockFog - off pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYHUD; //eGameSetting_DisplayHUD - on pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYHAND; //eGameSetting_DisplayHand - on @@ -1040,7 +1190,7 @@ int CMinecraftApp::OldProfileVersionCallback(LPVOID pParam,unsigned char *pucDat { GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; // reset the display new message counter - //pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) // Added a bitmask in TU13 to enable/disable display of the Mash-up pack worlds in the saves list pGameSettings->uiMashUpPackWorldsDisplay = 0xFFFFFFFF; @@ -1057,8 +1207,9 @@ int CMinecraftApp::OldProfileVersionCallback(LPVOID pParam,unsigned char *pucDat // PS3DEC13 { GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) pGameSettings->uiBitmaskValues&=~GAMESETTING_PS3EULAREAD; //eGameSetting_PS3_EULA_Read - off - + // PS3 1.05 - added Greek pGameSettings->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language @@ -1067,18 +1218,29 @@ int CMinecraftApp::OldProfileVersionCallback(LPVOID pParam,unsigned char *pucDat case PROFILE_VERSION_10: { GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; - + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) pGameSettings->ucLanguage = MINECRAFT_LANGUAGE_DEFAULT; // use the system language } break; - + case PROFILE_VERSION_11: + { + GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) + } + break; + case PROFILE_VERSION_12: + { + GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; + pGameSettings->uiBitmaskValues|=GAMESETTING_DISPLAYUPDATEMSG; //eGameSetting_DisplayUpdateMessage (counter) + } + break; default: { // This might be from a version during testing of new profile updates app.DebugPrintf("Don't know what to do with this profile version!\n"); - #ifndef _CONTENT_PACKAGE - // __debugbreak(); - #endif +#ifndef _CONTENT_PACKAGE + // __debugbreak(); +#endif GAME_SETTINGS *pGameSettings=(GAME_SETTINGS *)pucData; pGameSettings->ucMenuSensitivity=100; //eGameSetting_Sensitivity_InMenu @@ -1208,7 +1370,7 @@ void CMinecraftApp::ActionGameSettings(int iPad,eGameSetting eVal) { app.DebugPrintf("NOT ACTIONING DIFFICULTY - Primary pad is %d, This pad is %d\n",ProfileManager.GetPrimaryPad(),iPad); } - + break; case eGameSetting_Sensitivity_InGame: // 4J-PB - we don't use the options value @@ -1278,7 +1440,7 @@ void CMinecraftApp::ActionGameSettings(int iPad,eGameSetting eVal) } } break; -// Interim TU 1.6.6 + // Interim TU 1.6.6 case eGameSetting_Sensitivity_InMenu: // 4J-PB - we don't use the options value // tell the input that we've changed the sensitivity - range of the slider is 0 to 200, default is 100 @@ -1414,7 +1576,7 @@ DWORD CMinecraftApp::GetPlayerSkinId(int iPad) { // 4J Stu - DLC skins are numbered using decimal rather than hex to make it easier to number manually swprintf(chars, 256, L"dlcskin%08d.png", GET_DLC_SKIN_ID_FROM_BITMASK(dwSkin)); - + Pack=app.m_dlcManager.getPackContainingSkin(chars); if(Pack) @@ -1439,10 +1601,10 @@ DWORD CMinecraftApp::GetPlayerSkinId(int iPad) return dwSkin; } - DWORD CMinecraftApp::GetAdditionalModelParts(int iPad) - { +DWORD CMinecraftApp::GetAdditionalModelParts(int iPad) +{ return m_dwAdditionalModelParts[iPad]; - } +} void CMinecraftApp::SetPlayerCape(int iPad,const wstring &name) @@ -1518,7 +1680,7 @@ unsigned int CMinecraftApp::GetPlayerFavoriteSkinsCount(int iPad) void CMinecraftApp::ValidateFavoriteSkins(int iPad) { unsigned int uiCount=GetPlayerFavoriteSkinsCount(iPad); - + // remove invalid skins unsigned int uiValidSkin=0; wchar_t chars[256]; @@ -1558,12 +1720,6 @@ void CMinecraftApp::HideMashupPackWorld(int iPad, unsigned int iMashupPackID) GameSettingsA[iPad]->bSettingsChanged = true; } -void CMinecraftApp::SetMinecraftLanguage(int iPad, unsigned char ucLanguage) -{ - GameSettingsA[iPad]->ucLanguage = ucLanguage; - GameSettingsA[iPad]->bSettingsChanged = true; -} - void CMinecraftApp::EnableMashupPackWorlds(int iPad) { GameSettingsA[iPad]->uiMashUpPackWorldsDisplay=0xFFFFFFFF; @@ -1575,6 +1731,12 @@ unsigned int CMinecraftApp::GetMashupPackWorlds(int iPad) return GameSettingsA[iPad]->uiMashUpPackWorldsDisplay; } +void CMinecraftApp::SetMinecraftLanguage(int iPad, unsigned char ucLanguage) +{ + GameSettingsA[iPad]->ucLanguage = ucLanguage; + GameSettingsA[iPad]->bSettingsChanged = true; +} + unsigned char CMinecraftApp::GetMinecraftLanguage(int iPad) { // if there are no game settings read yet, return the default language @@ -1588,6 +1750,25 @@ unsigned char CMinecraftApp::GetMinecraftLanguage(int iPad) } } +void CMinecraftApp::SetMinecraftLocale(int iPad, unsigned char ucLocale) +{ + GameSettingsA[iPad]->ucLocale = ucLocale; + GameSettingsA[iPad]->bSettingsChanged = true; +} + +unsigned char CMinecraftApp::GetMinecraftLocale(int iPad) +{ + // if there are no game settings read yet, return the default language + if(GameSettingsA[iPad]==NULL) + { + return 0; + } + else + { + return GameSettingsA[iPad]->ucLocale; + } +} + void CMinecraftApp::SetGameSettings(int iPad,eGameSetting eVal,unsigned char ucVal) { //Minecraft *pMinecraft=Minecraft::GetInstance(); @@ -1958,7 +2139,7 @@ void CMinecraftApp::SetGameSettings(int iPad,eGameSetting eVal,unsigned char ucV } break; - // TU9 + // TU9 case eGameSetting_DeathMessages: if((GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_DEATHMESSAGES)!=(ucVal&0x01)<<10) { @@ -2091,7 +2272,7 @@ unsigned char CMinecraftApp::GetGameSettings(int iPad,eGameSetting eVal) case eGameSetting_SplitScreenVertical: return ((GameSettingsA[iPad]->usBitmaskValues&0x0100)>>8); break; - // 4J-PB - Added for Interim TU for 1.6.6 + // 4J-PB - Added for Interim TU for 1.6.6 case eGameSetting_Sensitivity_InMenu: return GameSettingsA[iPad]->ucMenuSensitivity; break; @@ -2116,7 +2297,7 @@ unsigned char CMinecraftApp::GetGameSettings(int iPad,eGameSetting eVal) case eGameSetting_InterfaceOpacity: return GameSettingsA[iPad]->ucInterfaceOpacity; break; - + case eGameSetting_Clouds: return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_CLOUDS); break; @@ -2144,7 +2325,7 @@ unsigned char CMinecraftApp::GetGameSettings(int iPad,eGameSetting eVal) case eGameSetting_CustomSkinAnim: return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_CUSTOMSKINANIM)>>9; break; - // TU9 + // TU9 case eGameSetting_DeathMessages: return (GameSettingsA[iPad]->uiBitmaskValues&GAMESETTING_DEATHMESSAGES)>>10; break; @@ -2333,18 +2514,18 @@ void CMinecraftApp::ActionDebugMask(int iPad,bool bSetAllClear) } break; - //case eDebugSetting_HandRenderingOff: - // if(ulBitmask&(1<func = &UIScene_PauseMenu::SaveWorldThreadProc; loadingParams->lpParam = (LPVOID)false; @@ -2593,7 +2774,7 @@ void CMinecraftApp::HandleXuiActions(void) } loadingParams->completionData = completionData; - + // 4J Stu - Xbox only #ifdef _XBOX // Temporarily make this scene fullscreen @@ -2624,12 +2805,12 @@ void CMinecraftApp::HandleXuiActions(void) // This just allows it to be shown if(pMinecraft->localgameModes[ProfileManager.GetPrimaryPad()] != NULL) pMinecraft->localgameModes[ProfileManager.GetPrimaryPad()]->getTutorial()->showTutorialPopup(false); - + //INT saveOrCheckpointId = 0; //bool validSave = StorageManager.GetSaveUniqueNumber(&saveOrCheckpointId); //SentientManager.RecordLevelSaveOrCheckpoint(ProfileManager.GetPrimaryPad(), saveOrCheckpointId); - + LoadingInputParams *loadingParams = new LoadingInputParams(); loadingParams->func = &UIScene_PauseMenu::SaveWorldThreadProc; @@ -2642,7 +2823,7 @@ void CMinecraftApp::HandleXuiActions(void) completionData->iPad = ProfileManager.GetPrimaryPad(); //completionData->bAutosaveWasMenuDisplayed=ui.GetMenuDisplayed(ProfileManager.GetPrimaryPad()); loadingParams->completionData = completionData; - + // 4J Stu - Xbox only #ifdef _XBOX // Temporarily make this scene fullscreen @@ -2676,11 +2857,11 @@ void CMinecraftApp::HandleXuiActions(void) #endif // not required - it's done within the removeLocalPlayerIdx - // if(pMinecraft->level->isClientSide) - // { - // // we need to remove the qnetplayer, or this player won't be able to get back into the game until qnet times out and removes them - // g_NetworkManager.NotifyPlayerLeaving(g_NetworkManager.GetLocalPlayerByUserIndex(i)); - // } + // if(pMinecraft->level->isClientSide) + // { + // // we need to remove the qnetplayer, or this player won't be able to get back into the game until qnet times out and removes them + // g_NetworkManager.NotifyPlayerLeaving(g_NetworkManager.GetLocalPlayerByUserIndex(i)); + // } // if there are any tips showing, we need to close them @@ -2747,11 +2928,11 @@ void CMinecraftApp::HandleXuiActions(void) } } } - + #ifdef _DURANGO ProfileManager.RemoveGamepadFromGame(i); #endif - + SetAction(i,eAppAction_Idle); } break; @@ -2936,12 +3117,12 @@ void CMinecraftApp::HandleXuiActions(void) UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_OK; uiIDA[1]=IDS_CONFIRM_CANCEL; - ui.RequestMessageBox(IDS_UNLOCK_TITLE, IDS_UNLOCK_TOSAVE_TEXT, uiIDA, 2, i,&CMinecraftApp::UnlockFullExitReturned,this,app.GetStringTable()); + ui.RequestErrorMessage(IDS_UNLOCK_TITLE, IDS_UNLOCK_TOSAVE_TEXT, uiIDA, 2, i,&CMinecraftApp::UnlockFullExitReturned,this); } // Change the presence info // Are we offline or online, and how many players are there - + if(g_NetworkManager.GetPlayerCount()>1) { for(int j=0;jplayerLeftTutorial( idx ); @@ -3031,14 +3212,14 @@ void CMinecraftApp::HandleXuiActions(void) SetGameStarted(false); ui.CloseAllPlayersScenes(); - + // 4J Stu - Fix for #12368 - Crash: Game crashes when saving then exiting and selecting to save for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) { #ifdef _XBOX app.TutorialSceneNavigateBack(idx,true); #endif - + // 4J Stu - Fix for #13257 - CRASH: Gameplay: Title crashed after exiting the tutorial // It doesn't matter if they were in the tutorial already pMinecraft->playerLeftTutorial( idx ); @@ -3054,7 +3235,7 @@ void CMinecraftApp::HandleXuiActions(void) completionData->type = e_ProgressCompletion_NavigateToHomeMenu; completionData->iPad = DEFAULT_XUI_MENU_USER; loadingParams->completionData = completionData; - + ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); } @@ -3072,7 +3253,7 @@ void CMinecraftApp::HandleXuiActions(void) param->showTooltips = false; param->setFailTimer = false; ui.NavigateToScene(i,eUIScene_ConnectingProgress, param); - + // Need to reset this incase the player has already died and respawned pMinecraft->localplayers[i]->SetPlayerRespawned(false); @@ -3100,7 +3281,7 @@ void CMinecraftApp::HandleXuiActions(void) // Disable game & update thread whilst we do any of this //app.SetGameStarted(false); pMinecraft->gameRenderer->DisableUpdateThread(); - + // 4J Stu - We don't need this on a thread in multiplayer as respawning is asynchronous. pMinecraft->localplayers[i]->respawn(); @@ -3135,8 +3316,8 @@ void CMinecraftApp::HandleXuiActions(void) // clear the progress messages -// pMinecraft->progressRenderer->progressStart(-1); -// pMinecraft->progressRenderer->progressStage(-1); + // pMinecraft->progressRenderer->progressStart(-1); + // pMinecraft->progressRenderer->progressStage(-1); } else if(!g_NetworkManager.IsInGameplay()) { @@ -3173,10 +3354,10 @@ void CMinecraftApp::HandleXuiActions(void) pStats->clear(); // 4J-PB - the libs will display the Returned to Title screen -// UINT uiIDA[1]; -// uiIDA[0]=IDS_CONFIRM_OK; -// -// ui.RequestMessageBox(IDS_RETURNEDTOMENU_TITLE, IDS_RETURNEDTOTITLESCREEN_TEXT, uiIDA, 1, i,&CMinecraftApp::PrimaryPlayerSignedOutReturned,this,app.GetStringTable()); + // UINT uiIDA[1]; + // uiIDA[0]=IDS_CONFIRM_OK; + // + // ui.RequestMessageBox(IDS_RETURNEDTOMENU_TITLE, IDS_RETURNEDTOTITLESCREEN_TEXT, uiIDA, 1, i,&CMinecraftApp::PrimaryPlayerSignedOutReturned,this,app.GetStringTable()); if( g_NetworkManager.IsInSession() ) { app.SetAction(i,eAppAction_PrimaryPlayerSignedOutReturned); @@ -3215,7 +3396,7 @@ void CMinecraftApp::HandleXuiActions(void) // If there's a non-null level then, for our purposes, the game has started bool gameStarted = false; - for(int i = 0; i < pMinecraft->levels.length; i++) + for(int j = 0; j < pMinecraft->levels.length; j++) { if (pMinecraft->levels.data[i] != NULL) { @@ -3239,7 +3420,7 @@ void CMinecraftApp::HandleXuiActions(void) UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST), g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE), uiIDA, 1, i,&CMinecraftApp::EthernetDisconnectReturned,this, app.GetStringTable()); + ui.RequestErrorMessage(g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST), g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE), uiIDA, 1, i,&CMinecraftApp::EthernetDisconnectReturned,this); } else { @@ -3250,6 +3431,15 @@ void CMinecraftApp::HandleXuiActions(void) } else { +#if defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ + if(UIScene_LoadOrJoinMenu::isSaveTransferRunning()) + { + // the save transfer is still in progress, delay jumping back to the main menu until we've cleaned up + SetAction(i,eAppAction_EthernetDisconnected); + } + else +#endif + { app.DebugPrintf("Handling eAppAction_EthernetDisconnected - Not host\n"); // need to clear the player stats - can't assume it'll be done in setlevel - we may not be in the game StatsCounter* pStats = Minecraft::GetInstance()->stats[ i ]; @@ -3257,12 +3447,14 @@ void CMinecraftApp::HandleXuiActions(void) UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST), g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE), uiIDA, 1, i,&CMinecraftApp::EthernetDisconnectReturned,this, app.GetStringTable()); + ui.RequestErrorMessage(g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST), g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE), uiIDA, 1, i,&CMinecraftApp::EthernetDisconnectReturned,this); + + } } } } break; - // We currently handle both these returns the same way. + // We currently handle both these returns the same way. case eAppAction_EthernetDisconnectedReturned: case eAppAction_PrimaryPlayerSignedOutReturned: { @@ -3294,14 +3486,14 @@ void CMinecraftApp::HandleXuiActions(void) ui.HideAllGameUIElements(); ui.CloseAllPlayersScenes(); - + // 4J Stu - Fix for #12368 - Crash: Game crashes when saving then exiting and selecting to save for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) { #ifdef _XBOX app.TutorialSceneNavigateBack(idx,true); #endif - + // 4J Stu - Fix for #13257 - CRASH: Gameplay: Title crashed after exiting the tutorial // It doesn't matter if they were in the tutorial already pMinecraft->playerLeftTutorial( idx ); @@ -3352,7 +3544,7 @@ void CMinecraftApp::HandleXuiActions(void) uiIDA[0]=IDS_UNLOCK_TITLE; uiIDA[1]=IDS_EXIT_GAME; - ui.RequestMessageBox(IDS_TRIALOVER_TITLE, IDS_TRIALOVER_TEXT, uiIDA, 2, i,&CMinecraftApp::TrialOverReturned,this,app.GetStringTable()); + ui.RequestErrorMessage(IDS_TRIALOVER_TITLE, IDS_TRIALOVER_TEXT, uiIDA, 2, i,&CMinecraftApp::TrialOverReturned,this); } break; @@ -3366,7 +3558,7 @@ void CMinecraftApp::HandleXuiActions(void) uiIDA[0]=IDS_CONFIRM_OK; uiIDA[1]=IDS_CONFIRM_CANCEL; - ui.RequestMessageBox(IDS_UNLOCK_TITLE, IDS_UNLOCK_ACCEPT_INVITE, uiIDA, 2, i,&CMinecraftApp::UnlockFullInviteReturned,this,app.GetStringTable()); + ui.RequestErrorMessage(IDS_UNLOCK_TITLE, IDS_UNLOCK_ACCEPT_INVITE, uiIDA, 2, i,&CMinecraftApp::UnlockFullInviteReturned,this); } break; case eAppAction_ExitAndJoinFromInvite: @@ -3384,7 +3576,7 @@ void CMinecraftApp::HandleXuiActions(void) uiIDA[1]=IDS_EXIT_GAME_SAVE; uiIDA[2]=IDS_EXIT_GAME_NO_SAVE; - ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_LEAVE_VIA_INVITE, uiIDA, 3, i,&CMinecraftApp::ExitAndJoinFromInviteSaveDialogReturned,this, app.GetStringTable(), 0, 0, false); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_LEAVE_VIA_INVITE, uiIDA, 3, i,&CMinecraftApp::ExitAndJoinFromInviteSaveDialogReturned,this); } else #else @@ -3394,7 +3586,7 @@ void CMinecraftApp::HandleXuiActions(void) uiIDA[1]=IDS_EXIT_GAME_SAVE; uiIDA[2]=IDS_EXIT_GAME_NO_SAVE; - ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_LEAVE_VIA_INVITE, uiIDA, 3, i,&CMinecraftApp::ExitAndJoinFromInviteSaveDialogReturned,this, app.GetStringTable(), 0, 0, false); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_LEAVE_VIA_INVITE, uiIDA, 3, i,&CMinecraftApp::ExitAndJoinFromInviteSaveDialogReturned,this); } else #endif @@ -3406,13 +3598,13 @@ void CMinecraftApp::HandleXuiActions(void) // upsell uiIDA[0]=IDS_CONFIRM_OK; uiIDA[1]=IDS_CONFIRM_CANCEL; - ui.RequestMessageBox(IDS_UNLOCK_TITLE, IDS_UNLOCK_ACCEPT_INVITE, uiIDA, 2, i,&CMinecraftApp::UnlockFullInviteReturned,this,app.GetStringTable()); + ui.RequestErrorMessage(IDS_UNLOCK_TITLE, IDS_UNLOCK_ACCEPT_INVITE, uiIDA, 2, i,&CMinecraftApp::UnlockFullInviteReturned,this); } else { uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_LEAVE_VIA_INVITE, uiIDA, 2,i,&CMinecraftApp::ExitAndJoinFromInvite,this,app.GetStringTable(), 0, 0, false); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_LEAVE_VIA_INVITE, uiIDA, 2,i,&CMinecraftApp::ExitAndJoinFromInvite,this); } } } @@ -3430,14 +3622,14 @@ void CMinecraftApp::HandleXuiActions(void) SetGameStarted(false); ui.CloseAllPlayersScenes(); - + // 4J Stu - Fix for #12368 - Crash: Game crashes when saving then exiting and selecting to save for(unsigned int idx = 0; idx < XUSER_MAX_COUNT; ++idx) { #ifdef _XBOX app.TutorialSceneNavigateBack(idx,true); #endif - + // 4J Stu - Fix for #13257 - CRASH: Gameplay: Title crashed after exiting the tutorial // It doesn't matter if they were in the tutorial already pMinecraft->playerLeftTutorial( idx ); @@ -3567,8 +3759,8 @@ void CMinecraftApp::HandleXuiActions(void) // 4J Stu - Copied this from XUI_FullScreenProgress to properly handle the fail case, as the thread will no longer be failing UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox( IDS_CONNECTION_FAILED, IDS_CONNECTION_LOST_SERVER, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); - + ui.RequestErrorMessage( IDS_CONNECTION_FAILED, IDS_CONNECTION_LOST_SERVER, uiIDA,1,ProfileManager.GetPrimaryPad()); + ui.NavigateToHomeMenu(); ui.UpdatePlayerBasePositions(); } @@ -3580,7 +3772,7 @@ void CMinecraftApp::HandleXuiActions(void) if( g_NetworkManager.IsInGameplay() ) { // This kicks off a thread that waits for the server to end, then closes the current session, starts a new one and joins the local players into it - + SetAction(i,eAppAction_Idle); if( !GetChangingSessionType() && !g_NetworkManager.IsLocalGame() ) @@ -3597,11 +3789,11 @@ void CMinecraftApp::HandleXuiActions(void) ui.CloseAllPlayersScenes(); } ui.ShowOtherPlayersBaseScene(ProfileManager.GetPrimaryPad(), true); - + // Remove this line to fix: // #49084 - TU5: Code: Gameplay: The title crashes every time client navigates to 'Play game' menu and loads/creates new game after a "Connection to Xbox LIVE was lost" message has appeared. //app.NavigateToScene(0,eUIScene_Main); - + LoadingInputParams *loadingParams = new LoadingInputParams(); loadingParams->func = &CGameNetworkManager::ChangeSessionTypeThreadProc; loadingParams->lpParam = NULL; @@ -3663,7 +3855,7 @@ void CMinecraftApp::HandleXuiActions(void) CheckGameSettingsChanged(true,i); break; - + case eAppAction_RemoteServerSave: { // If the remote server save has already finished, don't complete the action @@ -3674,7 +3866,7 @@ void CMinecraftApp::HandleXuiActions(void) } SetAction(i,eAppAction_WaitRemoteServerSaveComplete); - + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) { ui.CloseUIScenes(i, true); @@ -3716,7 +3908,7 @@ void CMinecraftApp::HandleXuiActions(void) { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); if(result != C4JStorage::EMessage_Busy) SetAction(i,eAppAction_Idle); } break; @@ -3736,7 +3928,7 @@ void CMinecraftApp::HandleXuiActions(void) MinecraftServer::resetFlags(); } break; - + case eAppAction_BanLevel: { // It's possible that this state can get set after the game has been exited (e.g. by network disconnection) so we can't ban the level at that point @@ -3780,7 +3972,7 @@ void CMinecraftApp::HandleXuiActions(void) { swprintf(wchFormat, 40, L"%ls\n\n%%ls",player->GetOnlineName()); - C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_BANNED_LEVEL_TITLE, IDS_PLAYER_BANNED_LEVEL, uiIDA,2,i,&CMinecraftApp::BannedLevelDialogReturned,this, app.GetStringTable(),wchFormat); + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_BANNED_LEVEL_TITLE, IDS_PLAYER_BANNED_LEVEL, uiIDA,2,i,&CMinecraftApp::BannedLevelDialogReturned,this, wchFormat); if(result != C4JStorage::EMessage_Busy) SetAction(i,eAppAction_Idle); } else @@ -3809,7 +4001,7 @@ void CMinecraftApp::HandleXuiActions(void) Minecraft *pMinecraft = Minecraft::GetInstance(); pMinecraft->textures->reloadAll(); pMinecraft->skins->updateUI(); - + if(!pMinecraft->skins->isUsingDefaultSkin()) { TexturePack *pTexturePack = pMinecraft->skins->getSelected(); @@ -3833,11 +4025,37 @@ void CMinecraftApp::HandleXuiActions(void) Minecraft::GetInstance()->soundEngine->playStreaming(L"", 0, 0, 0, 1, 1); } } + break; + case eAppAction_ReloadFont: + { +#ifndef _XBOX + app.DebugPrintf( + "[Consoles_App] eAppAction_ReloadFont, ingame='%s'.\n", + app.GetGameStarted() ? "Yes" : "No" ); + + SetAction(i,eAppAction_Idle); + + ui.SetTooltips(i, -1); + + ui.ReloadSkin(); + ui.StartReloadSkinThread(); + + ui.setCleanupOnReload(); +#endif + } break; case eAppAction_TexturePackRequired: { +#if defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ + UINT uiIDA[2]; + uiIDA[0]=IDS_TEXTUREPACK_FULLVERSION; + uiIDA[1]=IDS_CONFIRM_CANCEL; // let them continue without the texture pack here (as this is only really for r + // Give the player a warning about the texture pack missing + ui.RequestErrorMessage(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::TexturePackDialogReturned,this); + SetAction(i,eAppAction_Idle); +#else #ifdef _XBOX ULONGLONG ullOfferID_Full; app.GetDLCFullOfferIDForPackID(app.GetRequiredTexturePackID(),&ullOfferID_Full); @@ -3850,8 +4068,9 @@ void CMinecraftApp::HandleXuiActions(void) uiIDA[1]=IDS_TEXTURE_PACK_TRIALVERSION; // Give the player a warning about the texture pack missing - ui.RequestMessageBox(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::TexturePackDialogReturned,this,app.GetStringTable()); + ui.RequestErrorMessage(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::TexturePackDialogReturned,this); SetAction(i,eAppAction_Idle); +#endif } break; @@ -3877,7 +4096,7 @@ void CMinecraftApp::HandleXuiActions(void) app.TMSPP_RetrieveFileList(i,C4JStorage::eGlobalStorage_Title,eTMSAction_TMSPP_UserFileList); #else SetTMSAction(i,eTMSAction_TMSPP_UserFileList); - #endif +#endif break; #ifdef _XBOX @@ -3983,47 +4202,47 @@ void CMinecraftApp::HandleXuiActions(void) // TMS files -/* case eTMSAction_TMS_RetrieveFiles_CreateLoad_SignInReturned: - case eTMSAction_TMS_RetrieveFiles_RunPlayGame: -#ifdef _XBOX + /* case eTMSAction_TMS_RetrieveFiles_CreateLoad_SignInReturned: + case eTMSAction_TMS_RetrieveFiles_RunPlayGame: + #ifdef _XBOX SetTMSAction(i,eTMSAction_TMS_XUIDSFile_Waiting); // pass in the next app action on the call or callback completing app.ReadXuidsFileFromTMS(i,eTMSAction_TMS_DLCFile,true); -#else + #else SetTMSAction(i,eTMSAction_TMS_DLCFile); -#endif + #endif break; - case eTMSAction_TMS_DLCFile: -#ifdef _XBOX + case eTMSAction_TMS_DLCFile: + #ifdef _XBOX SetTMSAction(i,eTMSAction_TMS_DLCFile_Waiting); // pass in the next app action on the call or callback completing app.ReadDLCFileFromTMS(i,eTMSAction_TMS_BannedListFile,true); -#else + #else SetTMSAction(i,eTMSAction_TMS_BannedListFile); -#endif + #endif break; - case eTMSAction_TMS_RetrieveFiles_HelpAndOptions: - case eTMSAction_TMS_RetrieveFiles_DLCMain: -#ifdef _XBOX + case eTMSAction_TMS_RetrieveFiles_HelpAndOptions: + case eTMSAction_TMS_RetrieveFiles_DLCMain: + #ifdef _XBOX SetTMSAction(i,eTMSAction_TMS_DLCFile_Waiting); // pass in the next app action on the call or callback completing app.ReadDLCFileFromTMS(i,eTMSAction_Idle,true); -#else + #else SetTMSAction(i,eTMSAction_Idle); -#endif + #endif break; - case eTMSAction_TMS_BannedListFile: -#ifdef _XBOX + case eTMSAction_TMS_BannedListFile: + #ifdef _XBOX SetTMSAction(i,eTMSAction_TMS_BannedListFile_Waiting); // pass in the next app action on the call or callback completing app.ReadBannedList(i, eTMSAction_TMS_RetrieveFiles_Complete,true); -#else + #else SetTMSAction(i,eTMSAction_TMS_RetrieveFiles_Complete); -#endif + #endif break; @@ -4102,12 +4321,12 @@ void CMinecraftApp::loadMediaArchive() #if 0 string path = "Common\\media.arc"; HANDLE hFile = CreateFile( path.c_str(), - GENERIC_READ, - FILE_SHARE_READ, - NULL, - OPEN_EXISTING, - FILE_FLAG_SEQUENTIAL_SCAN, - NULL ); + GENERIC_READ, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_FLAG_SEQUENTIAL_SCAN, + NULL ); if( hFile != INVALID_HANDLE_VALUE ) { @@ -4120,10 +4339,10 @@ void CMinecraftApp::loadMediaArchive() DWORD m_fSize = 0; BOOL hr = ReadFile( hFile, - m_fBody, - dwFileSize, - &m_fSize, - NULL ); + m_fBody, + dwFileSize, + &m_fSize, + NULL ); assert( m_fSize == dwFileSize ); @@ -4199,10 +4418,8 @@ int CMinecraftApp::EthernetDisconnectReturned(void *pParam,int iPad,const C4JSto else { // 4J-PB - turn off the PSN store icon just in case this happened when we were in one of the DLC menus -#ifdef __ORBIS__ - sceNpCommerceHidePsStoreIcon(); -#elif defined __PSVITA__ - sceNpCommerce2HidePsStoreIcon(); +#if defined __ORBIS__ || defined __PSVITA__ + app.GetCommerce()->HidePsStoreIcon(); #endif app.SetAction(iPad,eAppAction_EthernetDisconnectedReturned_Menus); } @@ -4326,7 +4543,7 @@ int CMinecraftApp::SignoutExitWorldThreadProc( void* lpParameter ) app.m_gameRules.unloadCurrentGameRules(); // MinecraftServer::resetFlags(); - + // We can't start/join a new game until the session is destroyed, so wait for it to be idle again while( g_NetworkManager.IsInSession() ) { @@ -4362,7 +4579,7 @@ int CMinecraftApp::UnlockFullInviteReturned(void *pParam,int iPad,C4JStorage::EM { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,&app, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); } else #endif @@ -4377,7 +4594,7 @@ int CMinecraftApp::UnlockFullInviteReturned(void *pParam,int iPad,C4JStorage::EM UINT uiIDA[2]; uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::MustSignInFullVersionPurchaseReturned,&app, app.GetStringTable()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::MustSignInFullVersionPurchaseReturned,&app); } #endif @@ -4407,7 +4624,7 @@ int CMinecraftApp::UnlockFullSaveReturned(void *pParam,int iPad,C4JStorage::EMes { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,&app, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); } else #endif @@ -4422,7 +4639,7 @@ int CMinecraftApp::UnlockFullSaveReturned(void *pParam,int iPad,C4JStorage::EMes UINT uiIDA[2]; uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::MustSignInFullVersionPurchaseReturned,&app, app.GetStringTable()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::MustSignInFullVersionPurchaseReturned,&app); } #elif defined(__ORBIS__) else @@ -4435,14 +4652,14 @@ int CMinecraftApp::UnlockFullSaveReturned(void *pParam,int iPad,C4JStorage::EMes UINT uiIDA[1]; uiIDA[0] = IDS_OK; - ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad); } else { // Not signed in to PSN UINT uiIDA[1]; uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; - ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, iPad, &CMinecraftApp::MustSignInFullVersionPurchaseReturned,&app, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, iPad, &CMinecraftApp::MustSignInFullVersionPurchaseReturned,&app); } } #endif @@ -4472,7 +4689,7 @@ int CMinecraftApp::UnlockFullExitReturned(void *pParam,int iPad,C4JStorage::EMes { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,&app, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); } else #endif @@ -4491,7 +4708,7 @@ int CMinecraftApp::UnlockFullExitReturned(void *pParam,int iPad,C4JStorage::EMes UINT uiIDA[2]; uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::MustSignInFullVersionPurchaseReturnedExitTrial,&app, app.GetStringTable()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::MustSignInFullVersionPurchaseReturnedExitTrial,&app); } #elif defined(__ORBIS__) else @@ -4504,7 +4721,7 @@ int CMinecraftApp::UnlockFullExitReturned(void *pParam,int iPad,C4JStorage::EMes UINT uiIDA[1]; uiIDA[0] = IDS_OK; - ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad); // still need to exit the trial or we'll be in the Pause menu with input ignored pApp->SetAction(pMinecraft->player->GetXboxPad(),eAppAction_ExitWorldTrial); } @@ -4513,7 +4730,7 @@ int CMinecraftApp::UnlockFullExitReturned(void *pParam,int iPad,C4JStorage::EMes // Not signed in to PSN UINT uiIDA[1]; uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; - ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, iPad, &CMinecraftApp::MustSignInFullVersionPurchaseReturnedExitTrial,&app, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, iPad, &CMinecraftApp::MustSignInFullVersionPurchaseReturnedExitTrial,&app); } } #endif @@ -4545,7 +4762,7 @@ int CMinecraftApp::TrialOverReturned(void *pParam,int iPad,C4JStorage::EMessageR { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,&app, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); } else #endif @@ -4561,7 +4778,7 @@ int CMinecraftApp::TrialOverReturned(void *pParam,int iPad,C4JStorage::EMessageR UINT uiIDA[2]; uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::MustSignInFullVersionPurchaseReturned,&app, app.GetStringTable()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::MustSignInFullVersionPurchaseReturned,&app); // 4J Stu - We can't actually exit the game, so just exit back to the main menu //pApp->SetAction(pMinecraft->player->GetXboxPad(),eAppAction_ExitWorldTrial); @@ -4629,7 +4846,7 @@ void CMinecraftApp::SignInChangeCallback(LPVOID pParam,bool bPrimaryPlayerChange { // Primary Player gone or there's been a sign out and sign in of the primary player, so kick them out pApp->SetAction(iPrimaryPlayer,eAppAction_PrimaryPlayerSignedOut); - + // 4J-PB - invalidate their banned level list pApp->InvalidateBannedList(iPrimaryPlayer); @@ -4665,7 +4882,7 @@ void CMinecraftApp::SignInChangeCallback(LPVOID pParam,bool bPrimaryPlayerChange { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_GUEST_ORDER_CHANGED_TITLE, IDS_GUEST_ORDER_CHANGED_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,NULL,app.GetStringTable()); + ui.RequestErrorMessage(IDS_GUEST_ORDER_CHANGED_TITLE, IDS_GUEST_ORDER_CHANGED_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad()); } // 4J Stu - On PS4 we can also cause to exit players if they are signed out here, but we shouldn't do that if @@ -4687,7 +4904,7 @@ void CMinecraftApp::SignInChangeCallback(LPVOID pParam,bool bPrimaryPlayerChange if(hasGuestIdChanged && pApp->m_currentSigninInfo[i].dwGuestNumber != 0 && g_NetworkManager.GetLocalPlayerByUserIndex(i)!=NULL) { pApp->DebugPrintf("Recommending removal of player at index %d because their guest id changed\n",i); - pApp->SetAction(i,eAppAction_ExitPlayer); + pApp->SetAction(i, eAppAction_ExitPlayer); } else { @@ -4705,11 +4922,13 @@ void CMinecraftApp::SignInChangeCallback(LPVOID pParam,bool bPrimaryPlayerChange // 4J-PB - invalidate their banned level list pApp->DebugPrintf("Player at index %d Left - invalidating their banned list\n",i); pApp->InvalidateBannedList(i); - - if(g_NetworkManager.GetLocalPlayerByUserIndex(i)!=NULL) + + // 4J-HG: If either the player is in the network manager or in the game, need to exit player + // TODO: Do we need to check the network manager? + if (g_NetworkManager.GetLocalPlayerByUserIndex(i) != NULL || Minecraft::GetInstance()->localplayers[i] != NULL) { pApp->DebugPrintf("Player %d signed out\n", i); - pApp->SetAction(i,eAppAction_ExitPlayer); + pApp->SetAction(i, eAppAction_ExitPlayer); } } } @@ -4735,15 +4954,20 @@ void CMinecraftApp::SignInChangeCallback(LPVOID pParam,bool bPrimaryPlayerChange pApp->SetAction(iPrimaryPlayer,eAppAction_EthernetDisconnected); } - + g_NetworkManager.HandleSignInChange(); } // Some menus require the player to be signed in to live, so if this callback happens and the primary player is // no longer signed in then nav back else if ( pApp->GetLiveLinkRequired() && !ProfileManager.IsSignedInLive( ProfileManager.GetLockedProfile() ) ) { +#ifdef __PSVITA__ + if(!CGameNetworkManager::usingAdhocMode()) // if we're in adhoc mode, we can ignore this +#endif + { pApp->SetAction(iPrimaryPlayer,eAppAction_EthernetDisconnected); } + } #if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__ ) // 4J-JEV: Need to kick of loading of profile data for sub-sign in players. @@ -4930,16 +5154,16 @@ void CMinecraftApp::UpsellReturnedCallback(LPVOID pParam, eUpsellType type, eUps #ifdef __PS3__ // special case for people who are not signed in to the PSN while playing the trial game case eUpsellResponse_UserNotSignedInPSN: - + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::MustSignInFullVersionPurchaseReturned,&app, app.GetStringTable()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::MustSignInFullVersionPurchaseReturned,&app); return; case eUpsellResponse_NotAllowedOnline: // On earning a trophy in the trial version, where the user is underage and can't go online to buy the game, but they selected to buy the game on the trophy upsell uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,&app, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); break; #endif case eUpsellResponse_Declined: @@ -4963,6 +5187,13 @@ void CMinecraftApp::UpsellReturnedCallback(LPVOID pParam, eUpsellType type, eUps TelemetryManager->RecordUpsellResponded(ProfileManager.GetPrimaryPad(), eSen_UpsellID_Full_Version_Of_Game, app.m_dwOfferID, senResponse); } +#ifdef _DEBUG_MENUS_ENABLED +bool CMinecraftApp::DebugArtToolsOn() +{ + return DebugSettingsOn() && (GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L< 0) { - Minecraft *pMinecraft=Minecraft::GetInstance(); - pMinecraft->levelRenderer->AddDLCSkinsToMemTextures(); + Minecraft *pMinecraft=Minecraft::GetInstance(); + pMinecraft->levelRenderer->AddDLCSkinsToMemTextures(); } */ @@ -5107,6 +5338,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 +5383,7 @@ int CMinecraftApp::DLCMountedCallback(LPVOID pParam,int iPad,DWORD dwErr,DWORD d app.m_dlcManager.removePack(pack); pack = NULL; } - + if(pack == NULL) { app.DebugPrintf("Pack \"%ls\" is not installed, so adding it\n", CONTENT_DATA_DISPLAY_NAME(ContentData)); @@ -5211,20 +5452,25 @@ int CMinecraftApp::DLCMountedCallback(LPVOID pParam,int iPad,DWORD dwErr,DWORD d // } // } - void CMinecraftApp::HandleDLC(DLCPack *pack) - { - DWORD dwFilesProcessed = 0; +void CMinecraftApp::HandleDLC(DLCPack *pack) +{ + DWORD dwFilesProcessed = 0; #ifndef _XBOX #if defined(__PS3__) || defined(__ORBIS__) || defined(_WINDOWS64) || defined (__PSVITA__) - std::vector dlcFilenames; + std::vector dlcFilenames; #elif defined _DURANGO - std::vector dlcFilenames; + std::vector dlcFilenames; +#endif + StorageManager.GetMountedDLCFileList("DLCDrive", dlcFilenames); +#ifdef __ORBIS__ + // 4J Stu - I don't know why we handle more than one file here any more, however this doesn't seem to work with the PS4 patches + if(dlcFilenames.size() > 0) m_dlcManager.readDLCDataFile(dwFilesProcessed, dlcFilenames[0], pack); +#else + for(int i=0; iucRefCount; @@ -5667,7 +5913,7 @@ int CMinecraftApp::ExitAndJoinFromInviteSaveDialogReturned(void *pParam,int iPad uiIDA[1]=IDS_CONFIRM_CANCEL; // Give the player a warning about the trial version of the texture pack - ui.RequestMessageBox(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, iPad,&CMinecraftApp::WarningTrialTexturePackReturned,pClass,app.GetStringTable()); + ui.RequestErrorMessage(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, iPad,&CMinecraftApp::WarningTrialTexturePackReturned,pClass); return S_OK; } @@ -5683,7 +5929,7 @@ int CMinecraftApp::ExitAndJoinFromInviteSaveDialogReturned(void *pParam,int iPad UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::ExitAndJoinFromInviteAndSaveReturned,pClass, app.GetStringTable()); + ui.RequestErrorMessage(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::ExitAndJoinFromInviteAndSaveReturned,pClass); return 0; } else @@ -5701,7 +5947,7 @@ int CMinecraftApp::ExitAndJoinFromInviteSaveDialogReturned(void *pParam,int iPad UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_TITLE_DECLINE_SAVE_GAME, IDS_CONFIRM_DECLINE_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::ExitAndJoinFromInviteDeclineSaveReturned,pClass, app.GetStringTable()); + ui.RequestErrorMessage(IDS_TITLE_DECLINE_SAVE_GAME, IDS_CONFIRM_DECLINE_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CMinecraftApp::ExitAndJoinFromInviteDeclineSaveReturned,pClass); return 0; } @@ -5712,6 +5958,102 @@ int CMinecraftApp::ExitAndJoinFromInviteSaveDialogReturned(void *pParam,int iPad int CMinecraftApp::WarningTrialTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) { + // 4J Stu - I added this in when fixing an X1 bug. We should probably add this as well but I don't have time to test all platforms atm +#if 0 //defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + if(result==C4JStorage::EMessage_ResultAccept) + { + if(!ProfileManager.IsSignedInLive(iPad)) + { + // you're not signed in to PSN! + + } + else + { + // 4J-PB - need to check this user can access the store + bool bContentRestricted; + ProfileManager.GetChatAndContentRestrictions(iPad,true,NULL,&bContentRestricted,NULL); + if(bContentRestricted) + { + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); + } + else + { + // need to get info on the pack to see if the user has already downloaded it + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + // retrieve the store name for the skin pack + DLCPack *pDLCPack=pDLCTexPack->getDLCInfoParentPack();//tPack->getDLCPack(); + const char *pchPackName=wstringtofilename(pDLCPack->getName()); + app.DebugPrintf("Texture Pack - %s\n",pchPackName); + SONYDLC *pSONYDLCInfo=app.GetSONYDLCInfo((char *)pchPackName); + + if(pSONYDLCInfo!=NULL) + { + char chName[42]; + char chSkuID[SCE_NP_COMMERCE2_SKU_ID_LEN]; + + memset(chSkuID,0,SCE_NP_COMMERCE2_SKU_ID_LEN); + // find the info on the skin pack + // we have to retrieve the skuid from the store info, it can't be hardcoded since Sony may change it. + // So we assume the first sku for the product is the one we want +#ifdef __ORBIS__ + sprintf(chName,"%s",pSONYDLCInfo->chDLCKeyname); +#else + sprintf(chName,"%s-%s",app.GetCommerceCategory(),pSONYDLCInfo->chDLCKeyname); +#endif + app.GetDLCSkuIDFromProductList(chName,chSkuID); + // 4J-PB - need to check for an empty store +#if defined __ORBIS__ || defined __PSVITA__ || defined __PS3__ + if(app.CheckForEmptyStore(iPad)==false) +#endif + { + if(app.DLCAlreadyPurchased(chSkuID)) + { + app.DownloadAlreadyPurchased(chSkuID); + } + else + { + app.Checkout(chSkuID); + } + } + } + } + } + } +#endif // + +#ifdef _XBOX_ONE + if(result==C4JStorage::EMessage_ResultAccept) + { + if(ProfileManager.IsSignedIn(iPad)) + { + if (ProfileManager.IsSignedInLive(iPad)) + { + TexturePack *tPack = Minecraft::GetInstance()->skins->getSelected(); + // get the dlc texture pack + DLCTexturePack *pDLCTexPack=(DLCTexturePack *)tPack; + + DLCPack *pDLCPack=pDLCTexPack->getDLCInfoParentPack(); + + DLC_INFO *pDLCInfo=app.GetDLCInfoForProductName((WCHAR *)pDLCPack->getName().c_str()); + + StorageManager.InstallOffer(1,(WCHAR *)pDLCInfo->wsProductId.c_str(),NULL,NULL); + + // the license change coming in when the offer has been installed will cause this scene to refresh + } + else + { + // 4J-JEV: Fix for XB1: #165863 - XR-074: Compliance: With no active network connection user is unable to convert from Trial to Full texture pack and is not messaged why. + UINT uiIDA[1] = { IDS_CONFIRM_OK }; + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad); + } + } + } + +#endif #ifdef _XBOX CMinecraftApp* pClass = (CMinecraftApp*)pParam; @@ -5777,7 +6119,7 @@ int CMinecraftApp::ExitAndJoinFromInviteAndSaveReturned(void *pParam,int iPad,C4 uiIDA[1]=IDS_CONFIRM_CANCEL; // Give the player a warning about the trial version of the texture pack - ui.RequestMessageBox(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, iPad,&CMinecraftApp::WarningTrialTexturePackReturned,NULL,app.GetStringTable()); + ui.RequestErrorMessage(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, iPad,&CMinecraftApp::WarningTrialTexturePackReturned,NULL); return S_OK; } @@ -5797,7 +6139,7 @@ int CMinecraftApp::ExitAndJoinFromInviteDeclineSaveReturned(void *pParam,int iPa if(result==C4JStorage::EMessage_ResultDecline) { #if defined(_XBOX_ONE) || defined(__ORBIS__) - StorageManager.SetSaveDisabled(false); + StorageManager.SetSaveDisabled(false); #endif MinecraftServer::getInstance()->setSaveOnExit( false ); // flag a app action of exit and join game from invite @@ -5919,9 +6261,9 @@ void CMinecraftApp::InitialiseTips() // randomise then quicksort // going to leave the multiplayer tip so it is always first -// Only randomise the content package build + // Only randomise the content package build #ifdef _CONTENT_PACKAGE - + for(int i=1;inextInt(); @@ -6019,7 +6361,7 @@ int CMinecraftApp::GetHTMLFontSize(EHTMLFontSize size) wstring CMinecraftApp::FormatHTMLString(int iPad, const wstring &desc, int shadowColour /*= 0xFFFFFFFF*/) { wstring text(desc); - + wchar_t replacements[64]; // We will also insert line breaks here as couldn't figure out how to get them to come through from strings.resx ! text = replaceAll(text, L"{*B*}", L"
" ); @@ -6094,6 +6436,8 @@ wstring CMinecraftApp::FormatHTMLString(int iPad, const wstring &desc, int shado text = replaceAll(text, L"{*CONTROLLER_ACTION_CRAFTING*}", GetActionReplacement(iPad,MINECRAFT_ACTION_CRAFTING ) ); text = replaceAll(text, L"{*CONTROLLER_ACTION_DROP*}", GetActionReplacement(iPad,MINECRAFT_ACTION_DROP ) ); text = replaceAll(text, L"{*CONTROLLER_ACTION_CAMERA*}", GetActionReplacement(iPad,MINECRAFT_ACTION_RENDER_THIRD_PERSON ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_MENU_PAGEDOWN*}", GetActionReplacement(iPad,ACTION_MENU_PAGEDOWN ) ); + text = replaceAll(text, L"{*CONTROLLER_ACTION_DISMOUNT*}", GetActionReplacement(iPad,MINECRAFT_ACTION_SNEAK_TOGGLE ) ); text = replaceAll(text, L"{*CONTROLLER_VK_A*}", GetVKReplacement(VK_PAD_A) ); text = replaceAll(text, L"{*CONTROLLER_VK_B*}", GetVKReplacement(VK_PAD_B) ); text = replaceAll(text, L"{*CONTROLLER_VK_X*}", GetVKReplacement(VK_PAD_X) ); @@ -6198,20 +6542,20 @@ wstring CMinecraftApp::GetActionReplacement(int iPad, unsigned char ucAction) else if(input &_360_JOY_BUTTON_X) replacement = L"ButtonX"; else if(input &_360_JOY_BUTTON_Y) replacement = L"ButtonY"; else if( - (input &_360_JOY_BUTTON_LSTICK_UP) || - (input &_360_JOY_BUTTON_LSTICK_DOWN) || - (input &_360_JOY_BUTTON_LSTICK_LEFT) || - (input &_360_JOY_BUTTON_LSTICK_RIGHT) - ) + (input &_360_JOY_BUTTON_LSTICK_UP) || + (input &_360_JOY_BUTTON_LSTICK_DOWN) || + (input &_360_JOY_BUTTON_LSTICK_LEFT) || + (input &_360_JOY_BUTTON_LSTICK_RIGHT) + ) { replacement = L"ButtonLeftStick"; } else if( - (input &_360_JOY_BUTTON_RSTICK_LEFT) || - (input &_360_JOY_BUTTON_RSTICK_RIGHT) || - (input &_360_JOY_BUTTON_RSTICK_UP) || - (input &_360_JOY_BUTTON_RSTICK_DOWN) - ) + (input &_360_JOY_BUTTON_RSTICK_LEFT) || + (input &_360_JOY_BUTTON_RSTICK_RIGHT) || + (input &_360_JOY_BUTTON_RSTICK_UP) || + (input &_360_JOY_BUTTON_RSTICK_DOWN) + ) { replacement = L"ButtonRightStick"; } @@ -6465,7 +6809,7 @@ HRESULT CMinecraftApp::RegisterMojangData(WCHAR *pXuidName, PlayerUID xuid, WCHA pMojangData = new MOJANG_DATA; ZeroMemory(pMojangData,sizeof(MOJANG_DATA)); pMojangData->eXuid=eTempXuid; - + wcsncpy( pMojangData->wchSkin, pSkin, MAX_CAPENAME_SIZE); wcsncpy( pMojangData->wchCape, pCape, MAX_CAPENAME_SIZE); MojangData[xuid]=pMojangData; @@ -6483,27 +6827,27 @@ HRESULT CMinecraftApp::RegisterConfigValues(WCHAR *pType, int iValue) { HRESULT hr=S_OK; -// #ifdef _XBOX -// if(pType!=NULL) -// { -// if(wcscmp(pType,L"XboxOneTransfer")==0) -// { -// if(iValue>0) -// { -// app.m_bTransferSavesToXboxOne=true; -// } -// else -// { -// app.m_bTransferSavesToXboxOne=false; -// } -// } -// else if(wcscmp(pType,L"TransferSlotCount")==0) -// { -// app.m_uiTransferSlotC=iValue; -// } -// -// } -// #endif + // #ifdef _XBOX + // if(pType!=NULL) + // { + // if(wcscmp(pType,L"XboxOneTransfer")==0) + // { + // if(iValue>0) + // { + // app.m_bTransferSavesToXboxOne=true; + // } + // else + // { + // app.m_bTransferSavesToXboxOne=false; + // } + // } + // else if(wcscmp(pType,L"TransferSlotCount")==0) + // { + // app.m_uiTransferSlotC=iValue; + // } + // + // } + // #endif return hr; @@ -6630,18 +6974,18 @@ HRESULT CMinecraftApp::RegisterDLCData(eDLCContentType eType, WCHAR *pwchBannerN { case e_DLC_MashupPacks: case e_DLC_TexturePacks: - DLCTextures_PackID[iConfig]=pDLCData->wsProductId; + DLCTextures_PackID[iConfig]=pDLCData->wsProductId; break; } if(pwchFirstSkin[0]!=0) DLCInfo_SkinName[pwchFirstSkin]=pDLCData->wsProductId; - #ifdef _XBOX_ONE +#ifdef _XBOX_ONE // ignore the names, and use the product id instead DLCInfo_Full[pDLCData->wsProductId]=pDLCData; - #else +#else DLCInfo_Full[pDLCData->wsDisplayName]=pDLCData; - #endif +#endif } app.DebugPrintf("DLCInfo - type - %d, productID - %ls, name - %ls , banner - %ls, iconfig - %d, sort index - %d\n",eType,pwchProductId, pwchProductName,pwchBannerName, iConfig, uiSortIndex); return hr; @@ -6689,11 +7033,11 @@ HRESULT CMinecraftApp::RegisterDLCData(char *pchDLCName, unsigned int uiSortInde app.DebugPrintf(5,"Adding DLC - %s\n",pchDLCName); DLCInfo[pchDLCName]=pDLCData; -// if(ullOfferID_Trial!=0ll) DLCInfo_Trial[ullOfferID_Trial]=pDLCData; -// if(ullOfferID_Full!=0ll) DLCInfo_Full[ullOfferID_Full]=pDLCData; -// if(pFirstSkin[0]!=0) DLCInfo_SkinName[pFirstSkin]=ullOfferID_Full; + // if(ullOfferID_Trial!=0ll) DLCInfo_Trial[ullOfferID_Trial]=pDLCData; + // if(ullOfferID_Full!=0ll) DLCInfo_Full[ullOfferID_Full]=pDLCData; + // if(pFirstSkin[0]!=0) DLCInfo_SkinName[pFirstSkin]=ullOfferID_Full; -// DLCInfo[ullOfferID_Trial]=pDLCData; + // DLCInfo[ullOfferID_Trial]=pDLCData; return hr; } @@ -6965,7 +7309,7 @@ DLC_INFO *CMinecraftApp::GetDLCInfoForProductName(WCHAR *pwchProductName) } ++it; } - + return NULL; } @@ -6998,6 +7342,8 @@ void CMinecraftApp::EnterSaveNotificationSection() EnterCriticalSection(&m_saveNotificationCriticalSection); if( m_saveNotificationDepth++ == 0 ) { + if(g_NetworkManager.IsInSession()) // this can be triggered from the front end if we're downloading a save + { MinecraftServer::getInstance()->broadcastStartSavingPacket(); if( g_NetworkManager.IsLocalGame() && g_NetworkManager.GetPlayerCount() == 1 ) @@ -7005,6 +7351,7 @@ void CMinecraftApp::EnterSaveNotificationSection() app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)TRUE); } } + } LeaveCriticalSection(&m_saveNotificationCriticalSection); } @@ -7013,6 +7360,8 @@ void CMinecraftApp::LeaveSaveNotificationSection() EnterCriticalSection(&m_saveNotificationCriticalSection); if( --m_saveNotificationDepth == 0 ) { + if(g_NetworkManager.IsInSession()) // this can be triggered from the front end if we're downloading a save + { MinecraftServer::getInstance()->broadcastStopSavingPacket(); if( g_NetworkManager.IsLocalGame() && g_NetworkManager.GetPlayerCount() == 1 ) @@ -7020,6 +7369,7 @@ void CMinecraftApp::LeaveSaveNotificationSection() app.SetXuiServerAction(ProfileManager.GetPrimaryPad(),eXuiServerAction_PauseServer,(void *)FALSE); } } + } LeaveCriticalSection(&m_saveNotificationCriticalSection); } @@ -7069,12 +7419,12 @@ int CMinecraftApp::RemoteSaveThreadProc( void* lpParameter ) void CMinecraftApp::ExitGameFromRemoteSave( LPVOID lpParameter ) { int primaryPad = ProfileManager.GetPrimaryPad(); - + UINT uiIDA[3]; uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 2, primaryPad,&CMinecraftApp::ExitGameFromRemoteSaveDialogReturned,NULL, app.GetStringTable(), 0, 0, false); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 2, primaryPad,&CMinecraftApp::ExitGameFromRemoteSaveDialogReturned,NULL); } int CMinecraftApp::ExitGameFromRemoteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) @@ -7212,12 +7562,12 @@ void CMinecraftApp::RemoveLevelFromBannedLevelList(int iPad, PlayerUID xuid, cha { //bool bFound=false; //bool bRes; - + // we will have retrieved the banned level list from TMS, so remove this one from it and write it back to TMS for(AUTO_VAR(it, m_vBannedListA[iPad]->begin()); it != m_vBannedListA[iPad]->end(); ) { PBANNEDLISTDATA pBannedListData = *it; - + if(pBannedListData!=NULL) { #ifdef _XBOX_ONE @@ -7327,8 +7677,8 @@ void CMinecraftApp::SetGameHostOption(eGameHostOption eVal,unsigned int uiVal) } -void CMinecraftApp::SetGameHostOption(unsigned int &uiHostSettings, eGameHostOption eVal,unsigned int uiVal) - { +void CMinecraftApp::SetGameHostOption(unsigned int &uiHostSettings, eGameHostOption eVal, unsigned int uiVal) +{ switch(eVal) { case eGameHostOption_FriendsOfFriends: @@ -7530,6 +7880,99 @@ void CMinecraftApp::SetGameHostOption(unsigned int &uiHostSettings, eGameHostOpt uiHostSettings&=~GAME_HOST_OPTION_BITMASK_DISABLESAVE; } break; + case eGameHostOption_WasntSaveOwner: + if(uiVal!=0) + { + uiHostSettings|=GAME_HOST_OPTION_BITMASK_NOTOWNER; + } + else + { + // off + uiHostSettings&=~GAME_HOST_OPTION_BITMASK_NOTOWNER; + } + break; + case eGameHostOption_MobGriefing: + if(uiVal!=1) + { + uiHostSettings |= GAME_HOST_OPTION_BITMASK_MOBGRIEFING; + } + else + { + // off + uiHostSettings &= ~GAME_HOST_OPTION_BITMASK_MOBGRIEFING; + } + break; + case eGameHostOption_KeepInventory: + if(uiVal!=0) + { + uiHostSettings |= GAME_HOST_OPTION_BITMASK_KEEPINVENTORY; + } + else + { + // off + uiHostSettings &= ~GAME_HOST_OPTION_BITMASK_KEEPINVENTORY; + } + break; + case eGameHostOption_DoMobSpawning: + if(uiVal!=1) + { + uiHostSettings |= GAME_HOST_OPTION_BITMASK_DOMOBSPAWNING; + } + else + { + // off + uiHostSettings &=~ GAME_HOST_OPTION_BITMASK_DOMOBSPAWNING; + } + break; + case eGameHostOption_DoMobLoot: + if(uiVal!=1) + { + uiHostSettings |= GAME_HOST_OPTION_BITMASK_DOMOBLOOT; + } + else + { + // off + uiHostSettings &= ~GAME_HOST_OPTION_BITMASK_DOMOBLOOT; + } + break; + case eGameHostOption_DoTileDrops: + if(uiVal!=1) + { + uiHostSettings |= GAME_HOST_OPTION_BITMASK_DOTILEDROPS; + } + else + { + // off + uiHostSettings &= ~GAME_HOST_OPTION_BITMASK_DOTILEDROPS; + } + break; + case eGameHostOption_NaturalRegeneration: + if(uiVal!=1) + { + uiHostSettings |= GAME_HOST_OPTION_BITMASK_NATURALREGEN; + } + else + { + // off + uiHostSettings &= ~GAME_HOST_OPTION_BITMASK_NATURALREGEN; + } + break; + case eGameHostOption_DoDaylightCycle: + if(uiVal!=1) + { + uiHostSettings |= GAME_HOST_OPTION_BITMASK_DODAYLIGHTCYCLE; + } + else + { + // off + uiHostSettings &= ~GAME_HOST_OPTION_BITMASK_DODAYLIGHTCYCLE; + } + break; + case eGameHostOption_WorldSize: + // clear the difficulty first + uiHostSettings&=~GAME_HOST_OPTION_BITMASK_WORLDSIZE; + uiHostSettings|=(GAME_HOST_OPTION_BITMASK_WORLDSIZE & (uiVal<> GAME_HOST_OPTION_BITMASK_WORLDSIZE_BITSHIFT; + case eGameHostOption_MobGriefing: + return !(uiHostSettings&GAME_HOST_OPTION_BITMASK_MOBGRIEFING); + case eGameHostOption_KeepInventory: + return (uiHostSettings&GAME_HOST_OPTION_BITMASK_KEEPINVENTORY); + case eGameHostOption_DoMobSpawning: + return !(uiHostSettings&GAME_HOST_OPTION_BITMASK_DOMOBSPAWNING); + case eGameHostOption_DoMobLoot: + return !(uiHostSettings&GAME_HOST_OPTION_BITMASK_DOMOBLOOT); + case eGameHostOption_DoTileDrops: + return !(uiHostSettings&GAME_HOST_OPTION_BITMASK_DOTILEDROPS); + case eGameHostOption_NaturalRegeneration: + return !(uiHostSettings&GAME_HOST_OPTION_BITMASK_NATURALREGEN); + case eGameHostOption_DoDaylightCycle: + return !(uiHostSettings&GAME_HOST_OPTION_BITMASK_DODAYLIGHTCYCLE); + break; } return false; @@ -7614,11 +8081,18 @@ unsigned int CMinecraftApp::GetGameHostOption(unsigned int uiHostSettings, eGame bool CMinecraftApp::CanRecordStatsAndAchievements() { + bool isTutorial = Minecraft::GetInstance() != NULL && Minecraft::GetInstance()->isTutorial(); // 4J Stu - All of these options give the host player some advantage, so should not allow achievements return !(app.GetGameHostOption(eGameHostOption_HasBeenInCreative) || app.GetGameHostOption(eGameHostOption_HostCanBeInvisible) || app.GetGameHostOption(eGameHostOption_HostCanChangeHunger) || - app.GetGameHostOption(eGameHostOption_HostCanFly)); + app.GetGameHostOption(eGameHostOption_HostCanFly) || + app.GetGameHostOption(eGameHostOption_WasntSaveOwner) || + !app.GetGameHostOption(eGameHostOption_MobGriefing) || + app.GetGameHostOption(eGameHostOption_KeepInventory) || + !app.GetGameHostOption(eGameHostOption_DoMobSpawning) || + (!app.GetGameHostOption(eGameHostOption_DoDaylightCycle) && !isTutorial ) + ); } void CMinecraftApp::processSchematics(LevelChunk *levelChunk) @@ -7723,8 +8197,8 @@ void CMinecraftApp::GetImageTextData(PBYTE pbImageData, DWORD dwImageBytes,unsig bHostOptionsRead = true; // read the host options value unsigned int uiValueC=0; - unsigned char pszHostOptions[8]; // Hex representation of unsigned int - ZeroMemory(&pszHostOptions,8); + unsigned char pszHostOptions[9]; // Hex representation of unsigned int + ZeroMemory(&pszHostOptions,9); while(*pszKeyword!=0 && (pszKeyword < ucPtr + uiCount + uiChunkLen) && uiValueC < 8) { pszHostOptions[uiValueC++]=*pszKeyword; @@ -7740,8 +8214,8 @@ void CMinecraftApp::GetImageTextData(PBYTE pbImageData, DWORD dwImageBytes,unsig { // read the texture pack value unsigned int uiValueC=0; - unsigned char pszTexturePack[8]; // Hex representation of unsigned int - ZeroMemory(&pszTexturePack,8); + unsigned char pszTexturePack[9]; // Hex representation of unsigned int + ZeroMemory(&pszTexturePack,9); while(*pszKeyword!=0 && (pszKeyword < ucPtr + uiCount + uiChunkLen) && uiValueC < 8) { pszTexturePack[uiValueC++]=*pszKeyword; @@ -7830,7 +8304,7 @@ bool CMinecraftApp::GetTerrainFeaturePosition(_eTerrainFeatureType eType,int *pX for(AUTO_VAR(it, m_vTerrainFeatures.begin()); it < m_vTerrainFeatures.end(); ++it) { FEATURE_DATA *pFeatureData=*it; - + if(pFeatureData->eTerrainFeature==eType) { *pX=pFeatureData->x; @@ -7936,7 +8410,14 @@ wstring CMinecraftApp::getEntityName(eINSTANCEOF type) // 4J-PB - fix for #107167 - Customer Encountered: TU12: Content: UI: There is no information what killed Player after being slain by Iron Golem. case eTYPE_VILLAGERGOLEM: return app.GetString(IDS_IRONGOLEM); - + case eTYPE_HORSE: + return app.GetString(IDS_HORSE); + case eTYPE_WITCH: + return app.GetString(IDS_WITCH); + case eTYPE_WITHERBOSS: + return app.GetString(IDS_WITHER); + case eTYPE_BAT: + return app.GetString(IDS_BAT); }; return L""; @@ -8015,29 +8496,29 @@ unsigned int CMinecraftApp::AddTMSPPFileTypeRequest(eDLCContentType eType, bool for(AUTO_VAR(it, m_TMSPPDownloadQueue.begin()); it != m_TMSPPDownloadQueue.end(); ++it) { - TMSPPRequest *pCurrent = *it; + TMSPPRequest *pCurrent = *it; - if(pCurrent->eType==eType) - { - if(!(pCurrent->eState == e_TMS_ContentState_Retrieving || pCurrent->eState == e_TMS_ContentState_Retrieved)) - { - // promote - if(bPromote) - { - m_TMSPPDownloadQueue.erase(m_TMSPPDownloadQueue.begin()+iPosition); - m_TMSPPDownloadQueue.insert(m_TMSPPDownloadQueue.begin(),pCurrent); - bPromoted=true; - } - } - } - iPosition++; + if(pCurrent->eType==eType) + { + if(!(pCurrent->eState == e_TMS_ContentState_Retrieving || pCurrent->eState == e_TMS_ContentState_Retrieved)) + { + // promote + if(bPromote) + { + m_TMSPPDownloadQueue.erase(m_TMSPPDownloadQueue.begin()+iPosition); + m_TMSPPDownloadQueue.insert(m_TMSPPDownloadQueue.begin(),pCurrent); + bPromoted=true; + } + } + } + iPosition++; } if(bPromoted) { - // re-ordered the list, so leave now - LeaveCriticalSection(&csTMSPPDownloadQueue); - return 0; + // re-ordered the list, so leave now + LeaveCriticalSection(&csTMSPPDownloadQueue); + return 0; } */ @@ -8185,7 +8666,7 @@ unsigned int CMinecraftApp::AddTMSPPFileTypeRequest(eDLCContentType eType, bool //if(iIndex!=-1) { bool bPresent = app.IsFileInMemoryTextures(cString); - + if(!bPresent) { // this may already be present in the vector because of a previous trial/full offer @@ -8329,7 +8810,7 @@ int CMinecraftApp::TMSPPFileReturned(LPVOID pParam,int iPad,int iUserData,C4JSto #if defined(_XBOX) || defined(_WINDOWS64) char szFile[MAX_TMSFILENAME_SIZE]; wcstombs(szFile,pCurrent->wchFilename,MAX_TMSFILENAME_SIZE); - + if(strcmp(szFilename,szFile)==0) #elif _XBOX_ONE @@ -8343,7 +8824,7 @@ int CMinecraftApp::TMSPPFileReturned(LPVOID pParam,int iPad,int iUserData,C4JSto { #ifdef _XBOX_ONE - + switch(pCurrent->eType) { @@ -8365,10 +8846,10 @@ int CMinecraftApp::TMSPPFileReturned(LPVOID pParam,int iPad,int iUserData,C4JSto if(pFileData->pbData[0]==0x89) { // 4J-PB - we need to allocate memory for the file data and copy into it, since the current data is a reference into the blob download memory - PBYTE pbData = new BYTE [pFileData->dwSize]; - memcpy(pbData,pFileData->pbData,pFileData->dwSize); - - pClass->m_vTMSPPData.push_back(pbData); + PBYTE pbData = new BYTE [pFileData->dwSize]; + memcpy(pbData,pFileData->pbData,pFileData->dwSize); + + pClass->m_vTMSPPData.push_back(pbData); app.DebugPrintf("Got image data - %ls\n",pCurrent->wchFilename); app.AddMemoryTextureFile(pCurrent->wchFilename, pbData, pFileData->dwSize); } @@ -8407,7 +8888,7 @@ int CMinecraftApp::TMSPPFileReturned(LPVOID pParam,int iPad,int iUserData,C4JSto } break; } - + } LeaveCriticalSection(&pClass->csTMSPPDownloadQueue); @@ -8661,7 +9142,7 @@ void CMinecraftApp::SetAdditionalSkinBoxes(DWORD dwSkinID, SKIN_BOX *SkinBoxA, D m_AdditionalModelParts.insert( std::pair *>(dwSkinID, pvModelPart) ); m_AdditionalSkinBoxes.insert( std::pair *>(dwSkinID, pvSkinBoxes) ); - + LeaveCriticalSection( &csAdditionalSkinBoxes ); LeaveCriticalSection( &csAdditionalModelParts ); @@ -8725,7 +9206,7 @@ vector *CMinecraftApp::GetAdditionalSkinBoxes(DWORD dwSkinID) pvSkinBoxes = (*it).second; } } - + LeaveCriticalSection( &csAdditionalSkinBoxes ); return pvSkinBoxes; } @@ -8770,14 +9251,14 @@ DWORD CMinecraftApp::getSkinIdFromPath(const wstring &skin) { bool dlcSkin = false; unsigned int skinId = 0; - + if(skin.size() >= 14) { dlcSkin = skin.substr(0,3).compare(L"dlc") == 0; wstring skinValue = skin.substr(7,skin.size()); skinValue = skinValue.substr(0,skinValue.find_first_of(L'.')); - + std::wstringstream ss; // 4J Stu - dlc skins are numbered using decimal to make it easier for artists/people to number manually // Everything else is numbered using hex @@ -8801,7 +9282,7 @@ wstring CMinecraftApp::getSkinPathFromId(DWORD skinId) { // 4J Stu - DLC skins are numbered using decimal rather than hex to make it easier to number manually swprintf(chars, 256, L"dlcskin%08d.png", GET_DLC_SKIN_ID_FROM_BITMASK(skinId)); - + } else { @@ -8822,6 +9303,61 @@ wstring CMinecraftApp::getSkinPathFromId(DWORD skinId) int CMinecraftApp::TexturePackDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) { + + +#if defined __PSVITA__ || defined __PS3__ || defined __ORBIS__ + if(result==C4JStorage::EMessage_ResultAccept) + { + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->skins->selectTexturePackById(app.GetRequiredTexturePackID()) ) + { + // it's been installed already + } + else + { + // we need to enable background downloading for the DLC + XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); + SONYDLC *pSONYDLCInfo=app.GetSONYDLCInfo(app.GetRequiredTexturePackID()); + if(pSONYDLCInfo!=NULL) + { + char chName[42]; + char chKeyName[20]; + char chSkuID[SCE_NP_COMMERCE2_SKU_ID_LEN]; + + memset(chSkuID,0,SCE_NP_COMMERCE2_SKU_ID_LEN); + // we have to retrieve the skuid from the store info, it can't be hardcoded since Sony may change it. + // So we assume the first sku for the product is the one we want + // MGH - keyname in the DLC file is 16 chars long, but there's no space for a NULL terminating char + memset(chKeyName, 0, sizeof(chKeyName)); + strncpy(chKeyName, pSONYDLCInfo->chDLCKeyname, 16); + + #ifdef __ORBIS__ + strcpy(chName, chKeyName); + #else + sprintf(chName,"%s-%s",app.GetCommerceCategory(),chKeyName); + #endif + app.GetDLCSkuIDFromProductList(chName,chSkuID); + // 4J-PB - need to check for an empty store + if(app.CheckForEmptyStore(iPad)==false) + { + if(app.DLCAlreadyPurchased(chSkuID)) + { + app.DownloadAlreadyPurchased(chSkuID); + } + else + { + app.Checkout(chSkuID); + } + } + } + } + } + else + { + app.DebugPrintf("Continuing without installing texture pack\n"); + } +#endif + #ifdef _XBOX if(result!=C4JStorage::EMessage_Cancelled) { @@ -8993,7 +9529,7 @@ bool CMinecraftApp::IsLocalMultiplayerAvailable() void CMinecraftApp::getLocale(vector &vecWstrLocales) { vector locales; - + DWORD dwSystemLanguage = XGetLanguage( ); // 4J-PB - restrict the 360 language until we're ready to have them in @@ -9101,6 +9637,8 @@ void CMinecraftApp::getLocale(vector &vecWstrLocales) case XC_LOCALE_CHILE: case XC_LOCALE_COLOMBIA: case XC_LOCALE_UNITED_STATES: + case XC_LOCALE_LATIN_AMERICA: + locales.push_back(eMCLang_laLAS); locales.push_back(eMCLang_esMX); break; default://XC_LOCALE_SPAIN @@ -9127,6 +9665,7 @@ void CMinecraftApp::getLocale(vector &vecWstrLocales) default: break; } + locales.push_back(eMCLang_hant); locales.push_back(eMCLang_zhCHT); break; case XC_LANGUAGE_PORTUGUESE : @@ -9170,26 +9709,21 @@ void CMinecraftApp::getLocale(vector &vecWstrLocales) { case XC_LOCALE_SINGAPORE: locales.push_back(eMCLang_zhSG); - break; + break; default: break; } - locales.push_back(eMCLang_zhCHS); + locales.push_back(eMCLang_hans); + locales.push_back(eMCLang_csCS); locales.push_back(eMCLang_zhCN); break; - #if defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ || defined _DURANGO case XC_LANGUAGE_DANISH: locales.push_back(eMCLang_daDA); locales.push_back(eMCLang_daDK); break; - case XC_LANGUAGE_LATINAMERICANSPANISH: - locales.push_back(eMCLang_laLAS); - locales.push_back(eMCLang_esES); - break; - case XC_LANGUAGE_FINISH : locales.push_back(eMCLang_fiFI); break; @@ -9238,7 +9772,7 @@ DWORD CMinecraftApp::get_xcLang(WCHAR *pwchLocale) void CMinecraftApp::LocaleAndLanguageInit() { m_localeA[eMCLang_zhCHT] =L"zh-CHT"; - m_localeA[eMCLang_zhCHS] =L"zh-CHS"; + m_localeA[eMCLang_csCS] =L"cs-CS"; m_localeA[eMCLang_laLAS] =L"la-LAS"; m_localeA[eMCLang_null] =L"en-EN"; m_localeA[eMCLang_enUS] =L"en-US"; @@ -9294,14 +9828,17 @@ void CMinecraftApp::LocaleAndLanguageInit() m_localeA[eMCLang_esCO] =L"es-CO"; m_localeA[eMCLang_esUS] =L"es-US"; m_localeA[eMCLang_svSE] =L"sv-SE"; - + m_localeA[eMCLang_csCZ] =L"cs-CZ"; m_localeA[eMCLang_elGR] =L"el-GR"; m_localeA[eMCLang_nnNO] =L"nn-NO"; m_localeA[eMCLang_skSK] =L"sk-SK"; - m_eMCLangA[L"zh-CHT"] =eMCLang_zhCHS; - m_eMCLangA[L"zh-CHS"] =eMCLang_zhCHT; + m_localeA[eMCLang_hans] =L"zh-HANS"; + m_localeA[eMCLang_hant] =L"zh-HANT"; + + m_eMCLangA[L"zh-CHT"] =eMCLang_zhCHT; + m_eMCLangA[L"cs-CS"] =eMCLang_csCS; m_eMCLangA[L"la-LAS"] =eMCLang_laLAS; m_eMCLangA[L"en-EN"] =eMCLang_null; m_eMCLangA[L"en-US"] =eMCLang_enUS; @@ -9363,8 +9900,11 @@ void CMinecraftApp::LocaleAndLanguageInit() m_eMCLangA[L"nn-NO"] =eMCLang_nnNO; m_eMCLangA[L"sk-SK"] =eMCLang_skSK; + m_eMCLangA[L"zh-HANS"] =eMCLang_hans; + m_eMCLangA[L"zh-HANT"] =eMCLang_hant; + m_xcLangA[L"zh-CHT"] =XC_LOCALE_CHINA; - m_xcLangA[L"zh-CHS"] =XC_LOCALE_CHINA; + m_xcLangA[L"cs-CS"] =XC_LOCALE_CHINA; m_xcLangA[L"en-EN"] =XC_LOCALE_UNITED_STATES; m_xcLangA[L"en-US"] =XC_LOCALE_UNITED_STATES; m_xcLangA[L"en-GB"] =XC_LOCALE_GREAT_BRITAIN; @@ -9428,6 +9968,9 @@ void CMinecraftApp::LocaleAndLanguageInit() m_xcLangA[L"cs-CZ"] =XC_LOCALE_CZECH_REPUBLIC; m_xcLangA[L"el-GR"] =XC_LOCALE_GREECE; m_xcLangA[L"sk-SK"] =XC_LOCALE_SLOVAK_REPUBLIC; + + m_xcLangA[L"zh-HANS"] =XC_LOCALE_CHINA; + m_xcLangA[L"zh-HANT"] =XC_LOCALE_CHINA; } void CMinecraftApp::SetTickTMSDLCFiles(bool bVal) @@ -9436,17 +9979,15 @@ void CMinecraftApp::SetTickTMSDLCFiles(bool bVal) m_bTickTMSDLCFiles=bVal; } -wstring CMinecraftApp::getFilePath(DWORD packId, wstring filename, bool bAddDataFolder) +wstring CMinecraftApp::getFilePath(DWORD packId, wstring filename, bool bAddDataFolder, wstring mountPoint) { -#ifdef _XBOX - wstring path = getRootPath(packId, true, bAddDataFolder) + filename; + wstring path = getRootPath(packId, true, bAddDataFolder, mountPoint) + filename; File f(path); if(f.exists()) { return path; } -#endif - return getRootPath(packId, false, true) + filename; + return getRootPath(packId, false, true, mountPoint) + filename; } #ifdef _XBOX @@ -9456,13 +9997,16 @@ enum ETitleUpdateTexturePacks eTUTP_MassEffect = 0x400, eTUTP_Skyrim = 0x401, eTUTP_Halo = 0x402, + eTUTP_Festive = 0x405, eTUTP_Plastic = 0x801, eTUTP_Candy = 0x802, eTUTP_Fantasy = 0x803, eTUTP_Halloween = 0x804, eTUTP_Natural = 0x805, - eTUTP_City = 0x01000806 // 4J Stu - The released City pack had a sub-pack ID + eTUTP_City = 0x01000806, // 4J Stu - The released City pack had a sub-pack ID + eTUTP_Cartoon = 0x807, + eTUTP_Steampunk = 0x01000808, // 4J Stu - The released Steampunk pack had a sub-pack ID }; #ifdef _TU_BUILD @@ -9470,11 +10014,41 @@ wstring titleUpdateTexturePackRoot = L"UPDATE:\\res\\DLC\\"; #else wstring titleUpdateTexturePackRoot = L"GAME:\\res\\TitleUpdate\\DLC\\"; #endif +#else +enum ETitleUpdateTexturePacks +{ + //eTUTP_MassEffect = 0x400, + //eTUTP_Skyrim = 0x401, + //eTUTP_Halo = 0x402, + //eTUTP_Festive = 0x405, + + //eTUTP_Plastic = 0x801, + //eTUTP_Candy = 0x802, + //eTUTP_Fantasy = 0x803, + eTUTP_Halloween = 0x804, + //eTUTP_Natural = 0x805, + //eTUTP_City = 0x01000806, // 4J Stu - The released City pack had a sub-pack ID + //eTUTP_Cartoon = 0x807, + //eTUTP_Steampunk = 0x01000808, // 4J Stu - The released Steampunk pack had a sub-pack ID +}; + +#ifdef _WINDOWS64 +wstring titleUpdateTexturePackRoot = L"Windows64\\DLC\\"; +#elif defined(__ORBIS__) +wstring titleUpdateTexturePackRoot = L"/app0/orbis/CU/DLC/"; +#elif defined(__PSVITA__) +wstring titleUpdateTexturePackRoot = L"PSVita/CU/DLC/"; +#elif defined(__PS3__) +wstring titleUpdateTexturePackRoot = L"PS3/CU/DLC/"; +#else +wstring titleUpdateTexturePackRoot = L"CU\\DLC\\"; #endif -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 +10063,9 @@ wstring CMinecraftApp::getRootPath(DWORD packId, bool allowOverride, bool bAddDa case eTUTP_Halo: path = titleUpdateTexturePackRoot + L"Halo"; break; + case eTUTP_Festive: + path = titleUpdateTexturePackRoot + L"Festive"; + break; case eTUTP_Plastic: path = titleUpdateTexturePackRoot + L"Plastic"; break; @@ -9507,11 +10084,32 @@ wstring CMinecraftApp::getRootPath(DWORD packId, bool allowOverride, bool bAddDa case eTUTP_City: path = titleUpdateTexturePackRoot + L"City"; break; + case eTUTP_Cartoon: + path = titleUpdateTexturePackRoot + L"Cartoon"; + break; + case eTUTP_Steampunk: + path = titleUpdateTexturePackRoot + L"Steampunk"; + break; }; File folder(path); if(!folder.exists()) { - path = L"TPACK:"; + path = mountPoint; + } + } +#else + if(allowOverride) + { + switch(packId) + { + case eTUTP_Halloween: + path = titleUpdateTexturePackRoot + L"Halloween Texture Pack"; + break; + }; + File folder(path); + if(!folder.exists()) + { + path = mountPoint; } } #endif @@ -9524,6 +10122,7 @@ wstring CMinecraftApp::getRootPath(DWORD packId, bool allowOverride, bool bAddDa { return path + L"\\"; } + } #ifdef _XBOX_ONE diff --git a/Minecraft.Client/Common/Consoles_App.h b/Minecraft.Client/Common/Consoles_App.h index 110054f2..ec36b765 100644 --- a/Minecraft.Client/Common/Consoles_App.h +++ b/Minecraft.Client/Common/Consoles_App.h @@ -39,6 +39,11 @@ class Container; class DispenserTileEntity; class SignTileEntity; class BrewingStandTileEntity; +class CommandBlockEntity; +class HopperTileEntity; +class MinecartHopper; +class EntityHorse; +class BeaconTileEntity; class LocalPlayer; class DLCPack; class LevelRuleset; @@ -87,9 +92,9 @@ public: #ifdef _EXTENDED_ACHIEVEMENTS /* 4J-JEV: - * We need more space in the profile data because of the new achievements and statistics - * necessary for the new expanded achievement set. - */ + * We need more space in the profile data because of the new achievements and statistics + * necessary for the new expanded achievement set. + */ static const int GAME_DEFINED_PROFILE_DATA_BYTES = 2*972; // per user #else static const int GAME_DEFINED_PROFILE_DATA_BYTES = 972; // per user @@ -108,7 +113,7 @@ public: static const int USER_RR = 5; static const int USER_SR = 6; static const int USER_UI = 7; // 4J Stu - This also makes it appear on the UI console - + void HandleButtonPresses(); bool IntroRunning() { return m_bIntroRunning;} void SetIntroRunning(bool bSet) {m_bIntroRunning=bSet;} @@ -127,23 +132,30 @@ public: int GetLocalPlayerCount(void); bool LoadInventoryMenu(int iPad,shared_ptr player, bool bNavigateBack=false); bool LoadCreativeMenu(int iPad,shared_ptr player,bool bNavigateBack=false); - bool LoadEnchantingMenu(int iPad,shared_ptr inventory, int x, int y, int z, Level *level); + bool LoadEnchantingMenu(int iPad,shared_ptr inventory, int x, int y, int z, Level *level, const wstring &name); bool LoadFurnaceMenu(int iPad,shared_ptr inventory, shared_ptr furnace); bool LoadBrewingStandMenu(int iPad,shared_ptr inventory, shared_ptr brewingStand); bool LoadContainerMenu(int iPad,shared_ptr inventory, shared_ptr container); bool LoadTrapMenu(int iPad,shared_ptr inventory, shared_ptr trap); bool LoadCrafting2x2Menu(int iPad,shared_ptr player); bool LoadCrafting3x3Menu(int iPad,shared_ptr player, int x, int y, int z); + bool LoadFireworksMenu(int iPad,shared_ptr player, int x, int y, int z); bool LoadSignEntryMenu(int iPad,shared_ptr sign); bool LoadRepairingMenu(int iPad,shared_ptr inventory, Level *level, int x, int y, int z); - bool LoadTradingMenu(int iPad, shared_ptr inventory, shared_ptr trader, Level *level); + bool LoadTradingMenu(int iPad, shared_ptr inventory, shared_ptr trader, Level *level, const wstring &name); + + bool LoadCommandBlockMenu(int iPad, shared_ptr commandBlock) { return false; } + bool LoadHopperMenu(int iPad ,shared_ptr inventory, shared_ptr hopper); + bool LoadHopperMenu(int iPad ,shared_ptr inventory, shared_ptr hopper); + bool LoadHorseMenu(int iPad ,shared_ptr inventory, shared_ptr container, shared_ptr horse); + bool LoadBeaconMenu(int iPad ,shared_ptr inventory, shared_ptr beacon); bool GetTutorialMode() { return m_bTutorialMode;} void SetTutorialMode(bool bSet) {m_bTutorialMode=bSet;} void SetSpecialTutorialCompletionFlag(int iPad, int index); - static LPCWSTR GetString(int iID); + static LPCWSTR GetString(int iID); eGameMode GetGameMode() { return m_eGameMode;} void SetGameMode(eGameMode eMode) { m_eGameMode=eMode;} @@ -159,7 +171,7 @@ public: void SetXuiServerAction(int iPad, eXuiServerAction action, LPVOID param = NULL) {m_eXuiServerAction[iPad]=action; m_eXuiServerActionParam[iPad] = param;} eXuiServerAction GetGlobalXuiServerAction() {return m_eGlobalXuiServerAction;} void SetGlobalXuiServerAction(eXuiServerAction action) {m_eGlobalXuiServerAction=action;} - + DisconnectPacket::eDisconnectReason GetDisconnectReason() { return m_disconnectReason; } void SetDisconnectReason(DisconnectPacket::eDisconnectReason bVal) { m_disconnectReason = bVal; } @@ -206,6 +218,7 @@ public: static int OldProfileVersionCallback(LPVOID pParam,unsigned char *pucData, const unsigned short usVersion, const int iPad); #if ( defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined __PSVITA__ ) + wstring toStringOptionsStatus(const C4JStorage::eOptionsCallback &eStatus); static int DefaultOptionsCallback(LPVOID pParam,C4JStorage::PROFILESETTINGS *pSettings, const int iPad); int SetDefaultOptions(C4JStorage::PROFILESETTINGS *pSettings,const int iPad,bool bWriteProfile=true); #ifdef __ORBIS__ @@ -224,7 +237,7 @@ public: #endif virtual void SetRichPresenceContext(int iPad, int contextId) = 0; - + void SetGameSettings(int iPad,eGameSetting eVal,unsigned char ucVal); unsigned char GetGameSettings(int iPad,eGameSetting eVal); unsigned char GetGameSettings(eGameSetting eVal); // for the primary pad @@ -247,7 +260,8 @@ public: // Minecraft language select void SetMinecraftLanguage(int iPad, unsigned char ucLanguage); unsigned char GetMinecraftLanguage(int iPad); - + void SetMinecraftLocale(int iPad, unsigned char ucLanguage); + unsigned char GetMinecraftLocale(int iPad); // 4J-PB - set a timer when the user navigates the quickselect, so we can bring the opacity back to defaults for a short time unsigned int GetOpacityTimer(int iPad) { return m_uiOpacityCountDown[iPad]; } @@ -301,9 +315,11 @@ public: #endif #ifdef _DEBUG_MENUS_ENABLED - bool DebugSettingsOn() { return m_bDebugOptions;} + bool DebugSettingsOn() { return m_bDebugOptions;} + bool DebugArtToolsOn(); #else - bool DebugSettingsOn() { return false;} + bool DebugSettingsOn() { return false;} + bool DebugArtToolsOn() { return false;} #endif void SetDebugSequence(const char *pchSeq); static int DebugInputCallback(LPVOID pParam); @@ -424,10 +440,10 @@ public: byteArray getArchiveFile(const wstring &filename); private: - + static int BannedLevelDialogReturned(void *pParam,int iPad,const C4JStorage::EMessageResult); static int TexturePackDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); - + VBANNEDLIST *m_vBannedListA[XUSER_MAX_COUNT]; void HandleButtonPresses(int iPad); @@ -440,7 +456,7 @@ private: // Container scene for some menu -// CXuiScene debugContainerScene; + // CXuiScene debugContainerScene; //bool m_bSplitScreenEnabled; @@ -482,14 +498,14 @@ public: static const DWORD m_dwOfferID = 0x00000001; -// timer + // timer void InitTime(); void UpdateTime(); // trial timer void SetTrialTimerStart(void); float getTrialTimer(void); - + // notifications from the game for qnet VNOTIFICATIONS *GetNotifications() {return &m_vNotifications;} @@ -599,7 +615,7 @@ public: unsigned int GetDLCCreditsCount(); SCreditTextItemDef * GetDLCCredits(int iIndex); -// TMS + // TMS void ReadDLCFileFromTMS(int iPad,eTMSAction action, bool bCallback=false); void ReadXuidsFileFromTMS(int iPad,eTMSAction action,bool bCallback=false); @@ -633,8 +649,8 @@ private: static unordered_map DLCInfo_Full; // full offerid, dlc_info static unordered_map DLCInfo_SkinName; // skin name, full offer id #endif -// bool m_bRead_TMS_XUIDS_XML; // track whether we have already read the TMS xuids.xml file -// bool m_bRead_TMS_DLCINFO_XML; // track whether we have already read the TMS DLC.xml file + // bool m_bRead_TMS_XUIDS_XML; // track whether we have already read the TMS xuids.xml file + // bool m_bRead_TMS_DLCINFO_XML; // track whether we have already read the TMS DLC.xml file bool m_bDefaultCapeInstallAttempted; // have we attempted to install the default cape from tms @@ -651,13 +667,13 @@ public: XUSER_SIGNIN_INFO m_currentSigninInfo[XUSER_MAX_COUNT]; //void OverrideFontRenderer(bool set, bool immediate = true); -// void ToggleFontRenderer() { OverrideFontRenderer(!m_bFontRendererOverridden,false); } + // void ToggleFontRenderer() { OverrideFontRenderer(!m_bFontRendererOverridden,false); } BANNEDLIST BannedListA[XUSER_MAX_COUNT]; private: -// XUI_FontRenderer *m_fontRenderer; -// bool m_bFontRendererOverridden; -// bool m_bOverrideFontRenderer; + // XUI_FontRenderer *m_fontRenderer; + // bool m_bFontRendererOverridden; + // bool m_bOverrideFontRenderer; bool m_bRead_BannedListA[XUSER_MAX_COUNT]; @@ -667,7 +683,7 @@ private: public: void SetBanListCheck(int iPad,bool bVal) {m_BanListCheck[iPad]=bVal;} bool GetBanListCheck(int iPad) { return m_BanListCheck[iPad];} -// AUTOSAVE + // AUTOSAVE public: void SetAutosaveTimerTime(void); bool AutosaveDue(void); @@ -685,6 +701,11 @@ private: unsigned int m_uiGameHostSettings; static unsigned char m_szPNG[8]; +#ifdef _LARGE_WORLDS + unsigned int m_GameNewWorldSize; + bool m_bGameNewWorldSizeUseMoat; + unsigned int m_GameNewHellScale; +#endif unsigned int FromBigEndian(unsigned int uiValue); public: @@ -695,6 +716,13 @@ public: unsigned int GetGameHostOption(eGameHostOption eVal); unsigned int GetGameHostOption(unsigned int uiHostSettings, eGameHostOption eVal); +#ifdef _LARGE_WORLDS + void SetGameNewWorldSize(unsigned int newSize, bool useMoat) { m_GameNewWorldSize = newSize; m_bGameNewWorldSizeUseMoat = useMoat; } + unsigned int GetGameNewWorldSize() { return m_GameNewWorldSize; } + unsigned int GetGameNewWorldSizeUseMoat() { return m_bGameNewWorldSizeUseMoat; } + void SetGameNewHellScale(unsigned int newScale) { m_GameNewHellScale = newScale; } + unsigned int GetGameNewHellScale() { return m_GameNewHellScale; } +#endif void SetResetNether(bool bResetNether) {m_bResetNether=bResetNether;} bool GetResetNether() {return m_bResetNether;} bool CanRecordStatsAndAchievements(); @@ -808,9 +836,9 @@ public: DWORD m_dwDLCFileSize; BYTE *m_pDLCFileBuffer; -// static int CallbackReadXuidsFileFromTMS(LPVOID lpParam, WCHAR *wchFilename, int iPad, bool bResult, int iAction); -// static int CallbackDLCFileFromTMS(LPVOID lpParam, WCHAR *wchFilename, int iPad, bool bResult, int iAction); -// static int CallbackBannedListFileFromTMS(LPVOID lpParam, WCHAR *wchFilename, int iPad, bool bResult, int iAction); + // static int CallbackReadXuidsFileFromTMS(LPVOID lpParam, WCHAR *wchFilename, int iPad, bool bResult, int iAction); + // static int CallbackDLCFileFromTMS(LPVOID lpParam, WCHAR *wchFilename, int iPad, bool bResult, int iAction); + // static int CallbackBannedListFileFromTMS(LPVOID lpParam, WCHAR *wchFilename, int iPad, bool bResult, int iAction); // Storing additional model parts per skin texture void SetAdditionalSkinBoxes(DWORD dwSkinID, SKIN_BOX *SkinBoxA, DWORD dwSkinBoxC); @@ -875,27 +903,27 @@ public: void SetTickTMSDLCFiles(bool bVal); - wstring getFilePath(DWORD packId, wstring filename, bool bAddDataFolder); + wstring getFilePath(DWORD packId, wstring filename, bool bAddDataFolder, wstring mountPoint = L"TPACK:"); private: - unordered_mapm_localeA; - unordered_mapm_eMCLangA; - unordered_mapm_xcLangA; - wstring getRootPath(DWORD packId, bool allowOverride, bool bAddDataFolder); + unordered_mapm_localeA; + unordered_mapm_eMCLangA; + unordered_mapm_xcLangA; + wstring getRootPath(DWORD packId, bool allowOverride, bool bAddDataFolder, wstring mountPoint); public: #ifdef _XBOX -// bool m_bTransferSavesToXboxOne; -// unsigned int m_uiTransferSlotC; - + // bool m_bTransferSavesToXboxOne; + // unsigned int m_uiTransferSlotC; + #elif defined (__PS3__) - + #elif defined _DURANGO - + #elif defined _WINDOWS64 //CMinecraftAudio audio; #else // PS4 - + #endif #ifdef _XBOX_ONE diff --git a/Minecraft.Client/Common/DLC/DLCManager.cpp b/Minecraft.Client/Common/DLC/DLCManager.cpp index 123e4266..17c9fc6d 100644 --- a/Minecraft.Client/Common/DLC/DLCManager.cpp +++ b/Minecraft.Client/Common/DLC/DLCManager.cpp @@ -91,6 +91,28 @@ void DLCManager::removePack(DLCPack *pack) } } +void DLCManager::removeAllPacks(void) +{ + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + DLCPack *pack = (DLCPack *)*it; + delete pack; + } + + m_packs.clear(); +} + +void DLCManager::LanguageChanged(void) +{ + for(AUTO_VAR(it, m_packs.begin()); it != m_packs.end(); ++it) + { + DLCPack *pack = (DLCPack *)*it; + // update the language + pack->UpdateLanguage(); + } + +} + DLCPack *DLCManager::getPack(const wstring &name) { DLCPack *pack = NULL; @@ -292,12 +314,12 @@ DWORD DLCManager::checkForCorruptDLCAndAlert(bool showMessage /*= true*/) WCHAR wchFormat[132]; swprintf(wchFormat, 132, L"%ls\n\n%%ls", firstCorruptPack->getName().c_str()); - C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_CORRUPT_DLC_TITLE, IDS_CORRUPT_DLC, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(),wchFormat); + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_CORRUPT_DLC_TITLE, IDS_CORRUPT_DLC, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL,wchFormat); } else { - C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_CORRUPT_DLC_TITLE, IDS_CORRUPT_DLC_MULTIPLE, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_CORRUPT_DLC_TITLE, IDS_CORRUPT_DLC_MULTIPLE, uiIDA,1,ProfileManager.GetPrimaryPad()); } } diff --git a/Minecraft.Client/Common/DLC/DLCManager.h b/Minecraft.Client/Common/DLC/DLCManager.h index 55a62312..27765232 100644 --- a/Minecraft.Client/Common/DLC/DLCManager.h +++ b/Minecraft.Client/Common/DLC/DLCManager.h @@ -74,6 +74,8 @@ public: void addPack(DLCPack *pack); void removePack(DLCPack *pack); + void removeAllPacks(void); + void LanguageChanged(void); DLCPack *getPack(const wstring &name); #ifdef _XBOX_ONE diff --git a/Minecraft.Client/Common/DLC/DLCPack.cpp b/Minecraft.Client/Common/DLC/DLCPack.cpp index 507e51a7..4a003d05 100644 --- a/Minecraft.Client/Common/DLC/DLCPack.cpp +++ b/Minecraft.Client/Common/DLC/DLCPack.cpp @@ -191,7 +191,8 @@ DLCFile *DLCPack::addFile(DLCManager::EDLCType type, const wstring &path) { case DLCManager::e_DLCType_Skin: { - std::vector splitPath = stringSplit(path,L'/'); + wstring newPath = replaceAll(path, L"\\", L"/"); + std::vector splitPath = stringSplit(newPath,L'/'); wstring strippedPath = splitPath.back(); newFile = new DLCSkinFile(strippedPath); @@ -211,7 +212,8 @@ DLCFile *DLCPack::addFile(DLCManager::EDLCType type, const wstring &path) break; case DLCManager::e_DLCType_Cape: { - std::vector splitPath = stringSplit(path,L'/'); + wstring newPath = replaceAll(path, L"\\", L"/"); + std::vector splitPath = stringSplit(newPath,L'/'); wstring strippedPath = splitPath.back(); newFile = new DLCCapeFile(strippedPath); } @@ -411,3 +413,19 @@ bool DLCPack::hasPurchasedFile(DLCManager::EDLCType type, const wstring &path) return true; }*/ } + +void DLCPack::UpdateLanguage() +{ + // find the language file + DLCManager::e_DLCType_LocalisationData; + DLCFile *file = NULL; + + if(m_files[DLCManager::e_DLCType_LocalisationData].size() > 0) + { + file = m_files[DLCManager::e_DLCType_LocalisationData][0]; + DLCLocalisationFile *localisationFile = (DLCLocalisationFile *)getFile(DLCManager::e_DLCType_LocalisationData, L"languages.loc"); + StringTable *strTable = localisationFile->getStringTable(); + strTable->ReloadStringTable(); + } + +} \ No newline at end of file diff --git a/Minecraft.Client/Common/DLC/DLCPack.h b/Minecraft.Client/Common/DLC/DLCPack.h index 856744c2..df1f65f0 100644 --- a/Minecraft.Client/Common/DLC/DLCPack.h +++ b/Minecraft.Client/Common/DLC/DLCPack.h @@ -68,6 +68,8 @@ public: DWORD getLicenseMask( ) { return m_dwLicenseMask; } wstring getName() { return m_packName; } + + void UpdateLanguage(); #ifdef _XBOX_ONE wstring getPurchaseOfferId() { return m_wsProductId; } #else diff --git a/Minecraft.Client/Common/DLC/DLCTextureFile.cpp b/Minecraft.Client/Common/DLC/DLCTextureFile.cpp index cf99465a..edf071c6 100644 --- a/Minecraft.Client/Common/DLC/DLCTextureFile.cpp +++ b/Minecraft.Client/Common/DLC/DLCTextureFile.cpp @@ -30,6 +30,7 @@ void DLCTextureFile::addParameter(DLCManager::EDLCParameterType type, const wstr { case DLCManager::e_DLCParamType_Anim: m_animString = value; + if(m_animString.empty()) m_animString = L","; m_bIsAnim = true; break; diff --git a/Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.h b/Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.h index 5b97b108..91c4ef35 100644 --- a/Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.h +++ b/Minecraft.Client/Common/GameRules/ConsoleGenerateStructure.h @@ -35,4 +35,8 @@ public: bool checkIntersects(int x0, int y0, int z0, int x1, int y1, int z1); virtual int getMinY(); + + EStructurePiece GetType() { return (EStructurePiece)0; } + void addAdditonalSaveData(CompoundTag *tag) {} + void readAdditonalSaveData(CompoundTag *tag) {} }; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp b/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp index 4a4e27b2..3b995000 100644 --- a/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp +++ b/Minecraft.Client/Common/GameRules/ConsoleSchematicFile.cpp @@ -278,7 +278,7 @@ __int64 ConsoleSchematicFile::applyBlocksAndData(LevelChunk *chunk, AABB *chunkB //{ // if(blockData[i] == Tile::sand_Id || blockData[i] == Tile::sandStone_Id) // { - // blockData[i] = Tile::whiteStone_Id; + // blockData[i] = Tile::endStone_Id; // } //} @@ -706,15 +706,19 @@ void ConsoleSchematicFile::generateSchematicFile(DataOutputStream *dos, Level *l shared_ptr e = *it; bool mobCanBeSaved = false; - if(bSaveMobs) + if (bSaveMobs) { - if( ( e->GetType() & eTYPE_MONSTER ) || ( e->GetType() & eTYPE_WATERANIMAL ) || ( e->GetType() & eTYPE_ANIMAL ) || - ( e->GetType() == eTYPE_CHICKEN ) || ( e->GetType() == eTYPE_WOLF ) || ( e->GetType() == eTYPE_VILLAGER) || ( e->GetType() == eTYPE_MUSHROOMCOW ) ) + if ( e->instanceof(eTYPE_MONSTER) || e->instanceof(eTYPE_WATERANIMAL) || e->instanceof(eTYPE_ANIMAL) || (e->GetType() == eTYPE_VILLAGER) ) + + // 4J-JEV: All these are derived from eTYPE_ANIMAL and true implicitly. + //|| ( e->GetType() == eTYPE_CHICKEN ) || ( e->GetType() == eTYPE_WOLF ) || ( e->GetType() == eTYPE_MUSHROOMCOW ) ) { mobCanBeSaved = true; } } - if(mobCanBeSaved || e->GetType() == eTYPE_MINECART || e->GetType() == eTYPE_BOAT || e->GetType() == eTYPE_PAINTING || e->GetType() == eTYPE_ITEM_FRAME) + + // 4J-JEV: Changed to check for instances of minecarts and hangingEntities instead of just eTYPE_PAINTING, eTYPE_ITEM_FRAME and eTYPE_MINECART + if (mobCanBeSaved || e->instanceof(eTYPE_MINECART) || e->GetType() == eTYPE_BOAT || e->instanceof(eTYPE_HANGING_ENTITY)) { CompoundTag *eTag = new CompoundTag(); if( e->save(eTag) ) @@ -725,7 +729,7 @@ void ConsoleSchematicFile::generateSchematicFile(DataOutputStream *dos, Level *l pos->get(1)->data -= yStart; pos->get(2)->data -= zStart; - if( e->GetType() == eTYPE_PAINTING || e->GetType() == eTYPE_ITEM_FRAME ) + if( e->instanceof(eTYPE_HANGING_ENTITY) ) { ((IntTag *) eTag->get(L"TileX") )->data -= xStart; ((IntTag *) eTag->get(L"TileY") )->data -= yStart; diff --git a/Minecraft.Client/Common/GameRules/GameRuleManager.cpp b/Minecraft.Client/Common/GameRules/GameRuleManager.cpp index 0c6a7804..6e5688cc 100644 --- a/Minecraft.Client/Common/GameRules/GameRuleManager.cpp +++ b/Minecraft.Client/Common/GameRules/GameRuleManager.cpp @@ -106,17 +106,14 @@ void GameRuleManager::loadGameRules(DLCPack *pack) DWORD dSize; byte *dData = dlcHeader->getData(dSize); - LevelGenerationOptions *createdLevelGenerationOptions = new LevelGenerationOptions(); + LevelGenerationOptions *createdLevelGenerationOptions = new LevelGenerationOptions(pack); // = loadGameRules(dData, dSize); //, strings); createdLevelGenerationOptions->setGrSource( dlcHeader ); + createdLevelGenerationOptions->setSrc( LevelGenerationOptions::eSrc_fromDLC ); readRuleFile(createdLevelGenerationOptions, dData, dSize, strings); - createdLevelGenerationOptions->setSrc( LevelGenerationOptions::eSrc_fromDLC ); - - - //createdLevelGenerationOptions->setSrc( LevelGenerationOptions::eSrc_fromDLC ); dlcHeader->lgo = createdLevelGenerationOptions; } @@ -128,15 +125,13 @@ void GameRuleManager::loadGameRules(DLCPack *pack) DWORD dSize; byte *dData = dlcFile->getData(dSize); - LevelGenerationOptions *createdLevelGenerationOptions = new LevelGenerationOptions(); + LevelGenerationOptions *createdLevelGenerationOptions = new LevelGenerationOptions(pack); // = loadGameRules(dData, dSize); //, strings); createdLevelGenerationOptions->setGrSource( new JustGrSource() ); - readRuleFile(createdLevelGenerationOptions, dData, dSize, strings); - createdLevelGenerationOptions->setSrc( LevelGenerationOptions::eSrc_tutorial ); - - //createdLevelGenerationOptions->set_DLCGameRulesFile( dlcFile ); + + readRuleFile(createdLevelGenerationOptions, dData, dSize, strings); createdLevelGenerationOptions->setLoadedData(); } @@ -659,6 +654,25 @@ void GameRuleManager::loadDefaultGameRules() #else // _XBOX +#ifdef _WINDOWS64 + File packedTutorialFile(L"Windows64Media\\Tutorial\\Tutorial.pck"); + if(!packedTutorialFile.exists()) packedTutorialFile = File(L"Windows64\\Tutorial\\Tutorial.pck"); +#elif defined(__ORBIS__) + File packedTutorialFile(L"/app0/orbis/Tutorial/Tutorial.pck"); +#elif defined(__PSVITA__) + File packedTutorialFile(L"PSVita/Tutorial/Tutorial.pck"); +#elif defined(__PS3__) + File packedTutorialFile(L"PS3/Tutorial/Tutorial.pck"); +#else + File packedTutorialFile(L"Tutorial\\Tutorial.pck"); +#endif + if(loadGameRulesPack(&packedTutorialFile)) + { + m_levelGenerators.getLevelGenerators()->at(0)->setWorldName(app.GetString(IDS_PLAY_TUTORIAL)); + //m_levelGenerators.getLevelGenerators()->at(0)->setDefaultSaveName(L"Tutorial"); + m_levelGenerators.getLevelGenerators()->at(0)->setDefaultSaveName(app.GetString(IDS_TUTORIALSAVENAME)); + } +#if 0 wstring fpTutorial = L"Tutorial.pck"; if(app.getArchiveFileSize(fpTutorial) >= 0) { @@ -667,25 +681,18 @@ void GameRuleManager::loadDefaultGameRules() if ( app.m_dlcManager.readDLCDataFile(dwFilesProcessed,fpTutorial,pack,true) ) { app.m_dlcManager.addPack(pack); - m_levelGenerators.getLevelGenerators()->at(0)->setWorldName(app.GetString(IDS_PLAY_TUTORIAL)); - m_levelGenerators.getLevelGenerators()->at(0)->setDefaultSaveName(app.GetString(IDS_TUTORIALSAVENAME)); + //m_levelGenerators.getLevelGenerators()->at(0)->setWorldName(app.GetString(IDS_PLAY_TUTORIAL)); + //m_levelGenerators.getLevelGenerators()->at(0)->setDefaultSaveName(app.GetString(IDS_TUTORIALSAVENAME)); } else delete pack; } - /*StringTable *strings = new StringTable(baStrings.data, baStrings.length); - LevelGenerationOptions *lgo = new LevelGenerationOptions(); - lgo->setGrSource( new JustGrSource() ); - lgo->setSrc( LevelGenerationOptions::eSrc_tutorial ); - readRuleFile(lgo, tutorial.data, tutorial.length, strings); - lgo->setLoadedData();*/ - +#endif #endif } bool GameRuleManager::loadGameRulesPack(File *path) { bool success = false; -#ifdef _XBOX if(path->exists()) { DLCPack *pack = new DLCPack(L"",0xffffffff); @@ -700,12 +707,13 @@ bool GameRuleManager::loadGameRulesPack(File *path) delete pack; } } -#endif return success; } void GameRuleManager::setLevelGenerationOptions(LevelGenerationOptions *levelGen) { + unloadCurrentGameRules(); + m_currentGameRuleDefinitions = NULL; m_currentLevelGenerationOptions = levelGen; diff --git a/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp index 717b066e..9ebd3428 100644 --- a/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp +++ b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.cpp @@ -7,6 +7,7 @@ #include "..\..\..\Minecraft.World\net.minecraft.world.phys.h" #include "..\..\..\Minecraft.World\net.minecraft.world.level.h" #include "..\..\..\Minecraft.World\net.minecraft.world.level.chunk.h" +#include "Common\DLC\DLCGameRulesHeader.h" #include "..\..\StringTable.h" #include "LevelGenerationOptions.h" #include "ConsoleGameRules.h" @@ -41,7 +42,7 @@ void JustGrSource::setBaseSavePath(const wstring &x) { m_baseSavePath = x; m_bRe bool JustGrSource::ready() { return true; } -LevelGenerationOptions::LevelGenerationOptions() +LevelGenerationOptions::LevelGenerationOptions(DLCPack *parentPack) { m_spawnPos = NULL; m_stringTable = NULL; @@ -49,6 +50,7 @@ LevelGenerationOptions::LevelGenerationOptions() m_hasLoadedData = false; m_seed = 0; + m_bHasBeenInCreative = true; m_useFlatWorld = false; m_bHaveMinY = false; m_minY = INT_MAX; @@ -56,6 +58,9 @@ LevelGenerationOptions::LevelGenerationOptions() m_pbBaseSaveData = NULL; m_dwBaseSaveSize = 0; + + m_parentDLCPack = parentPack; + m_bLoadingData = false; } LevelGenerationOptions::~LevelGenerationOptions() @@ -70,17 +75,17 @@ LevelGenerationOptions::~LevelGenerationOptions() { delete *it; } - + for(AUTO_VAR(it, m_biomeOverrides.begin()); it != m_biomeOverrides.end(); ++it) { delete *it; } - + for(AUTO_VAR(it, m_features.begin()); it != m_features.end(); ++it) { delete *it; } - + if (m_stringTable) if (!isTutorial()) delete m_stringTable; @@ -93,7 +98,7 @@ ConsoleGameRules::EGameRuleType LevelGenerationOptions::getActionType() { return void LevelGenerationOptions::writeAttributes(DataOutputStream *dos, UINT numAttrs) { GameRuleDefinition::writeAttributes(dos, numAttrs + 5); - + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_spawnX); dos->writeUTF(_toString(m_spawnPos->x)); ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_spawnY); @@ -110,12 +115,12 @@ void LevelGenerationOptions::writeAttributes(DataOutputStream *dos, UINT numAttr void LevelGenerationOptions::getChildren(vector *children) { GameRuleDefinition::getChildren(children); - + vector used_schematics; for (AUTO_VAR(it, m_schematicRules.begin()); it != m_schematicRules.end(); it++) if ( !(*it)->isComplete() ) used_schematics.push_back( *it ); - + for(AUTO_VAR(it, m_structureRules.begin()); it!=m_structureRules.end(); it++) children->push_back( *it ); for(AUTO_VAR(it, used_schematics.begin()); it!=used_schematics.end(); it++) @@ -190,24 +195,24 @@ void LevelGenerationOptions::addAttribute(const wstring &attributeName, const ws { if(attributeValue.compare(L"true") == 0) m_useFlatWorld = true; app.DebugPrintf("LevelGenerationOptions: Adding parameter flatworld=%s\n",m_useFlatWorld?"TRUE":"FALSE"); - } + } else if(attributeName.compare(L"saveName") == 0) { - wstring string(getString(attributeValue)); + wstring string(attributeValue); if(!string.empty()) setDefaultSaveName( string ); else setDefaultSaveName( attributeValue ); app.DebugPrintf("LevelGenerationOptions: Adding parameter saveName=%ls\n", getDefaultSaveName().c_str()); } else if(attributeName.compare(L"worldName") == 0) { - wstring string(getString(attributeValue)); + wstring string(attributeValue); if(!string.empty()) setWorldName( string ); else setWorldName( attributeValue ); app.DebugPrintf("LevelGenerationOptions: Adding parameter worldName=%ls\n", getWorldName()); } else if(attributeName.compare(L"displayName") == 0) { - wstring string(getString(attributeValue)); + wstring string(attributeValue); if(!string.empty()) setDisplayName( string ); else setDisplayName( attributeValue ); app.DebugPrintf("LevelGenerationOptions: Adding parameter displayName=%ls\n", getDisplayName()); @@ -228,6 +233,12 @@ void LevelGenerationOptions::addAttribute(const wstring &attributeName, const ws setBaseSavePath( attributeValue ); app.DebugPrintf("LevelGenerationOptions: Adding parameter baseSaveName=%ls\n", getBaseSavePath().c_str()); } + else if(attributeName.compare(L"hasBeenInCreative") == 0) + { + bool value = _fromString(attributeValue); + m_bHasBeenInCreative = value; + app.DebugPrintf("LevelGenerationOptions: Adding parameter gameMode=%d\n", m_bHasBeenInCreative); + } else { GameRuleDefinition::addAttribute(attributeName, attributeValue); @@ -297,7 +308,7 @@ bool LevelGenerationOptions::checkIntersects(int x0, int y0, int z0, int x1, int m_bHaveMinY = true; } - + // 4J Stu - We DO NOT intersect if our upper bound is below the lower bound for all schematics if( y1 < m_minY ) return false; @@ -413,14 +424,14 @@ void LevelGenerationOptions::getBiomeOverride(int biomeId, BYTE &tile, BYTE &top } } -bool LevelGenerationOptions::isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature) +bool LevelGenerationOptions::isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature, int *orientation) { bool isFeature = false; for(AUTO_VAR(it, m_features.begin()); it != m_features.end(); ++it) { StartFeature *sf = *it; - if(sf->isFeatureChunk(chunkX, chunkZ, feature)) + if(sf->isFeatureChunk(chunkX, chunkZ, feature, orientation)) { isFeature = true; break; @@ -442,15 +453,175 @@ unordered_map *LevelGenerationOptions::getUnfin = new unordered_map(); for (AUTO_VAR(it, usedFiles.begin()); it!=usedFiles.end(); it++) out->insert( pair(*it, getSchematicFile(*it)) ); - + return out; } +void LevelGenerationOptions::loadBaseSaveData() +{ + int mountIndex = -1; + if(m_parentDLCPack != NULL) mountIndex = m_parentDLCPack->GetDLCMountIndex(); + + if(mountIndex > -1) + { +#ifdef _DURANGO + if(StorageManager.MountInstalledDLC(ProfileManager.GetPrimaryPad(),mountIndex,&LevelGenerationOptions::packMounted,this,L"WPACK")!=ERROR_IO_PENDING) +#else + if(StorageManager.MountInstalledDLC(ProfileManager.GetPrimaryPad(),mountIndex,&LevelGenerationOptions::packMounted,this,"WPACK")!=ERROR_IO_PENDING) +#endif + { + // corrupt DLC + setLoadedData(); + app.DebugPrintf("Failed to mount LGO DLC %d for pad %d\n",mountIndex,ProfileManager.GetPrimaryPad()); + } + else + { + m_bLoadingData = true; + app.DebugPrintf("Attempted to mount DLC data for LGO %d\n", mountIndex); + } + } + else + { + setLoadedData(); + app.SetAction(ProfileManager.GetPrimaryPad(), eAppAction_ReloadTexturePack); + } +} + +int LevelGenerationOptions::packMounted(LPVOID pParam,int iPad,DWORD dwErr,DWORD dwLicenceMask) +{ + LevelGenerationOptions *lgo = (LevelGenerationOptions *)pParam; + lgo->m_bLoadingData = false; + if(dwErr!=ERROR_SUCCESS) + { + // corrupt DLC + app.DebugPrintf("Failed to mount LGO DLC for pad %d: %d\n",iPad,dwErr); + } + else + { + app.DebugPrintf("Mounted DLC for LGO, attempting to load data\n"); + DWORD dwFilesProcessed = 0; + int gameRulesCount = lgo->m_parentDLCPack->getDLCItemsCount(DLCManager::e_DLCType_GameRulesHeader); + for(int i = 0; i < gameRulesCount; ++i) + { + DLCGameRulesHeader *dlcFile = (DLCGameRulesHeader *) lgo->m_parentDLCPack->getFile(DLCManager::e_DLCType_GameRulesHeader, i); + + if (!dlcFile->getGrfPath().empty()) + { + File grf( app.getFilePath(lgo->m_parentDLCPack->GetPackID(), dlcFile->getGrfPath(),true, L"WPACK:" ) ); + if (grf.exists()) + { +#ifdef _UNICODE + wstring path = grf.getPath(); + const WCHAR *pchFilename=path.c_str(); + HANDLE fileHandle = CreateFile( + pchFilename, // file name + GENERIC_READ, // access mode + 0, // share mode // TODO 4J Stu - Will we need to share file? Probably not but... + NULL, // Unused + OPEN_EXISTING , // how to create // TODO 4J Stu - Assuming that the file already exists if we are opening to read from it + FILE_FLAG_SEQUENTIAL_SCAN, // file attributes + NULL // Unsupported + ); +#else + const char *pchFilename=wstringtofilename(grf.getPath()); + HANDLE fileHandle = CreateFile( + pchFilename, // file name + GENERIC_READ, // access mode + 0, // share mode // TODO 4J Stu - Will we need to share file? Probably not but... + NULL, // Unused + OPEN_EXISTING , // how to create // TODO 4J Stu - Assuming that the file already exists if we are opening to read from it + FILE_FLAG_SEQUENTIAL_SCAN, // file attributes + NULL // Unsupported + ); +#endif + + if( fileHandle != INVALID_HANDLE_VALUE ) + { + DWORD dwFileSize = grf.length(); + DWORD bytesRead; + PBYTE pbData = (PBYTE) new BYTE[dwFileSize]; + BOOL bSuccess = ReadFile(fileHandle,pbData,dwFileSize,&bytesRead,NULL); + if(bSuccess==FALSE) + { + app.FatalLoadError(); + } + CloseHandle(fileHandle); + + // 4J-PB - is it possible that we can get here after a read fail and it's not an error? + dlcFile->setGrfData(pbData, dwFileSize, lgo->m_stringTable); + + delete [] pbData; + + app.m_gameRules.setLevelGenerationOptions( dlcFile->lgo ); + } + } + } + } + if(lgo->requiresBaseSave() && !lgo->getBaseSavePath().empty() ) + { + File save(app.getFilePath(lgo->m_parentDLCPack->GetPackID(), lgo->getBaseSavePath(),true, L"WPACK:" )); + if (save.exists()) + { +#ifdef _UNICODE + wstring path = save.getPath(); + const WCHAR *pchFilename=path.c_str(); + HANDLE fileHandle = CreateFile( + pchFilename, // file name + GENERIC_READ, // access mode + 0, // share mode // TODO 4J Stu - Will we need to share file? Probably not but... + NULL, // Unused + OPEN_EXISTING , // how to create // TODO 4J Stu - Assuming that the file already exists if we are opening to read from it + FILE_FLAG_SEQUENTIAL_SCAN, // file attributes + NULL // Unsupported + ); +#else + const char *pchFilename=wstringtofilename(save.getPath()); + HANDLE fileHandle = CreateFile( + pchFilename, // file name + GENERIC_READ, // access mode + 0, // share mode // TODO 4J Stu - Will we need to share file? Probably not but... + NULL, // Unused + OPEN_EXISTING , // how to create // TODO 4J Stu - Assuming that the file already exists if we are opening to read from it + FILE_FLAG_SEQUENTIAL_SCAN, // file attributes + NULL // Unsupported + ); +#endif + + if( fileHandle != INVALID_HANDLE_VALUE ) + { + DWORD bytesRead,dwFileSize = GetFileSize(fileHandle,NULL); + PBYTE pbData = (PBYTE) new BYTE[dwFileSize]; + BOOL bSuccess = ReadFile(fileHandle,pbData,dwFileSize,&bytesRead,NULL); + if(bSuccess==FALSE) + { + app.FatalLoadError(); + } + CloseHandle(fileHandle); + + // 4J-PB - is it possible that we can get here after a read fail and it's not an error? + lgo->setBaseSaveData(pbData, dwFileSize); + } + } + + } +#ifdef _DURANGO + DWORD result = StorageManager.UnmountInstalledDLC(L"WPACK"); +#else + DWORD result = StorageManager.UnmountInstalledDLC("WPACK"); +#endif + + } + + lgo->setLoadedData(); + + return 0; +} + void LevelGenerationOptions::reset_start() { for ( AUTO_VAR( it, m_schematicRules.begin()); - it != m_schematicRules.end(); - it++ ) + it != m_schematicRules.end(); + it++ ) { (*it)->reset(); } @@ -478,9 +649,38 @@ bool LevelGenerationOptions::isFromDLC() { return getSrc() == eSrc_fromDLC; } bool LevelGenerationOptions::requiresTexturePack() { return info()->requiresTexturePack(); } UINT LevelGenerationOptions::getRequiredTexturePackId() { return info()->getRequiredTexturePackId(); } -wstring LevelGenerationOptions::getDefaultSaveName() { return info()->getDefaultSaveName(); } -LPCWSTR LevelGenerationOptions::getWorldName() { return info()->getWorldName(); } -LPCWSTR LevelGenerationOptions::getDisplayName() { return info()->getDisplayName(); } + +wstring LevelGenerationOptions::getDefaultSaveName() +{ + switch (getSrc()) + { + case eSrc_fromSave: return getString( info()->getDefaultSaveName() ); + case eSrc_fromDLC: return getString( info()->getDefaultSaveName() ); + case eSrc_tutorial: return app.GetString(IDS_TUTORIALSAVENAME); + } + return L""; +} +LPCWSTR LevelGenerationOptions::getWorldName() +{ + switch (getSrc()) + { + case eSrc_fromSave: return getString( info()->getWorldName() ); + case eSrc_fromDLC: return getString( info()->getWorldName() ); + case eSrc_tutorial: return app.GetString(IDS_PLAY_TUTORIAL); + } + return L""; +} +LPCWSTR LevelGenerationOptions::getDisplayName() +{ + switch (getSrc()) + { + case eSrc_fromSave: return getString( info()->getDisplayName() ); + case eSrc_fromDLC: return getString( info()->getDisplayName() ); + case eSrc_tutorial: return L""; + } + return L""; +} + wstring LevelGenerationOptions::getGrfPath() { return info()->getGrfPath(); } bool LevelGenerationOptions::requiresBaseSave() { return info()->requiresBaseSave(); } wstring LevelGenerationOptions::getBaseSavePath() { return info()->getBaseSavePath(); } @@ -506,6 +706,7 @@ bool LevelGenerationOptions::hasLoadedData() { return m_hasLoadedData; } void LevelGenerationOptions::setLoadedData() { m_hasLoadedData = true; } __int64 LevelGenerationOptions::getLevelSeed() { return m_seed; } +int LevelGenerationOptions::getLevelHasBeenInCreative() { return m_bHasBeenInCreative; } Pos *LevelGenerationOptions::getSpawnPos() { return m_spawnPos; } bool LevelGenerationOptions::getuseFlatWorld() { return m_useFlatWorld; } diff --git a/Minecraft.Client/Common/GameRules/LevelGenerationOptions.h b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.h index 0cc9da79..aa128ff8 100644 --- a/Minecraft.Client/Common/GameRules/LevelGenerationOptions.h +++ b/Minecraft.Client/Common/GameRules/LevelGenerationOptions.h @@ -149,6 +149,7 @@ private: __int64 m_seed; bool m_useFlatWorld; Pos *m_spawnPos; + int m_bHasBeenInCreative; vector m_schematicRules; vector m_structureRules; bool m_bHaveMinY; @@ -162,8 +163,11 @@ private: StringTable *m_stringTable; + DLCPack *m_parentDLCPack; + bool m_bLoadingData; + public: - LevelGenerationOptions(); + LevelGenerationOptions(DLCPack *parentPack = NULL); ~LevelGenerationOptions(); virtual ConsoleGameRules::EGameRuleType getActionType(); @@ -174,6 +178,7 @@ public: virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); __int64 getLevelSeed(); + int getLevelHasBeenInCreative(); Pos *getSpawnPos(); bool getuseFlatWorld(); @@ -197,12 +202,15 @@ public: LevelRuleset *getRequiredGameRules(); void getBiomeOverride(int biomeId, BYTE &tile, BYTE &topTile); - bool isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature); + bool isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature, int *orientation = NULL); void loadStringTable(StringTable *table); LPCWSTR getString(const wstring &key); unordered_map *getUnfinishedSchematicFiles(); + + void loadBaseSaveData(); + static int packMounted(LPVOID pParam,int iPad,DWORD dwErr,DWORD dwLicenceMask); // 4J-JEV: // ApplySchematicRules contain limited state diff --git a/Minecraft.Client/Common/GameRules/StartFeature.cpp b/Minecraft.Client/Common/GameRules/StartFeature.cpp index 9d5f15c0..7f0c8b5c 100644 --- a/Minecraft.Client/Common/GameRules/StartFeature.cpp +++ b/Minecraft.Client/Common/GameRules/StartFeature.cpp @@ -6,12 +6,13 @@ StartFeature::StartFeature() { m_chunkX = 0; m_chunkZ = 0; + m_orientation = 0; m_feature = StructureFeature::eFeature_Temples; } void StartFeature::writeAttributes(DataOutputStream *dos, UINT numAttrs) { - GameRuleDefinition::writeAttributes(dos, numAttrs + 3); + GameRuleDefinition::writeAttributes(dos, numAttrs + 4); ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_chunkX); dos->writeUTF(_toString(m_chunkX)); @@ -19,6 +20,8 @@ void StartFeature::writeAttributes(DataOutputStream *dos, UINT numAttrs) dos->writeUTF(_toString(m_chunkZ)); ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_feature); dos->writeUTF(_toString((int)m_feature)); + ConsoleGameRules::write(dos, ConsoleGameRules::eGameRuleAttr_orientation); + dos->writeUTF(_toString(m_orientation)); } void StartFeature::addAttribute(const wstring &attributeName, const wstring &attributeValue) @@ -35,6 +38,12 @@ void StartFeature::addAttribute(const wstring &attributeName, const wstring &att m_chunkZ = value; app.DebugPrintf("StartFeature: Adding parameter chunkZ=%d\n",m_chunkZ); } + else if(attributeName.compare(L"orientation") == 0) + { + int value = _fromString(attributeValue); + m_orientation = value; + app.DebugPrintf("StartFeature: Adding parameter orientation=%d\n",m_orientation); + } else if(attributeName.compare(L"feature") == 0) { int value = _fromString(attributeValue); @@ -47,7 +56,8 @@ void StartFeature::addAttribute(const wstring &attributeName, const wstring &att } } -bool StartFeature::isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature) +bool StartFeature::isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature, int *orientation) { + if(orientation != NULL) *orientation = m_orientation; return chunkX == m_chunkX && chunkZ == m_chunkZ && feature == m_feature; } \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/StartFeature.h b/Minecraft.Client/Common/GameRules/StartFeature.h index d3f1280a..b198a2fa 100644 --- a/Minecraft.Client/Common/GameRules/StartFeature.h +++ b/Minecraft.Client/Common/GameRules/StartFeature.h @@ -7,7 +7,7 @@ using namespace std; class StartFeature : public GameRuleDefinition { private: - int m_chunkX, m_chunkZ; + int m_chunkX, m_chunkZ, m_orientation; StructureFeature::EFeatureTypes m_feature; public: @@ -18,5 +18,5 @@ public: virtual void writeAttributes(DataOutputStream *dos, UINT numAttrs); virtual void addAttribute(const wstring &attributeName, const wstring &attributeValue); - bool isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature); + bool isFeatureChunk(int chunkX, int chunkZ, StructureFeature::EFeatureTypes feature, int *orientation); }; \ No newline at end of file diff --git a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.cpp b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.cpp index 8184f45b..d81a2b03 100644 --- a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.cpp +++ b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceContainer.cpp @@ -74,16 +74,16 @@ bool XboxStructureActionPlaceContainer::placeContainerInLevel(StructurePiece *st { // Remove the current tile entity level->removeTileEntity( worldX, worldY, worldZ ); - level->setTile( worldX, worldY, worldZ, 0 ); + level->setTileAndData( worldX, worldY, worldZ, 0, 0, Tile::UPDATE_ALL ); } - level->setTile( worldX, worldY, worldZ, m_tile ); + level->setTileAndData( worldX, worldY, worldZ, m_tile, 0, Tile::UPDATE_ALL ); shared_ptr container = dynamic_pointer_cast(level->getTileEntity( worldX, worldY, worldZ )); app.DebugPrintf("XboxStructureActionPlaceContainer - placing a container at (%d,%d,%d)\n", worldX, worldY, worldZ); if ( container != NULL ) { - level->setData( worldX, worldY, worldZ, m_data); + level->setData( worldX, worldY, worldZ, m_data, Tile::UPDATE_CLIENTS); // Add items int slotId = 0; for(AUTO_VAR(it, m_items.begin()); it != m_items.end() && (slotId < container->getContainerSize()); ++it, ++slotId ) diff --git a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.cpp b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.cpp index 1eca3342..3f6204af 100644 --- a/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.cpp +++ b/Minecraft.Client/Common/GameRules/XboxStructureActionPlaceSpawner.cpp @@ -50,10 +50,10 @@ bool XboxStructureActionPlaceSpawner::placeSpawnerInLevel(StructurePiece *struct { // Remove the current tile entity level->removeTileEntity( worldX, worldY, worldZ ); - level->setTile( worldX, worldY, worldZ, 0 ); + level->setTileAndData( worldX, worldY, worldZ, 0, 0, Tile::UPDATE_ALL ); } - level->setTile( worldX, worldY, worldZ, m_tile ); + level->setTileAndData( worldX, worldY, worldZ, m_tile, 0, Tile::UPDATE_ALL ); shared_ptr entity = dynamic_pointer_cast(level->getTileEntity( worldX, worldY, worldZ )); #ifndef _CONTENT_PACKAGE diff --git a/Minecraft.Client/Common/Leaderboards/LeaderboardInterface.cpp b/Minecraft.Client/Common/Leaderboards/LeaderboardInterface.cpp new file mode 100644 index 00000000..07463517 --- /dev/null +++ b/Minecraft.Client/Common/Leaderboards/LeaderboardInterface.cpp @@ -0,0 +1,88 @@ +#include "stdafx.h" +#include "LeaderboardInterface.h" + +LeaderboardInterface::LeaderboardInterface(LeaderboardManager *man) +{ + m_manager = man; + m_pending = false; + + m_filter = (LeaderboardManager::EFilterMode) -1; + m_callback = NULL; + m_difficulty = 0; + m_type = LeaderboardManager::eStatsType_UNDEFINED; + m_startIndex = 0; + m_readCount = 0; + + m_manager->OpenSession(); +} + +LeaderboardInterface::~LeaderboardInterface() +{ + m_manager->CancelOperation(); + m_manager->CloseSession(); +} + +void LeaderboardInterface::ReadStats_Friends(LeaderboardReadListener *callback, int difficulty, LeaderboardManager::EStatsType type, PlayerUID myUID, unsigned int startIndex, unsigned int readCount) +{ + m_filter = LeaderboardManager::eFM_Friends; + m_pending = true; + + m_callback = callback; + m_difficulty = difficulty; + m_type = type; + m_myUID = myUID; + m_startIndex = startIndex; + m_readCount = readCount; + + tick(); +} + +void LeaderboardInterface::ReadStats_MyScore(LeaderboardReadListener *callback, int difficulty, LeaderboardManager::EStatsType type, PlayerUID myUID, unsigned int readCount) +{ + m_filter = LeaderboardManager::eFM_MyScore; + m_pending = true; + + m_callback = callback; + m_difficulty = difficulty; + m_type = type; + m_myUID = myUID; + m_readCount = readCount; + + tick(); +} + +void LeaderboardInterface::ReadStats_TopRank(LeaderboardReadListener *callback, int difficulty, LeaderboardManager::EStatsType type, unsigned int startIndex, unsigned int readCount) +{ + m_filter = LeaderboardManager::eFM_TopRank; + m_pending = true; + + m_callback = callback; + m_difficulty = difficulty; + m_type = type; + m_startIndex = startIndex; + m_readCount = readCount; + + tick(); +} + +void LeaderboardInterface::CancelOperation() +{ + m_manager->CancelOperation(); + m_pending = false; +} + +void LeaderboardInterface::tick() +{ + if (m_pending) m_pending = !callManager(); +} + +bool LeaderboardInterface::callManager() +{ + switch (m_filter) + { + case LeaderboardManager::eFM_Friends: return m_manager->ReadStats_Friends(m_callback, m_difficulty, m_type, m_myUID, m_startIndex, m_readCount); + case LeaderboardManager::eFM_MyScore: return m_manager->ReadStats_MyScore(m_callback, m_difficulty, m_type, m_myUID, m_readCount); + case LeaderboardManager::eFM_TopRank: return m_manager->ReadStats_TopRank(m_callback, m_difficulty, m_type, m_startIndex, m_readCount); + default: assert(false); return true; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Leaderboards/LeaderboardInterface.h b/Minecraft.Client/Common/Leaderboards/LeaderboardInterface.h new file mode 100644 index 00000000..089c482b --- /dev/null +++ b/Minecraft.Client/Common/Leaderboards/LeaderboardInterface.h @@ -0,0 +1,35 @@ +#pragma once + +#include "LeaderboardManager.h" + +// 4J-JEV: Simple interface for handling ReadStat failures. +class LeaderboardInterface +{ +private: + LeaderboardManager *m_manager; + bool m_pending; + + // Arguments. + LeaderboardManager::EFilterMode m_filter; + LeaderboardReadListener *m_callback; + int m_difficulty; + LeaderboardManager::EStatsType m_type; + PlayerUID m_myUID; + unsigned int m_startIndex; + unsigned int m_readCount; + +public: + LeaderboardInterface(LeaderboardManager *man); + ~LeaderboardInterface(); + + void ReadStats_Friends(LeaderboardReadListener *callback, int difficulty, LeaderboardManager::EStatsType type, PlayerUID myUID, unsigned int startIndex, unsigned int readCount); + void ReadStats_MyScore(LeaderboardReadListener *callback, int difficulty, LeaderboardManager::EStatsType type, PlayerUID myUID, unsigned int readCount); + void ReadStats_TopRank(LeaderboardReadListener *callback, int difficulty, LeaderboardManager::EStatsType type, unsigned int startIndex, unsigned int readCount); + + void CancelOperation(); + + void tick(); + +private: + bool callManager(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Leaderboards/SonyLeaderboardManager.cpp b/Minecraft.Client/Common/Leaderboards/SonyLeaderboardManager.cpp new file mode 100644 index 00000000..78d62568 --- /dev/null +++ b/Minecraft.Client/Common/Leaderboards/SonyLeaderboardManager.cpp @@ -0,0 +1,1131 @@ +#include "stdafx.h" + +#include +#include +//#include + +#include "SonyLeaderboardManager.h" + +#include "base64.h" + +#include "Common\Consoles_App.h" +#include "Common\Network\Sony\SQRNetworkManager.h" + +#include "..\..\..\Minecraft.World\StringHelpers.h" + + +#ifdef __ORBIS__ +#include "Orbis\OrbisExtras\ShutdownManager.h" +#include "Orbis\Orbis_App.h" +#elif defined __PSVITA__ +#include "PSVita\PSVitaExtras\ShutdownManager.h" +#include "PSVita\PSVita_App.h" +#elif defined __PS3__ +#include "PS3\PS3Extras\ShutdownManager.h" +#include "PS3\PS3_App.h" +#else +#error "SonyLeaderboardManager is included for a non-sony platform." +#endif + +SonyLeaderboardManager::SonyLeaderboardManager() +{ + m_eStatsState = eStatsState_Idle; + + m_titleContext = -1; + + m_myXUID = INVALID_XUID; + + m_scores = NULL; + + m_statsType = eStatsType_Kills; + m_difficulty = 0; + + m_requestId = 0; + + m_openSessions = 0; + + InitializeCriticalSection(&m_csViewsLock); + + m_running = false; + m_threadScoreboard = NULL; +} + +SonyLeaderboardManager::~SonyLeaderboardManager() +{ + m_running = false; + + // 4J-JEV: Wait for thread to stop and hope it doesn't take too long. + long long startShutdown = System::currentTimeMillis(); + while (m_threadScoreboard->isRunning()) + { + Sleep(1); + assert( (System::currentTimeMillis() - startShutdown) < 16 ); + } + + delete m_threadScoreboard; + + DeleteCriticalSection(&m_csViewsLock); +} + +int SonyLeaderboardManager::scoreboardThreadEntry(LPVOID lpParam) +{ + ShutdownManager::HasStarted(ShutdownManager::eLeaderboardThread); + SonyLeaderboardManager *self = reinterpret_cast(lpParam); + + self->m_running = true; + app.DebugPrintf("[SonyLeaderboardManager] Thread started.\n"); + + bool needsWriting = false; + do + { + if (self->m_openSessions > 0 || needsWriting) + { + self->scoreboardThreadInternal(); + } + + EnterCriticalSection(&self->m_csViewsLock); + needsWriting = self->m_views.size() > 0; + LeaveCriticalSection(&self->m_csViewsLock); + + // 4J Stu - We can't write while we aren't signed in to live + if (!ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())) + { + needsWriting = false; + } + + if ( (!needsWriting) && (self->m_eStatsState != eStatsState_Getting) ) + { + Sleep(50); // 4J-JEV: When we're not reading or writing. + } + + } while ( (self->m_running || self->m_eStatsState == eStatsState_Getting || needsWriting) + && ShutdownManager::ShouldRun(ShutdownManager::eLeaderboardThread) + ); + + // 4J-JEV, moved this here so setScore can finish up. + self->destroyTitleContext(self->m_titleContext); + + // TODO sceNpScoreTerm(); + app.DebugPrintf("[SonyLeaderboardManager] Thread closed.\n"); + ShutdownManager::HasFinished(ShutdownManager::eLeaderboardThread); + return 0; +} + +void SonyLeaderboardManager::scoreboardThreadInternal() +{ + // 4J-JEV: Just initialise the context the once now. + if (m_titleContext == -1) + { + int primaryPad = ProfileManager.GetPrimaryPad(); + + if (!ProfileManager.IsSignedInLive(primaryPad)) return; + + int ret = initialiseScoreUtility(); + if (ret < 0) + { + if ( !scoreUtilityAlreadyInitialised(ret) ) + { + app.DebugPrintf("[SonyLeaderboardManager] initialiseScoreUtility() failed. ret = 0x%x\n", ret); + return; + } + else + { + app.DebugPrintf("[SonyLeaderboardManager] initialiseScoreUtility() already initialised, (0x%x)\n", ret); + } + } + + SceNpId npId; + ProfileManager.GetSceNpId(primaryPad,&npId); + + ret = createTitleContext(npId); + + if (ret < 0) return; + else m_titleContext = ret; + } + else assert( m_titleContext > 0 ); //Paranoia + + + switch (m_eStatsState) + { + case eStatsState_Getting: + // Player starts using async multiplayer feature + // 4J-PB - Fix for SCEA FQA #4 - TRC R4064 - Incorrect usage of AsyncMultiplay + // Note 1: + // The following NP call should be reserved for asynchronous multiplayer modes that require PS Plus to be accessed. + // + // Note 2: + // The message is not displayed with a user without PlayStation®Plus subscription and they are able to access the Leaderboards. + + // NotifyAsyncPlusFeature(); + + switch(m_eFilterMode) + { + case eFM_MyScore: + case eFM_Friends: + getScoreByIds(); + break; + case eFM_TopRank: + getScoreByRange(); + break; + } + break; + + case eStatsState_Canceled: + case eStatsState_Failed: + case eStatsState_Ready: + case eStatsState_Idle: + + // 4J-JEV: Moved this here, I don't want reading and + // writing going on at the same time. + // -- + // 4J-JEV: Writing no longer changes the manager state, + // we'll manage the write queue seperately. + + EnterCriticalSection(&m_csViewsLock); + bool hasWork = !m_views.empty(); + LeaveCriticalSection(&m_csViewsLock); + + if (hasWork) + { + setScore(); + } + + break; + } +} + +HRESULT SonyLeaderboardManager::fillByIdsQuery(const SceNpId &myNpId, SceNpId* &npIds, uint32_t &len) +{ + HRESULT ret; + + // Get queried users. + switch(m_eFilterMode) + { + case eFM_Friends: + { + // 4J-JEV: Implementation for Orbis & Vita as they a very similar. +#if (defined __ORBIS__) || (defined __PSVITA__) + + sce::Toolkit::NP::Utilities::Future s_friendList; + ret = getFriendsList(s_friendList); + + if(ret != SCE_TOOLKIT_NP_SUCCESS) + { + // Error handling + if (m_eStatsState != eStatsState_Canceled) m_eStatsState = eStatsState_Failed; + app.DebugPrintf("[SonyLeaderboardManager] 'getFriendslist' fail, 0x%x.\n", ret); + return false; + } + else if (s_friendList.hasResult()) + { + // 4J-JEV: Friends list doesn't include player, leave space for them. + len = s_friendList.get()->size() + 1; + + npIds = new SceNpId[len]; + + int i = 0; + + sce::Toolkit::NP::FriendsList::const_iterator itr; + for (itr = s_friendList.get()->begin(); itr != s_friendList.get()->end(); itr++) + { + npIds[i] = itr->npid; + i++; + } + + npIds[len-1] = myNpId; // 4J-JEV: Append player to end of query. + } + else + { + // 4J-JEV: Something terrible must have happend, + // 'getFriendslist' was supposed to be a synchronous operation. + __debugbreak(); + + // 4J-JEV: We can at least fall-back to just the players score. + len = 1; + npIds = new SceNpId[1]; + + npIds[0] = myNpId; + } + +#elif (defined __PS3__) + // PS3 + + // 4J-JEV: Doesn't include the player (its just their friends). + ret = sceNpBasicGetFriendListEntryCount(&len); + len += 1; + + npIds = new SceNpId[len]; + + + for (uint32_t i = 0; i < len-1; i++) + { + ret = sceNpBasicGetFriendListEntry(i, npIds+i); + if (ret<0) return ret; + + } + npIds[len-1] = myNpId; // 4J-JEV: Append player to end of query. + +#endif + } + break; + case eFM_MyScore: + { + len = 1; + npIds = new SceNpId[1]; + npIds[0] = myNpId; + } + break; + } + + return S_OK; +} + +bool SonyLeaderboardManager::getScoreByIds() +{ + if (m_eStatsState == eStatsState_Canceled) return false; + + // ---------------------------- + SonyRtcTick last_sort_date; + SceNpScoreRankNumber mTotalRecord; + + SceNpId *npIds = NULL; + + int ret; + uint32_t num = 0; + + SceNpScorePlayerRankData *ptr; + SceNpScoreComment *comments; + // ---------------------------- + + // Check for invalid LManager state. + assert( m_eFilterMode == eFM_Friends + || m_eFilterMode == eFM_MyScore); + + SceNpId myNpId; + // 4J-PB - should it be user 0? + if(!ProfileManager.IsSignedInLive(0)) + { + app.DebugPrintf("[SonyLeaderboardManager] OpenSession() fail: User isn't signed in to PSN\n"); + return false; + } + ProfileManager.GetSceNpId(0,&myNpId); + + ret = fillByIdsQuery(myNpId, npIds, num); +#ifdef __PS3__ + if (ret < 0) goto error2; +#endif + + ptr = new SceNpScorePlayerRankData[num]; + comments = new SceNpScoreComment[num]; + + ZeroMemory(ptr, sizeof(SceNpScorePlayerRankData) * num); + ZeroMemory(comments, sizeof(SceNpScoreComment) * num); + + /* app.DebugPrintf("sceNpScoreGetRankingByNpId(\n\t transaction=%i,\n\t boardID=0,\n\t npId=%i,\n\t friendCount*sizeof(SceNpId)=%i*%i=%i,\ + rankData=%i,\n\t friendCount*sizeof(SceNpScorePlayerRankData)=%i,\n\t NULL, 0, NULL, 0,\n\t friendCount=%i,\n...\n", + transaction, npId, friendCount, sizeof(SceNpId), friendCount*sizeof(SceNpId), + rankData, friendCount*sizeof(SceNpScorePlayerRankData), friendCount + ); */ + + int boardId = getBoardId(m_difficulty, m_statsType); + + // 4J-JEV: Orbis can only do with 100 ids max, so we use batches. +#ifdef __ORBIS__ + for (int batch=0; batchrankData.scoreValue + ); + + // Sort scores + std::sort(m_scores, m_scores + m_readCount, SortByRank); + + delete [] ptr; + delete [] comments; + delete [] npIds; + + m_eStatsState = eStatsState_Ready; + return true; + + // Error. +error3: + if (ret!=SCE_NP_COMMUNITY_ERROR_ABORTED) //0x8002a109 + destroyTransactionContext(m_requestId); + m_requestId = 0; + delete [] ptr; + delete [] comments; +error2: + if (npIds != NULL) delete [] npIds; +error1: + if (m_eStatsState != eStatsState_Canceled) m_eStatsState = eStatsState_Failed; + app.DebugPrintf("[SonyLeaderboardManager] getScoreByIds() FAILED, ret=0x%X\n", ret); + return false; +} + +bool SonyLeaderboardManager::getScoreByRange() +{ + SonyRtcTick last_sort_date; + SceNpScoreRankNumber mTotalRecord; + + unsigned int num = m_readCount; + SceNpScoreRankData *ptr; + SceNpScoreComment *comments; + + assert(m_eFilterMode == eFM_TopRank); + + int ret = createTransactionContext(m_titleContext); + if (m_eStatsState == eStatsState_Canceled) + { + // Cancel operation has been called, abort. + app.DebugPrintf("[SonyLeaderboardManager]\tgetScoreByRange() - m_eStatsState == eStatsState_Canceled.\n"); + destroyTransactionContext(ret); + return false; + } + else if (ret < 0) + { + // Error occurred creating a transaction, abort. + m_eStatsState = eStatsState_Failed; + app.DebugPrintf("[SonyLeaderboardManager]\tgetScoreByRange() - createTransaction failed, ret=0x%X\n", ret); + return false; + } + else + { + // Transaction created successfully, continue. + m_requestId = ret; + } + + ptr = new SceNpScoreRankData[num]; + comments = new SceNpScoreComment[num]; + + int boardId = getBoardId(m_difficulty, m_statsType); + ret = sceNpScoreGetRankingByRange( + m_requestId, + boardId, // BoardId + + m_startIndex, + + ptr, sizeof(SceNpScoreRankData) * num, //OUT: Rank Data + + comments, sizeof(SceNpScoreComment) * num, //OUT: Comment Data + + NULL, 0, // GameData. + + num, + + &last_sort_date, + &m_maxRank, // 'Total number of players registered in the target scoreboard.' + + NULL // Reserved, specify null. + ); + + if (ret == SCE_NP_COMMUNITY_ERROR_ABORTED) + { + ret = destroyTransactionContext(m_requestId); + app.DebugPrintf("[SonyLeaderboardManager] getScoreByRange(): 'sceNpScoreGetRankingByRange' aborted (0x%X).\n", ret); + + delete [] ptr; + delete [] comments; + + return false; + } + else if (ret == SCE_NP_COMMUNITY_SERVER_ERROR_GAME_RANKING_NOT_FOUND) + { + ret = destroyTransactionContext(m_requestId); + app.DebugPrintf("[SonyLeaderboardManager] getScoreByRange(): Game ranking not found."); + + delete [] ptr; + delete [] comments; + + m_scores = NULL; + m_readCount = 0; + + m_eStatsState = eStatsState_Ready; + return false; + } + else if (ret<0) goto error2; + else + { + app.DebugPrintf("[SonyLeaderboardManager] getScoreByRange(), success, 1stScore=%i.\n", ptr->scoreValue); + } + + // Return. + destroyTransactionContext(m_requestId); + m_requestId = 0; + + //m_stats = ptr; //Maybe: addPadding(num,ptr); + + if (m_scores != NULL) delete [] m_scores; + m_readCount = ret; + m_scores = new ReadScore[m_readCount]; + for (int i=0; i 0) + ret = eStatsReturn_Success; + + if (m_readListener != NULL) + { + app.DebugPrintf("[SonyLeaderboardManager] OnStatsReadComplete(%i, %i, _), m_readCount=%i.\n", ret, m_maxRank, m_readCount); + m_readListener->OnStatsReadComplete(ret, m_maxRank, view); + } + + m_eStatsState = eStatsState_Idle; + + delete [] m_scores; + m_scores = NULL; + } + break; + + case eStatsState_Failed: + { + view.m_numQueries = 0; + view.m_queries = NULL; + + if ( m_readListener != NULL ) + m_readListener->OnStatsReadComplete(eStatsReturn_NetworkError, 0, view); + + m_eStatsState = eStatsState_Idle; + } + break; + + case eStatsState_Canceled: + { + m_eStatsState = eStatsState_Idle; + } + break; + + default: // Getting or Idle. + break; + } +} + +bool SonyLeaderboardManager::OpenSession() +{ + if (m_openSessions == 0) + { + if (m_threadScoreboard == NULL) + { + m_threadScoreboard = new C4JThread(&scoreboardThreadEntry, this, "4JScoreboard"); + m_threadScoreboard->SetProcessor(CPU_CORE_LEADERBOARDS); + m_threadScoreboard->SetPriority(THREAD_PRIORITY_BELOW_NORMAL); + m_threadScoreboard->Run(); + } + + app.DebugPrintf("[SonyLeaderboardManager] OpenSession(): Starting sceNpScore utility.\n"); + } + else + { + app.DebugPrintf("[SonyLeaderboardManager] OpenSession(): Another session opened, total=%i\n", m_openSessions+1); + } + + m_openSessions++; + return true; +} + +void SonyLeaderboardManager::CloseSession() +{ + m_openSessions--; + + if (m_openSessions == 0) app.DebugPrintf("[SonyLeaderboardManager] CloseSession(): Quitting sceNpScore utility.\n"); + else app.DebugPrintf("[SonyLeaderboardManager] CloseSession(): %i sessions still open.\n", m_openSessions); +} + +void SonyLeaderboardManager::DeleteSession() {} + +bool SonyLeaderboardManager::WriteStats(unsigned int viewCount, ViewIn views) +{ + // Need to cancel read/write operation first. + //if (m_eStatsState != eStatsState_Idle) return false; + + // Write relevant parameters. + //RegisterScore *regScore = reinterpret_cast(views); + + EnterCriticalSection(&m_csViewsLock); + for (int i=0; i> (8-dIndex); + + fivebits = (fivebits>>3) & 0x1F; + + if (fivebits < 10) // 0 - 9 + chars[i] = '0' + fivebits; + else if (fivebits < 32) // A - V + chars[i] = 'A' + (fivebits-10); + else + assert(false); + } + + toSymbols( getComment(out) ); +} + +void SonyLeaderboardManager::fromBase32(void *out, SceNpScoreComment *in) +{ + PBYTE bytes = (PBYTE) out; + ZeroMemory(bytes, RECORD_SIZE); + + fromSymbols( getComment(in) ); + + char ch[2] = { 0, 0 }; + for (int i = 0; i < SCE_NP_SCORE_COMMENT_MAXLEN; i++) + { + ch[0] = getComment(in)[i]; + unsigned char fivebits = strtol(ch, NULL, 32) << 3; + + int sByte = (i*5) / 8; + int eByte = (5+(i*5)) / 8; + int dIndex = (i*5) % 8; + + *(bytes + sByte) = *(bytes+sByte) | (fivebits >> dIndex); + + if (eByte != sByte) + *(bytes + eByte) = fivebits << (8-dIndex); + } +} + +char symbBase32[32] = { + ' ', '!','\"', '#', '$', '%', '&','\'', '(', ')', + '*', '+', '`', '-', '.', '/', ':', ';', '<', '=', + '>', '?', '[','\\', ']', '^', '_', '{', '|', '}', + '~', '@' +}; + +char charBase32[32] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', + 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', + 'U', 'V' +}; + +void SonyLeaderboardManager::toSymbols(char *str) +{ + for (int i = 0; i < 63; i++) + { + for (int j=0; j < 32; j++) + { + if (str[i]==charBase32[j]) + str[i] =symbBase32[j]; + } + } +} + +void SonyLeaderboardManager::fromSymbols(char *str) +{ + for (int i = 0; i < 63; i++) + { + for (int j=0; j < 32; j++) + { + if (str[i]==symbBase32[j]) + str[i] =charBase32[j]; + } + } +} + +bool SonyLeaderboardManager::test_string(string testing) +{ +#ifndef _CONTENT_PACKAGE + static SceNpScoreComment comment; + ZeroMemory(&comment, sizeof(SceNpScoreComment)); + memcpy(&comment, testing.c_str(), SCE_NP_SCORE_COMMENT_MAXLEN); + + int ctx = createTransactionContext(m_titleContext); + if (ctx<0) return false; + + int ret = sceNpScoreCensorComment(ctx, (const char *) &comment, NULL); + + if (ret == SCE_NP_COMMUNITY_SERVER_ERROR_CENSORED) + { + app.DebugPrintf("\n[TEST_STRING]: REJECTED "); + } + else if (ret < 0) + { + destroyTransactionContext(ctx); + return false; + } + else + { + app.DebugPrintf("\n[TEST_STRING]: permitted "); + } + + app.DebugPrintf("'%s'\n", getComment(&comment)); + destroyTransactionContext(ctx); + return true; +#else + return true; +#endif +} + +void SonyLeaderboardManager::initReadScoreStruct(ReadScore &out, SceNpScoreRankData &rankData) +{ + ZeroMemory(&out, sizeof(ReadScore)); + + // Init rank and onlineID + out.m_uid.setOnlineID( rankData.npId.handle, true ); + out.m_rank = rankData.rank; + + // Convert to wstring and copy name. + wstring wstrName = convStringToWstring( string(rankData.npId.handle.data) ).c_str(); + //memcpy(&out.m_name, wstrName.c_str(), XUSER_NAME_SIZE); + out.m_name=wstrName; +} + +void SonyLeaderboardManager::fillReadScoreStruct(ReadScore &out, SceNpScoreComment &comment) +{ + StatsData statsData; + fromBase32( (void *) &statsData, &comment ); + + switch (statsData.m_statsType) + { + case eStatsType_Farming: + out.m_statsSize = 6; + out.m_statsData[0] = statsData.m_farming.m_eggs; + out.m_statsData[1] = statsData.m_farming.m_wheat; + out.m_statsData[2] = statsData.m_farming.m_mushroom; + out.m_statsData[3] = statsData.m_farming.m_sugarcane; + out.m_statsData[4] = statsData.m_farming.m_milk; + out.m_statsData[5] = statsData.m_farming.m_pumpkin; + break; + case eStatsType_Mining: + out.m_statsSize = 7; + out.m_statsData[0] = statsData.m_mining.m_dirt; + out.m_statsData[1] = statsData.m_mining.m_cobblestone; + out.m_statsData[2] = statsData.m_mining.m_sand; + out.m_statsData[3] = statsData.m_mining.m_stone; + out.m_statsData[4] = statsData.m_mining.m_gravel; + out.m_statsData[5] = statsData.m_mining.m_clay; + out.m_statsData[6] = statsData.m_mining.m_obsidian; + break; + case eStatsType_Kills: + out.m_statsSize = 7; + out.m_statsData[0] = statsData.m_kills.m_zombie; + out.m_statsData[1] = statsData.m_kills.m_skeleton; + out.m_statsData[2] = statsData.m_kills.m_creeper; + out.m_statsData[3] = statsData.m_kills.m_spider; + out.m_statsData[4] = statsData.m_kills.m_spiderJockey; + out.m_statsData[5] = statsData.m_kills.m_zombiePigman; + out.m_statsData[6] = statsData.m_kills.m_slime; + break; + case eStatsType_Travelling: + out.m_statsSize = 4; + out.m_statsData[0] = statsData.m_travelling.m_walked; + out.m_statsData[1] = statsData.m_travelling.m_fallen; + out.m_statsData[2] = statsData.m_travelling.m_minecart; + out.m_statsData[3] = statsData.m_travelling.m_boat; + break; + } +} + +bool SonyLeaderboardManager::SortByRank(const ReadScore &lhs, const ReadScore &rhs) +{ + return lhs.m_rank < rhs.m_rank; +} diff --git a/Minecraft.Client/Common/Leaderboards/SonyLeaderboardManager.h b/Minecraft.Client/Common/Leaderboards/SonyLeaderboardManager.h new file mode 100644 index 00000000..3b2c26c5 --- /dev/null +++ b/Minecraft.Client/Common/Leaderboards/SonyLeaderboardManager.h @@ -0,0 +1,133 @@ +#pragma once + +#include "Common\Leaderboards\LeaderboardManager.h" + +#ifdef __PS3__ +typedef CellRtcTick SonyRtcTick; +#else +typedef SceRtcTick SonyRtcTick; +#endif + +class SonyLeaderboardManager : public LeaderboardManager +{ +protected: + enum EStatsState + { + eStatsState_Idle, + eStatsState_Getting, + eStatsState_Failed, + eStatsState_Ready, + eStatsState_Canceled, + eStatsState_Max + }; + +public: + SonyLeaderboardManager(); + virtual ~SonyLeaderboardManager(); + +protected: + unsigned short m_openSessions; + + C4JThread *m_threadScoreboard; + bool m_running; + + int m_titleContext; + int32_t m_requestId; + + //SceNpId m_myNpId; + + static int scoreboardThreadEntry(LPVOID lpParam); + void scoreboardThreadInternal(); + + virtual bool getScoreByIds(); + virtual bool getScoreByRange(); + + virtual bool setScore(); + + queue m_views; + + CRITICAL_SECTION m_csViewsLock; + + EStatsState m_eStatsState; //State of the stats read + // EFilterMode m_eFilterMode; + + ReadScore *m_scores; + unsigned int m_maxRank; + //SceNpScoreRankData *m_stats; + +public: + virtual void Tick(); + + //Open a session + virtual bool OpenSession(); + + //Close a session + virtual void CloseSession(); + + //Delete a session + virtual void DeleteSession(); + + //Write the given stats + //This is called synchronously and will not free any memory allocated for views when it is done + + virtual bool WriteStats(unsigned int viewCount, ViewIn views); + + virtual bool ReadStats_Friends(LeaderboardReadListener *callback, int difficulty, EStatsType type, PlayerUID myUID, unsigned int startIndex, unsigned int readCount); + virtual bool ReadStats_MyScore(LeaderboardReadListener *callback, int difficulty, EStatsType type, PlayerUID myUID, unsigned int readCount); + virtual bool ReadStats_TopRank(LeaderboardReadListener *callback, int difficulty, EStatsType type, unsigned int startIndex, unsigned int readCount); + + //Perform a flush of the stats + virtual void FlushStats(); + + //Cancel the current operation + virtual void CancelOperation(); + + //Is the leaderboard manager idle. + virtual bool isIdle(); + +protected: + int getBoardId(int difficulty, EStatsType); + + SceNpScorePlayerRankData *addPadding(unsigned int num, SceNpScoreRankData *rankData); + + void convertToOutput(unsigned int &num, ReadScore *out, SceNpScorePlayerRankData *rankData, SceNpScoreComment *comm); + + void toBinary(void *out, SceNpScoreComment *in); + void fromBinary(SceNpScoreComment **out, void *in); + + void toBase32(SceNpScoreComment *out, void *in); + void fromBase32(void *out, SceNpScoreComment *in); + + void toSymbols(char *); + void fromSymbols(char *); + + bool test_string(string); + + void initReadScoreStruct(ReadScore &out, SceNpScoreRankData &); + void fillReadScoreStruct(ReadScore &out, SceNpScoreComment &comment); + + static bool SortByRank(const ReadScore &lhs, const ReadScore &rhs); + + +protected: + // 4J-JEV: Interface differences: + + // Sce NP score library function redirects. + virtual HRESULT initialiseScoreUtility() { return ERROR_SUCCESS; } + virtual bool scoreUtilityAlreadyInitialised(HRESULT hr) { return false; } + + virtual HRESULT createTitleContext(const SceNpId &npId) = 0; + virtual HRESULT destroyTitleContext(int titleContext) = 0; + + virtual HRESULT createTransactionContext(int titleContext) = 0; + virtual HRESULT abortTransactionContext(int transactionContext) = 0; + virtual HRESULT destroyTransactionContext(int transactionContext) = 0; + + virtual HRESULT fillByIdsQuery(const SceNpId &myNpId, SceNpId* &npIds, uint32_t &len); + +#if (defined __ORBIS__) || (defined __PSVITA__) + virtual HRESULT getFriendsList(sce::Toolkit::NP::Utilities::Future &friendsList) = 0; +#endif + + virtual char * getComment(SceNpScoreComment *comment) = 0; +}; diff --git a/Minecraft.Client/Common/Leaderboards/base64.cpp b/Minecraft.Client/Common/Leaderboards/base64.cpp new file mode 100644 index 00000000..19106cc4 --- /dev/null +++ b/Minecraft.Client/Common/Leaderboards/base64.cpp @@ -0,0 +1,131 @@ +/* + base64.cpp and base64.h + + Copyright (C) 2004-2008 René Nyffenegger + + This source code is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this source code must not be misrepresented; you must not + claim that you wrote the original source code. If you use this source code + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original source code. + + 3. This notice may not be removed or altered from any source distribution. + + René Nyffenegger rene.nyffenegger@adp-gmbh.ch + +*/ + +#include "stdafx.h" + +#include "base64.h" +#include + +static const std::string base64_chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789+/"; + + +static inline bool is_base64(unsigned char c) { + return (isalnum(c) || (c == '+') || (c == '/')); +} + +// 4J ADDED, +std::string base64_encode(std::string str) +{ + return base64_encode( reinterpret_cast(str.c_str()), str.length() ); +} + +std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) { + std::string ret; + int i = 0; + int j = 0; + unsigned char char_array_3[3]; + unsigned char char_array_4[4]; + + while (in_len--) { + char_array_3[i++] = *(bytes_to_encode++); + if (i == 3) { + char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; + char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); + char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); + char_array_4[3] = char_array_3[2] & 0x3f; + + for(int ii = 0; (ii <4) ; ii++) + ret += base64_chars[char_array_4[ii]]; + i = 0; + } + } + + if (i) + { + for(j = i; j < 3; j++) + char_array_3[j] = '\0'; + + char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; + char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); + char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); + char_array_4[3] = char_array_3[2] & 0x3f; + + for (j = 0; (j < i + 1); j++) + ret += base64_chars[char_array_4[j]]; + + while((i++ < 3)) + ret += '='; + + } + + return ret; + +} + +std::string base64_decode(std::string const& encoded_string) { + int in_len = encoded_string.size(); + int i = 0; + int j = 0; + int in_ = 0; + unsigned char char_array_4[4], char_array_3[3]; + std::string ret; + + while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) { + char_array_4[i++] = encoded_string[in_]; in_++; + if (i ==4) { + for (i = 0; i <4; i++) + char_array_4[i] = base64_chars.find(char_array_4[i]); + + char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); + char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); + char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; + + for (i = 0; (i < 3); i++) + ret += char_array_3[i]; + i = 0; + } + } + + if (i) { + for (j = i; j <4; j++) + char_array_4[j] = 0; + + for (j = 0; j <4; j++) + char_array_4[j] = base64_chars.find(char_array_4[j]); + + char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4); + char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2); + char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3]; + + for (j = 0; (j < i - 1); j++) ret += char_array_3[j]; + } + + return ret; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Leaderboards/base64.h b/Minecraft.Client/Common/Leaderboards/base64.h new file mode 100644 index 00000000..7f6a1e49 --- /dev/null +++ b/Minecraft.Client/Common/Leaderboards/base64.h @@ -0,0 +1,7 @@ +#pragma once + +#include + +std::string base64_encode(std::string str); +std::string base64_encode(unsigned char const* , unsigned int len); +std::string base64_decode(std::string const& s); \ No newline at end of file diff --git a/Minecraft.Client/Common/Media/BeaconMenu1080.swf b/Minecraft.Client/Common/Media/BeaconMenu1080.swf new file mode 100644 index 00000000..f84c9101 Binary files /dev/null and b/Minecraft.Client/Common/Media/BeaconMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/BeaconMenu480.swf b/Minecraft.Client/Common/Media/BeaconMenu480.swf new file mode 100644 index 00000000..b04e2919 Binary files /dev/null and b/Minecraft.Client/Common/Media/BeaconMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/BeaconMenu720.swf b/Minecraft.Client/Common/Media/BeaconMenu720.swf new file mode 100644 index 00000000..c470b04e Binary files /dev/null and b/Minecraft.Client/Common/Media/BeaconMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/BeaconMenuSplit1080.swf b/Minecraft.Client/Common/Media/BeaconMenuSplit1080.swf new file mode 100644 index 00000000..02647e98 Binary files /dev/null and b/Minecraft.Client/Common/Media/BeaconMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/BeaconMenuSplit720.swf b/Minecraft.Client/Common/Media/BeaconMenuSplit720.swf new file mode 100644 index 00000000..1a68b14f Binary files /dev/null and b/Minecraft.Client/Common/Media/BeaconMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/BeaconMenuVita.swf b/Minecraft.Client/Common/Media/BeaconMenuVita.swf new file mode 100644 index 00000000..ab91a154 Binary files /dev/null and b/Minecraft.Client/Common/Media/BeaconMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/Controls1080.swf b/Minecraft.Client/Common/Media/Controls1080.swf index 36051b8c..9ec38f92 100644 Binary files a/Minecraft.Client/Common/Media/Controls1080.swf and b/Minecraft.Client/Common/Media/Controls1080.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting2x2Menu1080.swf b/Minecraft.Client/Common/Media/Crafting2x2Menu1080.swf index 65cb014a..e462de70 100644 Binary files a/Minecraft.Client/Common/Media/Crafting2x2Menu1080.swf and b/Minecraft.Client/Common/Media/Crafting2x2Menu1080.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting2x2MenuVita.swf b/Minecraft.Client/Common/Media/Crafting2x2MenuVita.swf index 041e7663..27a0b580 100644 Binary files a/Minecraft.Client/Common/Media/Crafting2x2MenuVita.swf and b/Minecraft.Client/Common/Media/Crafting2x2MenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/Crafting3x3MenuSplit1080.swf b/Minecraft.Client/Common/Media/Crafting3x3MenuSplit1080.swf index cc42f3d1..155db47e 100644 Binary files a/Minecraft.Client/Common/Media/Crafting3x3MenuSplit1080.swf and b/Minecraft.Client/Common/Media/Crafting3x3MenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/CreateWorldMenu1080.swf b/Minecraft.Client/Common/Media/CreateWorldMenu1080.swf index 245bbf65..282c51f8 100644 Binary files a/Minecraft.Client/Common/Media/CreateWorldMenu1080.swf and b/Minecraft.Client/Common/Media/CreateWorldMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/CreateWorldMenu480.swf b/Minecraft.Client/Common/Media/CreateWorldMenu480.swf index 9426b616..2773341d 100644 Binary files a/Minecraft.Client/Common/Media/CreateWorldMenu480.swf and b/Minecraft.Client/Common/Media/CreateWorldMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/CreateWorldMenu720.swf b/Minecraft.Client/Common/Media/CreateWorldMenu720.swf index b7474a63..985ef7a1 100644 Binary files a/Minecraft.Client/Common/Media/CreateWorldMenu720.swf and b/Minecraft.Client/Common/Media/CreateWorldMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/CreateWorldMenuVita.swf b/Minecraft.Client/Common/Media/CreateWorldMenuVita.swf index 814efa9c..f7fe1071 100644 Binary files a/Minecraft.Client/Common/Media/CreateWorldMenuVita.swf and b/Minecraft.Client/Common/Media/CreateWorldMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/CreativeMenuVita.swf b/Minecraft.Client/Common/Media/CreativeMenuVita.swf index ecbbb3db..01797a06 100644 Binary files a/Minecraft.Client/Common/Media/CreativeMenuVita.swf and b/Minecraft.Client/Common/Media/CreativeMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/FireworksMenu1080.swf b/Minecraft.Client/Common/Media/FireworksMenu1080.swf new file mode 100644 index 00000000..20250d06 Binary files /dev/null and b/Minecraft.Client/Common/Media/FireworksMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/FireworksMenu480.swf b/Minecraft.Client/Common/Media/FireworksMenu480.swf new file mode 100644 index 00000000..81a8290b Binary files /dev/null and b/Minecraft.Client/Common/Media/FireworksMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/FireworksMenu720.swf b/Minecraft.Client/Common/Media/FireworksMenu720.swf new file mode 100644 index 00000000..917736e1 Binary files /dev/null and b/Minecraft.Client/Common/Media/FireworksMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/FireworksMenuSplit1080.swf b/Minecraft.Client/Common/Media/FireworksMenuSplit1080.swf new file mode 100644 index 00000000..f8537492 Binary files /dev/null and b/Minecraft.Client/Common/Media/FireworksMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/FireworksMenuSplit720.swf b/Minecraft.Client/Common/Media/FireworksMenuSplit720.swf new file mode 100644 index 00000000..c3e56007 Binary files /dev/null and b/Minecraft.Client/Common/Media/FireworksMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/FireworksMenuVita.swf b/Minecraft.Client/Common/Media/FireworksMenuVita.swf new file mode 100644 index 00000000..e54cdd78 Binary files /dev/null and b/Minecraft.Client/Common/Media/FireworksMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_1.png b/Minecraft.Client/Common/Media/Graphics/Beacon_1.png new file mode 100644 index 00000000..7e272400 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_1.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_2.png b/Minecraft.Client/Common/Media/Graphics/Beacon_2.png new file mode 100644 index 00000000..1668e204 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_2.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_3.png b/Minecraft.Client/Common/Media/Graphics/Beacon_3.png new file mode 100644 index 00000000..818adb91 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_3.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_4.png b/Minecraft.Client/Common/Media/Graphics/Beacon_4.png new file mode 100644 index 00000000..70d5a9e6 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_4.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Cross.png b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Cross.png new file mode 100644 index 00000000..b8194456 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Cross.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Disabled.png b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Disabled.png new file mode 100644 index 00000000..55f7727e Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Disabled.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Hover.png b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Hover.png new file mode 100644 index 00000000..85e785c8 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Hover.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Normal.png b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Normal.png new file mode 100644 index 00000000..29b0cd58 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Normal.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Pressed.png b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Pressed.png new file mode 100644 index 00000000..9c94f518 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Pressed.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Tick.png b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Tick.png new file mode 100644 index 00000000..47e0ad46 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Beacon_Button_Tick.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Absorb.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Absorb.png new file mode 100644 index 00000000..e51ce707 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Absorb.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Wither.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Wither.png new file mode 100644 index 00000000..004bc5c5 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Wither.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Wither_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Wither_Flash.png new file mode 100644 index 00000000..3a20d5f2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Full_Wither_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Absorb.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Absorb.png new file mode 100644 index 00000000..e9529e1a Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Absorb.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Wither.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Wither.png new file mode 100644 index 00000000..0746bdd9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Wither.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Wither_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Wither_Flash.png new file mode 100644 index 00000000..c14d3625 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/Health_Half_Wither_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Full.png b/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Full.png new file mode 100644 index 00000000..c4e90222 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Full.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Full_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Full_Flash.png new file mode 100644 index 00000000..f64c5c55 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Full_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Half.png b/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Half.png new file mode 100644 index 00000000..e07dce1b Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Half.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Half_Flash.png b/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Half_Flash.png new file mode 100644 index 00000000..d5d5ad61 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HorseHealth_Half_Flash.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HorseJump_bar_empty.png b/Minecraft.Client/Common/Media/Graphics/HUD/HorseJump_bar_empty.png new file mode 100644 index 00000000..368e9848 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HorseJump_bar_empty.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HUD/HorseJump_bar_full.png b/Minecraft.Client/Common/Media/Graphics/HUD/HorseJump_bar_full.png new file mode 100644 index 00000000..b7eaca73 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HUD/HorseJump_bar_full.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Horse_Armor_Slot.png b/Minecraft.Client/Common/Media/Graphics/Horse_Armor_Slot.png new file mode 100644 index 00000000..5445c58b Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Horse_Armor_Slot.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/Horse_Saddle_Slot.png b/Minecraft.Client/Common/Media/Graphics/Horse_Saddle_Slot.png new file mode 100644 index 00000000..7df8dbfc Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/Horse_Saddle_Slot.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Beacon.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Beacon.png new file mode 100644 index 00000000..3a22ce06 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Beacon.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Beacon_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Beacon_Small.png new file mode 100644 index 00000000..0d5f33b2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Beacon_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Fireworks.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Fireworks.png new file mode 100644 index 00000000..4d0e5bac Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Fireworks.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Fireworks_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Fireworks_Small.png new file mode 100644 index 00000000..fb1e3a80 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Fireworks_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Hopper.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Hopper.png new file mode 100644 index 00000000..23a09824 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Hopper.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Hopper_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Hopper_Small.png new file mode 100644 index 00000000..6454bcab Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Hopper_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Horses.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Horses.png new file mode 100644 index 00000000..872584b8 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Horses.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Horses_Small.png b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Horses_Small.png new file mode 100644 index 00000000..93ba58c9 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/HowToPlay/HowToPlay_Horses_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/GameOptionsTabOn.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/GameOptionsTabOn.png new file mode 100644 index 00000000..519b87a2 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/GameOptionsTabOn.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/GameOptionsTabOn_Small.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/GameOptionsTabOn_Small.png new file mode 100644 index 00000000..90f65b5b Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/GameOptionsTabOn_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/MoreOptionsTabOff.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/MoreOptionsTabOff.png new file mode 100644 index 00000000..8c408680 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/MoreOptionsTabOff.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/MoreOptionsTabOff_Small.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/MoreOptionsTabOff_Small.png new file mode 100644 index 00000000..336895b0 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/MoreOptionsTabOff_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/WorldOptionsTabOn.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/WorldOptionsTabOn.png new file mode 100644 index 00000000..04c41d25 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/WorldOptionsTabOn.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/WorldOptionsTabOn_Small.png b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/WorldOptionsTabOn_Small.png new file mode 100644 index 00000000..d5752af8 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PanelsAndTabs/WorldOptionsTabOn_Small.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_HealthBoost.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_HealthBoost.png new file mode 100644 index 00000000..dc57f82f Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_HealthBoost.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Wither.png b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Wither.png new file mode 100644 index 00000000..8fa22b21 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/PotionEffect/Potion_Effect_Icon_Wither.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/TutorialExitScreenshot.png b/Minecraft.Client/Common/Media/Graphics/TutorialExitScreenshot.png index b8475962..4052436a 100644 Binary files a/Minecraft.Client/Common/Media/Graphics/TutorialExitScreenshot.png and b/Minecraft.Client/Common/Media/Graphics/TutorialExitScreenshot.png differ diff --git a/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRS_TT.png b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRS_TT.png new file mode 100644 index 00000000..e6d47265 Binary files /dev/null and b/Minecraft.Client/Common/Media/Graphics/X360ControllerIcons/ButtonRS_TT.png differ diff --git a/Minecraft.Client/Common/Media/HTMLColours.col b/Minecraft.Client/Common/Media/HTMLColours.col index 50999d5a..21db75ae 100644 Binary files a/Minecraft.Client/Common/Media/HTMLColours.col and b/Minecraft.Client/Common/Media/HTMLColours.col differ diff --git a/Minecraft.Client/Common/Media/HTMLColours.xml b/Minecraft.Client/Common/Media/HTMLColours.xml index ea6ef00c..8f17132c 100644 --- a/Minecraft.Client/Common/Media/HTMLColours.xml +++ b/Minecraft.Client/Common/Media/HTMLColours.xml @@ -7,14 +7,14 @@ - + - + diff --git a/Minecraft.Client/Common/Media/HUD1080.swf b/Minecraft.Client/Common/Media/HUD1080.swf index c9a05166..261be0e6 100644 Binary files a/Minecraft.Client/Common/Media/HUD1080.swf and b/Minecraft.Client/Common/Media/HUD1080.swf differ diff --git a/Minecraft.Client/Common/Media/HUD480.swf b/Minecraft.Client/Common/Media/HUD480.swf index d8a65a41..25cc211c 100644 Binary files a/Minecraft.Client/Common/Media/HUD480.swf and b/Minecraft.Client/Common/Media/HUD480.swf differ diff --git a/Minecraft.Client/Common/Media/HUD720.swf b/Minecraft.Client/Common/Media/HUD720.swf index 3527bb70..b044e31f 100644 Binary files a/Minecraft.Client/Common/Media/HUD720.swf and b/Minecraft.Client/Common/Media/HUD720.swf differ diff --git a/Minecraft.Client/Common/Media/HUDSplit1080.swf b/Minecraft.Client/Common/Media/HUDSplit1080.swf index cff338b9..c22cfc85 100644 Binary files a/Minecraft.Client/Common/Media/HUDSplit1080.swf and b/Minecraft.Client/Common/Media/HUDSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/HUDSplit720.swf b/Minecraft.Client/Common/Media/HUDSplit720.swf index 405cb99d..ba9937e1 100644 Binary files a/Minecraft.Client/Common/Media/HUDSplit720.swf and b/Minecraft.Client/Common/Media/HUDSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/HUDVita.swf b/Minecraft.Client/Common/Media/HUDVita.swf index 3197a722..03b05f42 100644 Binary files a/Minecraft.Client/Common/Media/HUDVita.swf and b/Minecraft.Client/Common/Media/HUDVita.swf differ diff --git a/Minecraft.Client/Common/Media/HopperMenu1080.swf b/Minecraft.Client/Common/Media/HopperMenu1080.swf new file mode 100644 index 00000000..84394e94 Binary files /dev/null and b/Minecraft.Client/Common/Media/HopperMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/HopperMenu480.swf b/Minecraft.Client/Common/Media/HopperMenu480.swf new file mode 100644 index 00000000..6a9efe29 Binary files /dev/null and b/Minecraft.Client/Common/Media/HopperMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/HopperMenu720.swf b/Minecraft.Client/Common/Media/HopperMenu720.swf new file mode 100644 index 00000000..bbfc69b7 Binary files /dev/null and b/Minecraft.Client/Common/Media/HopperMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/HopperMenuSplit1080.swf b/Minecraft.Client/Common/Media/HopperMenuSplit1080.swf new file mode 100644 index 00000000..98dd6cde Binary files /dev/null and b/Minecraft.Client/Common/Media/HopperMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/HopperMenuSplit720.swf b/Minecraft.Client/Common/Media/HopperMenuSplit720.swf new file mode 100644 index 00000000..030e18aa Binary files /dev/null and b/Minecraft.Client/Common/Media/HopperMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/HopperMenuVita.swf b/Minecraft.Client/Common/Media/HopperMenuVita.swf new file mode 100644 index 00000000..fcb93ba7 Binary files /dev/null and b/Minecraft.Client/Common/Media/HopperMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/HorseInventoryMenu1080.swf b/Minecraft.Client/Common/Media/HorseInventoryMenu1080.swf index 2f383848..db0f4d36 100644 Binary files a/Minecraft.Client/Common/Media/HorseInventoryMenu1080.swf and b/Minecraft.Client/Common/Media/HorseInventoryMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/HorseInventoryMenu480.swf b/Minecraft.Client/Common/Media/HorseInventoryMenu480.swf index 1c1d8177..599c3e38 100644 Binary files a/Minecraft.Client/Common/Media/HorseInventoryMenu480.swf and b/Minecraft.Client/Common/Media/HorseInventoryMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/HorseInventoryMenu720.swf b/Minecraft.Client/Common/Media/HorseInventoryMenu720.swf index b07966bc..eee79a2f 100644 Binary files a/Minecraft.Client/Common/Media/HorseInventoryMenu720.swf and b/Minecraft.Client/Common/Media/HorseInventoryMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/HorseInventoryMenuSplit1080.swf b/Minecraft.Client/Common/Media/HorseInventoryMenuSplit1080.swf index c90925e5..edfa8430 100644 Binary files a/Minecraft.Client/Common/Media/HorseInventoryMenuSplit1080.swf and b/Minecraft.Client/Common/Media/HorseInventoryMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/HorseInventoryMenuSplit720.swf b/Minecraft.Client/Common/Media/HorseInventoryMenuSplit720.swf index d4814571..5883cba4 100644 Binary files a/Minecraft.Client/Common/Media/HorseInventoryMenuSplit720.swf and b/Minecraft.Client/Common/Media/HorseInventoryMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/HorseInventoryMenuVita.swf b/Minecraft.Client/Common/Media/HorseInventoryMenuVita.swf new file mode 100644 index 00000000..606f515e Binary files /dev/null and b/Minecraft.Client/Common/Media/HorseInventoryMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlay1080.swf b/Minecraft.Client/Common/Media/HowToPlay1080.swf index 8a74aae1..c1e91110 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlay1080.swf and b/Minecraft.Client/Common/Media/HowToPlay1080.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlay480.swf b/Minecraft.Client/Common/Media/HowToPlay480.swf index 60449f75..e7cbe808 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlay480.swf and b/Minecraft.Client/Common/Media/HowToPlay480.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlay720.swf b/Minecraft.Client/Common/Media/HowToPlay720.swf index eb7652ac..3e12dbb0 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlay720.swf and b/Minecraft.Client/Common/Media/HowToPlay720.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayMenu1080.swf b/Minecraft.Client/Common/Media/HowToPlayMenu1080.swf index 5dc90de1..6e128ffa 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlayMenu1080.swf and b/Minecraft.Client/Common/Media/HowToPlayMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayMenu480.swf b/Minecraft.Client/Common/Media/HowToPlayMenu480.swf index df33898a..5e25feaf 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlayMenu480.swf and b/Minecraft.Client/Common/Media/HowToPlayMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayMenu720.swf b/Minecraft.Client/Common/Media/HowToPlayMenu720.swf index 0f01ef70..ef85f005 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlayMenu720.swf and b/Minecraft.Client/Common/Media/HowToPlayMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayMenuSplit1080.swf b/Minecraft.Client/Common/Media/HowToPlayMenuSplit1080.swf index 2c1515ce..f44140b6 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlayMenuSplit1080.swf and b/Minecraft.Client/Common/Media/HowToPlayMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayMenuSplit720.swf b/Minecraft.Client/Common/Media/HowToPlayMenuSplit720.swf index c861543a..fe33c20e 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlayMenuSplit720.swf and b/Minecraft.Client/Common/Media/HowToPlayMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayMenuVita.swf b/Minecraft.Client/Common/Media/HowToPlayMenuVita.swf index b2db55a1..aa1ca7a7 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlayMenuVita.swf and b/Minecraft.Client/Common/Media/HowToPlayMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlaySplit1080.swf b/Minecraft.Client/Common/Media/HowToPlaySplit1080.swf index db806225..3ba64d5a 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlaySplit1080.swf and b/Minecraft.Client/Common/Media/HowToPlaySplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlaySplit720.swf b/Minecraft.Client/Common/Media/HowToPlaySplit720.swf index 1735af41..bc9542e3 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlaySplit720.swf and b/Minecraft.Client/Common/Media/HowToPlaySplit720.swf differ diff --git a/Minecraft.Client/Common/Media/HowToPlayVita.swf b/Minecraft.Client/Common/Media/HowToPlayVita.swf index 7ead38e2..51f2397d 100644 Binary files a/Minecraft.Client/Common/Media/HowToPlayVita.swf and b/Minecraft.Client/Common/Media/HowToPlayVita.swf differ diff --git a/Minecraft.Client/Common/Media/InGameHostOptions1080.swf b/Minecraft.Client/Common/Media/InGameHostOptions1080.swf index 9caefeab..207c86a7 100644 Binary files a/Minecraft.Client/Common/Media/InGameHostOptions1080.swf and b/Minecraft.Client/Common/Media/InGameHostOptions1080.swf differ diff --git a/Minecraft.Client/Common/Media/InGameHostOptions480.swf b/Minecraft.Client/Common/Media/InGameHostOptions480.swf index 6177ad68..f0d0e0c6 100644 Binary files a/Minecraft.Client/Common/Media/InGameHostOptions480.swf and b/Minecraft.Client/Common/Media/InGameHostOptions480.swf differ diff --git a/Minecraft.Client/Common/Media/InGameHostOptions720.swf b/Minecraft.Client/Common/Media/InGameHostOptions720.swf index 448b39a3..f4e55bf4 100644 Binary files a/Minecraft.Client/Common/Media/InGameHostOptions720.swf and b/Minecraft.Client/Common/Media/InGameHostOptions720.swf differ diff --git a/Minecraft.Client/Common/Media/InGameHostOptionsSplit1080.swf b/Minecraft.Client/Common/Media/InGameHostOptionsSplit1080.swf index 281f75d9..a45e8a37 100644 Binary files a/Minecraft.Client/Common/Media/InGameHostOptionsSplit1080.swf and b/Minecraft.Client/Common/Media/InGameHostOptionsSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/InGameHostOptionsSplit720.swf b/Minecraft.Client/Common/Media/InGameHostOptionsSplit720.swf index 328a3115..7f76aaaf 100644 Binary files a/Minecraft.Client/Common/Media/InGameHostOptionsSplit720.swf and b/Minecraft.Client/Common/Media/InGameHostOptionsSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/InGameHostOptionsVita.swf b/Minecraft.Client/Common/Media/InGameHostOptionsVita.swf index c9f6c0d7..a7276f10 100644 Binary files a/Minecraft.Client/Common/Media/InGameHostOptionsVita.swf and b/Minecraft.Client/Common/Media/InGameHostOptionsVita.swf differ diff --git a/Minecraft.Client/Common/Media/InGamePlayerOptions1080.swf b/Minecraft.Client/Common/Media/InGamePlayerOptions1080.swf index 12a15405..601cc467 100644 Binary files a/Minecraft.Client/Common/Media/InGamePlayerOptions1080.swf and b/Minecraft.Client/Common/Media/InGamePlayerOptions1080.swf differ diff --git a/Minecraft.Client/Common/Media/InGamePlayerOptions480.swf b/Minecraft.Client/Common/Media/InGamePlayerOptions480.swf index 707d8fdb..9e0b0ad9 100644 Binary files a/Minecraft.Client/Common/Media/InGamePlayerOptions480.swf and b/Minecraft.Client/Common/Media/InGamePlayerOptions480.swf differ diff --git a/Minecraft.Client/Common/Media/InGamePlayerOptions720.swf b/Minecraft.Client/Common/Media/InGamePlayerOptions720.swf index 36c7ea04..bc9c4f6b 100644 Binary files a/Minecraft.Client/Common/Media/InGamePlayerOptions720.swf and b/Minecraft.Client/Common/Media/InGamePlayerOptions720.swf differ diff --git a/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit1080.swf b/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit1080.swf index 65772a1b..c4187a09 100644 Binary files a/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit1080.swf and b/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit720.swf b/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit720.swf index 1c3b7820..ab0b3a7e 100644 Binary files a/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit720.swf and b/Minecraft.Client/Common/Media/InGamePlayerOptionsSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/InGamePlayerOptionsVita.swf b/Minecraft.Client/Common/Media/InGamePlayerOptionsVita.swf index c8d8d370..13c0b653 100644 Binary files a/Minecraft.Client/Common/Media/InGamePlayerOptionsVita.swf and b/Minecraft.Client/Common/Media/InGamePlayerOptionsVita.swf differ diff --git a/Minecraft.Client/Common/Media/Intro1080.swf b/Minecraft.Client/Common/Media/Intro1080.swf index 92569e1a..c9f2d3ba 100644 Binary files a/Minecraft.Client/Common/Media/Intro1080.swf and b/Minecraft.Client/Common/Media/Intro1080.swf differ diff --git a/Minecraft.Client/Common/Media/Intro480.swf b/Minecraft.Client/Common/Media/Intro480.swf index 2b289ff8..425c01fe 100644 Binary files a/Minecraft.Client/Common/Media/Intro480.swf and b/Minecraft.Client/Common/Media/Intro480.swf differ diff --git a/Minecraft.Client/Common/Media/Intro720.swf b/Minecraft.Client/Common/Media/Intro720.swf index 42c086d4..0c2bb3eb 100644 Binary files a/Minecraft.Client/Common/Media/Intro720.swf and b/Minecraft.Client/Common/Media/Intro720.swf differ diff --git a/Minecraft.Client/Common/Media/IntroVita.swf b/Minecraft.Client/Common/Media/IntroVita.swf index 54a9b2d5..8229640d 100644 Binary files a/Minecraft.Client/Common/Media/IntroVita.swf and b/Minecraft.Client/Common/Media/IntroVita.swf differ diff --git a/Minecraft.Client/Common/Media/InventoryMenu1080.swf b/Minecraft.Client/Common/Media/InventoryMenu1080.swf index f7e84e8a..47434cc3 100644 Binary files a/Minecraft.Client/Common/Media/InventoryMenu1080.swf and b/Minecraft.Client/Common/Media/InventoryMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/InventoryMenu480.swf b/Minecraft.Client/Common/Media/InventoryMenu480.swf index c5facdc4..5c129e1d 100644 Binary files a/Minecraft.Client/Common/Media/InventoryMenu480.swf and b/Minecraft.Client/Common/Media/InventoryMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/InventoryMenu720.swf b/Minecraft.Client/Common/Media/InventoryMenu720.swf index e6f3cee0..3de2da83 100644 Binary files a/Minecraft.Client/Common/Media/InventoryMenu720.swf and b/Minecraft.Client/Common/Media/InventoryMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/InventoryMenuSplit1080.swf b/Minecraft.Client/Common/Media/InventoryMenuSplit1080.swf index 4f6e78c5..efe2d484 100644 Binary files a/Minecraft.Client/Common/Media/InventoryMenuSplit1080.swf and b/Minecraft.Client/Common/Media/InventoryMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/InventoryMenuSplit720.swf b/Minecraft.Client/Common/Media/InventoryMenuSplit720.swf index 1e7d00ed..a9d13a05 100644 Binary files a/Minecraft.Client/Common/Media/InventoryMenuSplit720.swf and b/Minecraft.Client/Common/Media/InventoryMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/InventoryMenuVita.swf b/Minecraft.Client/Common/Media/InventoryMenuVita.swf index e38bb07d..1eae726a 100644 Binary files a/Minecraft.Client/Common/Media/InventoryMenuVita.swf and b/Minecraft.Client/Common/Media/InventoryMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/LanguagesMenu1080.swf b/Minecraft.Client/Common/Media/LanguagesMenu1080.swf new file mode 100644 index 00000000..9c0bef5a Binary files /dev/null and b/Minecraft.Client/Common/Media/LanguagesMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/LanguagesMenu480.swf b/Minecraft.Client/Common/Media/LanguagesMenu480.swf new file mode 100644 index 00000000..5cea7c87 Binary files /dev/null and b/Minecraft.Client/Common/Media/LanguagesMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/LanguagesMenu720.swf b/Minecraft.Client/Common/Media/LanguagesMenu720.swf new file mode 100644 index 00000000..09022fd6 Binary files /dev/null and b/Minecraft.Client/Common/Media/LanguagesMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/LanguagesMenuSplit1080.swf b/Minecraft.Client/Common/Media/LanguagesMenuSplit1080.swf new file mode 100644 index 00000000..24d7a0b6 Binary files /dev/null and b/Minecraft.Client/Common/Media/LanguagesMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/LanguagesMenuSplit720.swf b/Minecraft.Client/Common/Media/LanguagesMenuSplit720.swf new file mode 100644 index 00000000..99b9076f Binary files /dev/null and b/Minecraft.Client/Common/Media/LanguagesMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/LanguagesMenuVita.swf b/Minecraft.Client/Common/Media/LanguagesMenuVita.swf new file mode 100644 index 00000000..cffdba59 Binary files /dev/null and b/Minecraft.Client/Common/Media/LanguagesMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu1080.swf b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu1080.swf index 3db865f8..07d81207 100644 Binary files a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu1080.swf and b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu480.swf b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu480.swf index ea1132c0..666f1127 100644 Binary files a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu480.swf and b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu720.swf b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu720.swf index 1cdf4d22..e77beb4e 100644 Binary files a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu720.swf and b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenuVita.swf b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenuVita.swf index 21fede27..5c1d44d9 100644 Binary files a/Minecraft.Client/Common/Media/LaunchMoreOptionsMenuVita.swf and b/Minecraft.Client/Common/Media/LaunchMoreOptionsMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/LoadMenu1080.swf b/Minecraft.Client/Common/Media/LoadMenu1080.swf index e89f1875..d0d61ec7 100644 Binary files a/Minecraft.Client/Common/Media/LoadMenu1080.swf and b/Minecraft.Client/Common/Media/LoadMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/LoadMenu480.swf b/Minecraft.Client/Common/Media/LoadMenu480.swf index ce7ac1ad..e105c9e7 100644 Binary files a/Minecraft.Client/Common/Media/LoadMenu480.swf and b/Minecraft.Client/Common/Media/LoadMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/LoadMenu720.swf b/Minecraft.Client/Common/Media/LoadMenu720.swf index c3976f49..ef33463e 100644 Binary files a/Minecraft.Client/Common/Media/LoadMenu720.swf and b/Minecraft.Client/Common/Media/LoadMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/LoadMenuVita.swf b/Minecraft.Client/Common/Media/LoadMenuVita.swf index 8bbf94e7..a5be6f3f 100644 Binary files a/Minecraft.Client/Common/Media/LoadMenuVita.swf and b/Minecraft.Client/Common/Media/LoadMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/MediaDurango.arc b/Minecraft.Client/Common/Media/MediaDurango.arc index 53e9b222..50240c42 100644 Binary files a/Minecraft.Client/Common/Media/MediaDurango.arc and b/Minecraft.Client/Common/Media/MediaDurango.arc differ diff --git a/Minecraft.Client/Common/Media/MediaOrbis.arc b/Minecraft.Client/Common/Media/MediaOrbis.arc index fcb53c05..aea52dc1 100644 Binary files a/Minecraft.Client/Common/Media/MediaOrbis.arc and b/Minecraft.Client/Common/Media/MediaOrbis.arc differ diff --git a/Minecraft.Client/Common/Media/MediaPS3.arc b/Minecraft.Client/Common/Media/MediaPS3.arc index 7ab3a320..5eb550f8 100644 Binary files a/Minecraft.Client/Common/Media/MediaPS3.arc and b/Minecraft.Client/Common/Media/MediaPS3.arc differ diff --git a/Minecraft.Client/Common/Media/MediaPSVita.arc b/Minecraft.Client/Common/Media/MediaPSVita.arc index 01aa7466..8683db23 100644 Binary files a/Minecraft.Client/Common/Media/MediaPSVita.arc and b/Minecraft.Client/Common/Media/MediaPSVita.arc differ diff --git a/Minecraft.Client/Common/Media/MediaWindows64.arc b/Minecraft.Client/Common/Media/MediaWindows64.arc index 130661a2..5ea229dc 100644 Binary files a/Minecraft.Client/Common/Media/MediaWindows64.arc and b/Minecraft.Client/Common/Media/MediaWindows64.arc differ diff --git a/Minecraft.Client/Common/Media/PressStartToPlay1080.swf b/Minecraft.Client/Common/Media/PressStartToPlay1080.swf index d15bedfc..87de331d 100644 Binary files a/Minecraft.Client/Common/Media/PressStartToPlay1080.swf and b/Minecraft.Client/Common/Media/PressStartToPlay1080.swf differ diff --git a/Minecraft.Client/Common/Media/PressStartToPlay720.swf b/Minecraft.Client/Common/Media/PressStartToPlay720.swf index 30255042..2554a31d 100644 Binary files a/Minecraft.Client/Common/Media/PressStartToPlay720.swf and b/Minecraft.Client/Common/Media/PressStartToPlay720.swf differ diff --git a/Minecraft.Client/Common/Media/QuadrantSignin1080.swf b/Minecraft.Client/Common/Media/QuadrantSignin1080.swf index 760a0319..92e2f348 100644 Binary files a/Minecraft.Client/Common/Media/QuadrantSignin1080.swf and b/Minecraft.Client/Common/Media/QuadrantSignin1080.swf differ diff --git a/Minecraft.Client/Common/Media/QuadrantSignin720.swf b/Minecraft.Client/Common/Media/QuadrantSignin720.swf index fd3542ff..d22c12a2 100644 Binary files a/Minecraft.Client/Common/Media/QuadrantSignin720.swf and b/Minecraft.Client/Common/Media/QuadrantSignin720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsOptionsMenu1080.swf b/Minecraft.Client/Common/Media/SettingsOptionsMenu1080.swf index 9dc478c4..ede96935 100644 Binary files a/Minecraft.Client/Common/Media/SettingsOptionsMenu1080.swf and b/Minecraft.Client/Common/Media/SettingsOptionsMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsOptionsMenu480.swf b/Minecraft.Client/Common/Media/SettingsOptionsMenu480.swf index 717e8ac9..d3d5b93e 100644 Binary files a/Minecraft.Client/Common/Media/SettingsOptionsMenu480.swf and b/Minecraft.Client/Common/Media/SettingsOptionsMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsOptionsMenu720.swf b/Minecraft.Client/Common/Media/SettingsOptionsMenu720.swf index 05a1bc63..ce8434bf 100644 Binary files a/Minecraft.Client/Common/Media/SettingsOptionsMenu720.swf and b/Minecraft.Client/Common/Media/SettingsOptionsMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsOptionsMenuSplit1080.swf b/Minecraft.Client/Common/Media/SettingsOptionsMenuSplit1080.swf index 5bef6ed3..b435a238 100644 Binary files a/Minecraft.Client/Common/Media/SettingsOptionsMenuSplit1080.swf and b/Minecraft.Client/Common/Media/SettingsOptionsMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsOptionsMenuSplit720.swf b/Minecraft.Client/Common/Media/SettingsOptionsMenuSplit720.swf index e6bf0a4e..d178d4cb 100644 Binary files a/Minecraft.Client/Common/Media/SettingsOptionsMenuSplit720.swf and b/Minecraft.Client/Common/Media/SettingsOptionsMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/SettingsOptionsMenuVita.swf b/Minecraft.Client/Common/Media/SettingsOptionsMenuVita.swf index a3ca1b24..562a0c22 100644 Binary files a/Minecraft.Client/Common/Media/SettingsOptionsMenuVita.swf and b/Minecraft.Client/Common/Media/SettingsOptionsMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/SkinSelectMenu1080.swf b/Minecraft.Client/Common/Media/SkinSelectMenu1080.swf index 002d7639..5eaf67fb 100644 Binary files a/Minecraft.Client/Common/Media/SkinSelectMenu1080.swf and b/Minecraft.Client/Common/Media/SkinSelectMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/SkinSelectMenu720.swf b/Minecraft.Client/Common/Media/SkinSelectMenu720.swf index ae8b3ed3..059ae199 100644 Binary files a/Minecraft.Client/Common/Media/SkinSelectMenu720.swf and b/Minecraft.Client/Common/Media/SkinSelectMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/SkinSelectMenuSplit1080.swf b/Minecraft.Client/Common/Media/SkinSelectMenuSplit1080.swf index a6666acf..03c532fe 100644 Binary files a/Minecraft.Client/Common/Media/SkinSelectMenuSplit1080.swf and b/Minecraft.Client/Common/Media/SkinSelectMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/SkinSelectMenuSplit720.swf b/Minecraft.Client/Common/Media/SkinSelectMenuSplit720.swf index b090beaa..a49f20e8 100644 Binary files a/Minecraft.Client/Common/Media/SkinSelectMenuSplit720.swf and b/Minecraft.Client/Common/Media/SkinSelectMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/SkinSelectMenuVita.swf b/Minecraft.Client/Common/Media/SkinSelectMenuVita.swf index 34950165..f46cda9b 100644 Binary files a/Minecraft.Client/Common/Media/SkinSelectMenuVita.swf and b/Minecraft.Client/Common/Media/SkinSelectMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/ToolTips1080.swf b/Minecraft.Client/Common/Media/ToolTips1080.swf index 6bb2e367..2251f80e 100644 Binary files a/Minecraft.Client/Common/Media/ToolTips1080.swf and b/Minecraft.Client/Common/Media/ToolTips1080.swf differ diff --git a/Minecraft.Client/Common/Media/ToolTips480.swf b/Minecraft.Client/Common/Media/ToolTips480.swf index 735361e7..3ebebb9b 100644 Binary files a/Minecraft.Client/Common/Media/ToolTips480.swf and b/Minecraft.Client/Common/Media/ToolTips480.swf differ diff --git a/Minecraft.Client/Common/Media/ToolTips720.swf b/Minecraft.Client/Common/Media/ToolTips720.swf index f29f1649..7c5a5ba4 100644 Binary files a/Minecraft.Client/Common/Media/ToolTips720.swf and b/Minecraft.Client/Common/Media/ToolTips720.swf differ diff --git a/Minecraft.Client/Common/Media/ToolTipsSplit1080.swf b/Minecraft.Client/Common/Media/ToolTipsSplit1080.swf index 91d6327c..820fdda1 100644 Binary files a/Minecraft.Client/Common/Media/ToolTipsSplit1080.swf and b/Minecraft.Client/Common/Media/ToolTipsSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/ToolTipsSplit720.swf b/Minecraft.Client/Common/Media/ToolTipsSplit720.swf index 260092c5..7c5ae7ea 100644 Binary files a/Minecraft.Client/Common/Media/ToolTipsSplit720.swf and b/Minecraft.Client/Common/Media/ToolTipsSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/ToolTipsVita.swf b/Minecraft.Client/Common/Media/ToolTipsVita.swf index f8aa42fc..c2b9dfe8 100644 Binary files a/Minecraft.Client/Common/Media/ToolTipsVita.swf and b/Minecraft.Client/Common/Media/ToolTipsVita.swf differ diff --git a/Minecraft.Client/Common/Media/TradingMenu1080.swf b/Minecraft.Client/Common/Media/TradingMenu1080.swf index b4bd5ebd..75b6292e 100644 Binary files a/Minecraft.Client/Common/Media/TradingMenu1080.swf and b/Minecraft.Client/Common/Media/TradingMenu1080.swf differ diff --git a/Minecraft.Client/Common/Media/TradingMenu480.swf b/Minecraft.Client/Common/Media/TradingMenu480.swf index e6fa8b5f..035b4747 100644 Binary files a/Minecraft.Client/Common/Media/TradingMenu480.swf and b/Minecraft.Client/Common/Media/TradingMenu480.swf differ diff --git a/Minecraft.Client/Common/Media/TradingMenu720.swf b/Minecraft.Client/Common/Media/TradingMenu720.swf index 1ce0cfb1..774e14b8 100644 Binary files a/Minecraft.Client/Common/Media/TradingMenu720.swf and b/Minecraft.Client/Common/Media/TradingMenu720.swf differ diff --git a/Minecraft.Client/Common/Media/TradingMenuSplit1080.swf b/Minecraft.Client/Common/Media/TradingMenuSplit1080.swf index ac6c27ae..2545ebb0 100644 Binary files a/Minecraft.Client/Common/Media/TradingMenuSplit1080.swf and b/Minecraft.Client/Common/Media/TradingMenuSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/TradingMenuSplit720.swf b/Minecraft.Client/Common/Media/TradingMenuSplit720.swf index 73ece9f8..5677b19b 100644 Binary files a/Minecraft.Client/Common/Media/TradingMenuSplit720.swf and b/Minecraft.Client/Common/Media/TradingMenuSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/TradingMenuVita.swf b/Minecraft.Client/Common/Media/TradingMenuVita.swf index f36749fb..e93787ae 100644 Binary files a/Minecraft.Client/Common/Media/TradingMenuVita.swf and b/Minecraft.Client/Common/Media/TradingMenuVita.swf differ diff --git a/Minecraft.Client/Common/Media/TutorialPopup1080.swf b/Minecraft.Client/Common/Media/TutorialPopup1080.swf index 01619554..edd94f4f 100644 Binary files a/Minecraft.Client/Common/Media/TutorialPopup1080.swf and b/Minecraft.Client/Common/Media/TutorialPopup1080.swf differ diff --git a/Minecraft.Client/Common/Media/TutorialPopup480.swf b/Minecraft.Client/Common/Media/TutorialPopup480.swf index fbea78ea..321dd391 100644 Binary files a/Minecraft.Client/Common/Media/TutorialPopup480.swf and b/Minecraft.Client/Common/Media/TutorialPopup480.swf differ diff --git a/Minecraft.Client/Common/Media/TutorialPopup720.swf b/Minecraft.Client/Common/Media/TutorialPopup720.swf index 0d3dcb20..94b6958e 100644 Binary files a/Minecraft.Client/Common/Media/TutorialPopup720.swf and b/Minecraft.Client/Common/Media/TutorialPopup720.swf differ diff --git a/Minecraft.Client/Common/Media/TutorialPopupSplit1080.swf b/Minecraft.Client/Common/Media/TutorialPopupSplit1080.swf index cdb09fc9..bb088d8c 100644 Binary files a/Minecraft.Client/Common/Media/TutorialPopupSplit1080.swf and b/Minecraft.Client/Common/Media/TutorialPopupSplit1080.swf differ diff --git a/Minecraft.Client/Common/Media/TutorialPopupSplit720.swf b/Minecraft.Client/Common/Media/TutorialPopupSplit720.swf index 2234e02c..3626e9c7 100644 Binary files a/Minecraft.Client/Common/Media/TutorialPopupSplit720.swf and b/Minecraft.Client/Common/Media/TutorialPopupSplit720.swf differ diff --git a/Minecraft.Client/Common/Media/TutorialPopupVita.swf b/Minecraft.Client/Common/Media/TutorialPopupVita.swf index e671b2c5..e4866163 100644 Binary files a/Minecraft.Client/Common/Media/TutorialPopupVita.swf and b/Minecraft.Client/Common/Media/TutorialPopupVita.swf differ diff --git a/Minecraft.Client/Common/Media/de-DE/strings.resx b/Minecraft.Client/Common/Media/de-DE/strings.resx index 219cb1b9..430711f8 100644 --- a/Minecraft.Client/Common/Media/de-DE/strings.resx +++ b/Minecraft.Client/Common/Media/de-DE/strings.resx @@ -150,7 +150,7 @@ Minecraft ist ein Spiel, bei dem du Blöcke platzierst, um alles zu bauen, was d Mit{*CONTROLLER_ACTION_LOOK*} kannst du dich umsehen.{*B*}{*B*} Mit{*CONTROLLER_ACTION_MOVE*} kannst du dich bewegen.{*B*}{*B*} Drück{*CONTROLLER_ACTION_JUMP*}, um zu springen.{*B*}{*B*} -Drück{*CONTROLLER_ACTION_MOVE*} zweimal schnell nacheinander nach vorn, um zu sprinten. Solange du{*CONTROLLER_ACTION_MOVE*} nach vorn gedrückt hältst, sprintest du weiter, bis dir die Sprintzeit ausgeht oder deine Hungerleiste weniger als{*ICON_SHANK_03*} anzeigt. +Drück{*CONTROLLER_ACTION_MOVE*} zweimal schnell nacheinander nach vorn, um zu sprinten. Solange du{*CONTROLLER_ACTION_MOVE*} nach vorn gedrückt hältst, sprintest du weiter, bis dir die Sprintzeit ausgeht oder deine Hungerleiste weniger als{*ICON_SHANK_03*} anzeigt..{*B*}{*B*} Halte{*CONTROLLER_ACTION_ACTION*} gedrückt, um mit deiner Hand oder dem, was du darin hältst, zu graben oder zu hacken. Möglicherweise musst du dir ein Werkzeug bauen, um manche Blöcke abbauen zu können.{*B*}{*B*} Wenn du einen Gegenstand in der Hand hältst, kannst du ihn mit{*CONTROLLER_ACTION_USE*} verwenden. Drück{*CONTROLLER_ACTION_DROP*}, um ihn abzulegen. @@ -228,13 +228,13 @@ Du wirst selbst mit Kombinationen von Zutaten experimentieren müssen, um alle v {*T3*}SO WIRD GESPIELT: VERZAUBERN{*ETW*}{*B*}{*B*} -Mithilfe der Erfahrungspunkte, die du erhältst, wenn ein NPC stirbt oder wenn du bestimmte Blöcke abbaust oder im Ofen einschmilzt, kannst du einige Werkzeuge, Waffen, Rüstungen und Bücher verzaubern. {*B*} -Wenn ein Schwert, ein Bogen, eine Axt, eine Spitzhacke, eine Schaufel, eine Rüstung oder ein Buch in das Feld unter dem Buch in den Zaubertisch gelegt werden, zeigen die drei Schaltflächen rechts des Feldes ein paar Zauber und ihre Kosten in Erfahrungsleveln an. {*B*} -Wenn du für einen der Zauber nicht genug Erfahrungslevel hast, werden seine Kosten in Rot angezeigt, sonst in Grün. {*B*}{*B*} -Die tatsächlich angewendete Verzauberung wird zufällig aus den angezeigten Verzauberungen ausgewählt. {*B*}{*B*} -Wenn der Zaubertisch von Bücherregalen umgeben ist (bis hin zu maximal 15 Bücherregalen), wobei zwischen Zaubertisch und Bücherregal ein Block Abstand sein muss, werden die Verzauberungen verstärkt und man kann sehen, wie arkane Schriftzeichen aus dem Buch auf dem Zaubertisch herausfliegen. {*B*}{*B*} +Mithilfe der Erfahrungspunkte, die du erhältst, wenn ein NPC stirbt oder wenn du bestimmte Blöcke abbaust oder im Ofen einschmilzt, kannst du einige Werkzeuge, Waffen, Rüstungen und Bücher verzaubern.{*B*} +Wenn ein Schwert, ein Bogen, eine Axt, eine Spitzhacke, eine Schaufel, eine Rüstung oder ein Buch in das Feld unter dem Buch in den Zaubertisch gelegt werden, zeigen die drei Schaltflächen rechts des Feldes ein paar Zauber und ihre Kosten in Erfahrungsleveln an.{*B*} +Wenn du für einen der Zauber nicht genug Erfahrungslevel hast, werden seine Kosten in Rot angezeigt, sonst in Grün.{*B*}{*B*} +Die tatsächlich angewendete Verzauberung wird zufällig aus den angezeigten Verzauberungen ausgewählt.{*B*}{*B*} +Wenn der Zaubertisch von Bücherregalen umgeben ist (bis hin zu maximal 15 Bücherregalen), wobei zwischen Zaubertisch und Bücherregal ein Block Abstand sein muss, werden die Verzauberungen verstärkt und man kann sehen, wie arkane Schriftzeichen aus dem Buch auf dem Zaubertisch herausfliegen.{*B*}{*B*} Alle Zutaten für einen Zaubertisch kann man in den Dörfern einer Welt finden oder indem man die Welt abbaut und bewirtschaftet.{*B*}{*B*} -Zauberbücher werden beim Amboss benutzt, um Verzauberungen auf Gegenstände anzuwenden. Das gibt dir mir Kontrolle darüber, welche Verzauberungen du auf deinen Gegenständen möchtest.{*B*} +Zauberbücher werden beim Amboss benutzt, um Verzauberungen auf Gegenstände anzuwenden. Das gibt dir mehr Kontrolle darüber, welche Verzauberungen du auf deinen Gegenständen möchtest.{*B*} {*T3*}SO WIRD GESPIELT: TIERHALTUNG{*ETW*}{*B*}{*B*} @@ -301,6 +301,27 @@ Beim Laden oder Erstellen einer Welt kannst du mit der Schaltfläche "Weitere Op {*T2*}Hostprivilegien{*ETW*}{*B*} Aktiviert, dass der Host das Fliegen nutzen, Erschöpfung deaktivieren und sich selbst im Spielmenü unsichtbar machen kann. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + {*T2*}Tageslichtzyklus{*ETW*}{*B*} + Bei Deaktivierung ändert sich die Tageszeit nicht.{*B*}{*B*} + + {*T2*}Inventar behalten{*ETW*}{*B*} + Bei Aktivierung behalten Spieler ihr Inventar, wenn sie sterben.{*B*}{*B*} + + {*T2*}NPC-Eintritt{*ETW*}{*B*} + Bei Deaktivierung erscheinen keine NPCs auf natürlichem Weg.{*B*}{*B*} + + {*T2*}NPC-Griefing{*ETW*}{*B*} + Bei Deaktivierung können Monster und Tiere keine Blöcke verändern (z. B. werden bei Creeper-Explosionen keine Blöcke zerstört und Schafe entfernen kein Gras) oder Gegenstände aufheben.{*B*}{*B*} + + {*T2*}NPC-Beute{*ETW*}{*B*} + Bei Deaktivierung lassen Monster und Tiere keine Beute fallen (z. B. lassen Creeper kein Schießpulver fallen).{*B*}{*B*} + + {*T2*}Felderertrag{*ETW*}{*B*} + Bei Deaktivierung lassen Blöcke keine Gegenstände zurück, wenn sie zerstört werden (z. B. hinterlassen Steinblöcke keine Pflastersteine).{*B*}{*B*} + + {*T2*}Natürliche Erholung{*ETW*}{*B*} + Bei Deaktivierung wird die Gesundheit von Spielern nicht auf natürlichem Weg wiederhergestellt.{*B*}{*B*} + {*T1*}Optionen für das Erstellen der Welt{*ETW*}{*B*} Beim Erstellen einer neuen Welt gibt es einige zusätzliche Optionen.{*B*}{*B*} @@ -317,7 +338,7 @@ Beim Erstellen einer neuen Welt gibt es einige zusätzliche Optionen.{*B*}{*B*} Bei Aktivierung wird der Nether neu erstellt. Das ist nützlich, wenn du einen älteren Spielstand ohne Netherfestungen hast.{*B*}{*B*} {*T1*}Optionen im Spiel{*ETW*}{*B*} - Während des Spielens hast du Zugriff auf eine Reihe von Optionen, indem du mit der BACK-Taste das Spielmenü aufrufst.{*B*}{*B*} + Während des Spielens hast du Zugriff auf eine Reihe von Optionen, indem du mit {*BACK_BUTTON*} das Spielmenü aufrufst.{*B*}{*B*} {*T2*}Hostoptionen{*ETW*}{*B*} Der Host-Spieler und alle anderen als Moderatoren eingesetzten Spieler haben Zugriff auf das Menü "Hostoptionen". In diesem Menü können "Feuer breitet sich aus" und "TNT explodiert" aktiviert und deaktiviert werden.{*B*}{*B*} @@ -344,24 +365,26 @@ Um die Privilegien für einen Spieler zu bearbeiten, rufst du mit {*CONTROLLER_V Ist diese Option aktiviert, kann der Spieler Privilegien für andere Spieler (den Host ausgenommen) ändern, wenn "Spielern vertrauen" ausgeschaltet ist. Der Spieler kann andere Spieler ausschließen und "Feuer breitet sich aus" sowie "TNT explodiert" an- und ausschalten.{*B*}{*B*} {*T2*}Spieler ausschließen{*ETW*}{*B*} - Ist diese Option ausgewählt, werden Spieler, die nicht auf der gleichen {*PLATFORM_NAME*} Konsole wie der Host-Spieler spielen, ebenso wie alle anderen Spieler auf seiner {*PLATFORM_NAME*} Konsole vom Spiel ausgeschlossen. Dieser Spieler kann dem Spiel erst wieder beitreten, wenn es neu gestartet wird.{*B*}{*B*} + {*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} {*T1*}Optionen für Host-Spieler{*ETW*}{*B*} Wenn "Hostprivilegien" aktiviert ist, kann der Host-Spieler einige seiner eigenen Privilegien bearbeiten. Zur Bearbeitung der Privilegien für einen Spieler rufst du mit {*CONTROLLER_VK_A*} das Privilegien-Menü für Spieler auf, wo du die folgenden Optionen nutzen kannst.{*B*}{*B*} {*T2*}Kann fliegen{*ETW*}{*B*} Ist diese Option aktiviert, kann der Spieler fliegen. Diese Option ist nur für den Überlebensmodus relevant, da das Fliegen im Kreativmodus für alle Spieler aktiviert ist.{*B*}{*B*} - + {*T2*}Erschöpfung deaktivieren{*ETW*}{*B*} Diese Option betrifft nur den Überlebensmodus. Aktiviert, dass körperliche Aktivitäten (Laufen/Sprinten/Springen etc.) sich nicht auf die Hungerleiste auswirken. Verletzt der Spieler sich allerdings, verringert sich die Hungerleiste langsam während des Heilungsvorgangs.{*B*}{*B*} - + {*T2*}Unsichtbar{*ETW*}{*B*} Ist diese Option aktiviert, kann der Spieler von anderen Spielern nicht gesehen werden und ist unverwundbar.{*B*}{*B*} - - {*T2*}Kann teleportieren{*ETW*}{*B*} + + {*T2*}Kann teleportieren{*ETW*}{*B*} Dies erlaubt dem Spieler, sich selbst oder andere Spieler zu anderen Spielern in der Welt zu bewegen. +Mit dieser Option wird ein Spieler, der nicht auf der {*PLATFORM_NAME*} Konsole des Hosts spielt, vom Spiel ausgeschlossen; andere Spieler auf der {*PLATFORM_NAME*} Konsole des ausgeschlossenen Spielers werden ebenfalls ausgeschlossen. Dieser Spieler kann dem Spiel erst wieder beitreten, wenn es neu gestartet wird. + Nächste Seite Vorige Seite @@ -374,7 +397,7 @@ Wenn "Hostprivilegien" aktiviert ist, kann der Host-Spieler einige seiner eigene Truhen -Dinge herstellen +Crafting Ofen @@ -425,63 +448,95 @@ sie können dir also leicht zu Hilfe kommen. Neuigkeiten - -{*T3*}Veränderungen und Neuerungen{*ETW*}{*B*}{*B*} -- Neue Gegenstände hinzugefügt: Smaragde, Smaragderz, Smaragdblock, Endertruhe, Stolperdrahthaken, verzauberter goldener Apfel, Amboss, Blumentopf, Pflastersteinmauer, bemooste Pflastersteinmauer, Dörrgemälde, Kartoffel, Ofenkartoffel, giftige Kartoffel, Karotte, goldene Karotte, -Karottenangel, Kürbiskuchen, Nachtsichttrank, Unsichtbarkeitstrank, Netherquarz, Netherquarzerz, Quarzblock, Quarzstufe, Quarztreppe, gemeißelter Quarzblock, Säulen-Quarzblock, Zauberbuch, Teppich.{*B*} -- Neue Rezepte für glatten und gemeißelten Sandstein hinzugefügt.{*B*} -- Neue NPCs hinzugefügt: Zombie-Dorfbewohner.{*B*} -- Neue Geländeerstellungsfunktionen hinzugefügt: Wüstentempel, Wüstendörfer, Dschungeltempel.{*B*} -- Handel mit Dorfbewohnern hinzugefügt.{*B*} -- Ambossmenü hinzugefügt.{*B*} -- Lederrüstungen können nun eingefärbt werden.{*B*} -- Wolfshalsbänder können nun eingefärbt werden.{*B*} -- Beim Reiten auf Schweinen kann mit einer Karottenangel gesteuert werden.{*B*} -- Aktualisierter Bonustruheninhalt mit mehr Gegenständen.{*B*} -- Die Platzierung halber Blöcke sowie von Blöcken auf halben Blöcken wurde geändert.{*B*} -- Die Platzierung von umgedrehten Treppen und Stufen wurde geändert.{*B*} -- Verschiedene Berufe für Dorfbewohner hinzugefügt.{*B*} -- Dorfbewohner, die aus einem Eintrittsei spawnen, haben zufällige Berufe.{*B*} -- Baumstämme können seitwärts platziert werden.{*B*} -- Öfen können mit hölzernen Werkzeugen befeuert werden.{*B*} -- Eis- und Glasscheiben können mit Werkzeugen gesammelt werden, die mit Behutsamkeit verzaubert wurden.{*B*} -- Hölzerne Knöpfe und Druckplatten können durch Pfeile betätigt werden.{*B*} -- Nether-NPCs können oberirdisch aus Portalen spawnen.{*B*} -- Creeper und Spinnen sind aggressiver gegenüber dem Spieler, der sie zuletzt geschlagen hat.{*B*} -- Im Kreativmodus werden NPCs nach kurzer Zeit wieder neutral.{*B*} -- Der Rückstoßeffekt beim Ertrinken wurde entfernt.{*B*} -- Wenn Zombies Türen zerstören, ist der Schaden jetzt sichtbar.{*B*} -- Eis schmilzt im Nether.{*B*} -- Kessel, die draußen im Regen stehen, werden aufgefüllt.{*B*} -- Die Aktualisierungszeit von Kolben wurde verdoppelt.{*B*} -- Schweine verlieren gegebenenfalls ihren Sattel, wenn sie getötet werden.{*B*} -- Die Farbe des Himmels im Ende wurde geändert.{*B*} -- Draht für Stolperdraht kann platziert werden.{*B*} -- Regen tropft durch Blätter.{*B*} -- Hebel können an der Unterseite von Blöcken platziert werden.{*B*} -- Je nach Schwierigkeit verursacht TNT mehr oder weniger Schaden.{*B*} -- Das Bücherrezept wurde geändert.{*B*} -- Boote zerstören jetzt Seerosenblätter, nicht mehr umgekehrt.{*B*} -- Schweine lassen mehr Schweinefleisch fallen.{*B*} -- In superflachen Welten spawnen weniger Slimes.{*B*} -- Creeper verursachen je nach Schwierigkeit mehr oder weniger Schaden und der Rückstoß wurde erhöht.{*B*} -- Das Problem, durch das Endermen ihre Kiefer nicht bewegen konnten, wurde behoben.{*B*} -- Spieler können nun im BACK-Taste-Menü während des Spiels teleportieren.{*B*} -- Neue Hostoptionen für Flug, Unsichtbarkeit und Unverwundbarkeit entfernter Spieler hinzugefügt.{*B*} -- Neue Tutorials über neue Gegenstände und Funktionen zur Tutorial-Welt hinzugefügt.{*B*} -- Die Schallplattentruhen in der Tutorial-Welt wurden neu verteilt.{*B*} +{*T3*}Veränderungen und Neuerungen{*ETW*}{*B*}{*B*} +- Neue Gegenstände hinzugefügt: Ausgehärteter Lehm, gefärbter Lehm, Kohleblock, Heuballen, Aktivierungsschiene, Redstone-Block, Tageslichtsensor, Auswurfblock, Trichter, Lore mit Trichter, Lore mit TNT, Redstone-Vergleicher, beschwerte Druckplatte, Signalfeuer, eingeklemmte Truhe, Feuerwerksrakete, Feuerwerksstern, Netherstern, Leine, Pferderüstung, Namensschild, Pferde-Eintrittsei.{*B*} +- Neue NPCs hinzugefügt: Dürre, Dörrskelette, Hexen, Fledermäuse, Pferde, Esel und Maultiere.{*B*} +- Neue Geländeerstellungsfunktionen hinzugefügt: Hexenhütten.{*B*} +- Signalfeuer-Oberfläche hinzugefügt.{*B*} +- Pferde-Oberfläche hinzugefügt.{*B*} +Trichter-Oberfläche hinzugefügt.{*B*} +- Feuerwerk hinzugefügt: Die Feuerwerk-Oberfläche kann von der Werkbank aufgerufen werden, wenn du die Zutaten zum Craften eines Feuerwerkssterns oder einer Feuerwerksrakete hast.{*B*} +- Abenteuermodus hinzugefügt: Du kannst Blöcke nur mit den richtigen Werkzeugen abbauen.{*B*} +- Viele neue Sounds hinzugefügt.{*B*} +NPCs, Gegenstände und Projektile können jetzt durch Portale gehen.{*B*} +- Repeater können jetzt gesperrt werden, indem ihre Seiten von einem weiteren Repeater mit Strom versorgt werden.{*B*} +- Zombies und Skelette können jetzt andere Waffen und Rüstungen haben.{*B*} +- Neue Todesmeldungen.{*B*} +- Benenne NPCs mit einem Namensschild und benenne Behälter um, um den Titel des geöffneten Menüs zu ändern.{*B*} +- Knochenmehl lässt nicht mehr alles sofort zu voller Größe wachsen, sondern in zufälligen Stufen.{*B*} +- Ein Redstone-Signal, das den Inhalt von Truhen, Brauständen, Dispensern und Jukeboxen beschreibt, kann aufgefangen werden, indem ein Redstone-Vergleicher direkt daran platziert wird.{*B*} +- Dispenser können in jede Richtung zeigen.{*B*} +- Goldene Äpfel verleihen Spielern kurzfristig zusätzliche Absorptions-Gesundheit.{*B*} +- In einem Gebiet erscheinende Monster werden mit zunehmender Dauer des Aufenthalts immer schwieriger.{*B*} {*ETB*}Willkommen zurück! Vielleicht hast du es gar nicht bemerkt, aber dein Minecraft wurde gerade aktualisiert.{*B*}{*B*} Es gibt jede Menge neue Funktionen für dich und deine Freunde. Hier stellen wir dir nur ein paar Highlights vor. Lies sie dir durch und dann ziehe los und hab Spaß!{*B*}{*B*} -{*T1*}Neue Gegenstände{*ETB*}: Smaragde, Smaragderz, Smaragdblock, Endertruhe, Stolperdrahthaken, verzauberter goldener Apfel, Amboss, Blumentopf, Pflastersteinmauer, bemooste Pflastersteinmauer, Dörrgemälde, Kartoffel, Ofenkartoffel, giftige Kartoffel, Karotte, goldene Karotte, -Karottenangel, Kürbiskuchen, Nachtsichttrank, Unsichtbarkeitstrank, Netherquarz, Netherquarzerz, Quarzblock, Quarzstufe, Quarztreppe, gemeißelter Quarzblock, Säulen-Quarzblock, Zauberbuch, Teppich.{*B*}{*B*} - {*T1*}Neue NPCs{*ETB*} – Zombie-Dorfbewohner.{*B*}{*B*} -{*T1*}Neue Funktionen{*ETB*}: Handel mit Dorfbewohnern, Waffen und Werkzeuge auf Ambossen reparieren oder verzaubern, Gegenstände in einer Endertruhe lagern, Steuerung beim Reiten auf Schweinen mit einer Karottenangel!{*B*}{*B*} -{*T1*}Neue Mini-Tutorials{*ETB*} – Lerne in der Tutorial-Welt, wie man die neuen Features benutzt!{*B*}{*B*} -{*T1*}Neue 'Easter Eggs'{*ETB*} – Wir haben alle geheimen Schallplatten in der Tutorial-Welt neu platziert. Versuch, sie alle wiederzufinden!{*B*}{*B*} +{*T1*}Neue Gegenstände{*ETB*} – Ausgehärteter Lehm, gefärbter Lehm, Kohleblock, Heuballen, Aktivierungsschiene, Redstone-Block, Tageslichtsensor, Auswurfblock, Trichter, Lore mit Trichter, Lore mit TNT, Redstone-Vergleicher, beschwerte Druckplatte, Signalfeuer, eingeklemmte Truhe, Feuerwerksrakete, Feuerwerksstern, Netherstern, Leine, Pferderüstung, Namensschild, Pferde-Eintrittsei.{*B*}{*B*} +{*T1*}Neue NPCs{*ETB*} – Dürre, Dörrskelette, Hexen, Fledermäuse, Pferde, Esel und Maultiere.{*B*}{*B*} +{*T1*}Neue Features{*ETB*} – Zähme und reite ein Pferd, crafte Feuerkwerk für eine Show, benenne Tiere und Monster mit einem Namensschild, erschaffe fortgeschrittenere Redstone-Schaltkreise und neue Hostoptionen zur Kontrolle der Gastberechtigungen!{*B*}{*B*} +{*T1*}Neue Tutorial-Welt{*ETB*} – Lerne den Umgang mit neuen und alten Features. Versuche, alle geheimen Schallplatten in der Welt zu finden!{*B*}{*B*} +Pferde + +{*T3*}SO WIRD GESPIELT: PFERDE{*ETW*}{*B*}{*B*} +Pferde und Esel findet man hauptsächlich auf freiem Feld. Maultiere sind die Nachfahren von jeweils einem Esel und einem Pferd, sie sind aber selbst unfruchtbar.{*B*} +Alle ausgewachsenen Pferde, Esel und Maultiere können geritten werden. Allerdings können nur Pferden Rüstungen angelegt werden und nur Maultiere sowie Esel können mit Satteltaschen für den Transport von Gegenständen ausgestattet werden.{*B*}{*B*} +Pferde, Esel und Maultiere müssen vor dem Gebrauch gezähmt werden. Du zähmst ein Pferd, indem du versuchst, es zu reiten, und oben bleibst, wenn es versucht, dich abzuwerfen.{*B*} +Wenn um das Pferd herum Liebesherzen erscheinen, ist es zahm und versucht nicht mehr, dich abzuwerfen. Um ein Pferd beim Reiten zu lenken, musst du ihm einen Sattel anlegen.{*B*}{*B*} +Du kannst Sättel von Dorfbewohnern kaufen oder in versteckten Truhen in der Welt finden.{*B*} +Du kannst zahmen Eseln und Maultieren Satteltaschen geben, indem du eine Truhe anbringst. Du kannst dann während des Reitens oder beim Schleichen auf die Taschen zugreifen.{*B*}{*B*} +Pferde und Esel (nicht aber Maultiere) können wie andere Tiere mithilfe von goldenen Äpfeln oder goldenen Karotten gezüchtet werden.{*B*} +Fohlen wachsen mit der Zeit zu Pferden heran und du kannst dies beschleunigen, indem du sie mit Weizen oder Heu fütterst.{*B*} + + +Signalfeuer + +{*T3*}SO WIRD GESPIELT: SIGNALFEUER{*ETW*}{*B*}{*B*} +Aktive Signalfeuer werfen einen hellen Lichtstrahl in den Himmel und gewähren Spielern in der Nähe Kräfte.{*B*} +Sie werden aus Glas, Obsidian und Nethersternen gefertigt, die du erhältst, wenn du die Dürre besiegst.{*B*}{*B*} +Signalfeuer müssen auf Pyramiden aus Eisen, Gold, Smaragd oder Diamant so platziert werden, dass sie tagsüber dem Sonnenlicht ausgesetzt sind.{*B*} +Das Material der Unterlage hat keine Auswirkungen auf die Kraft des Signalfeuers.{*B*}{*B*} +Im Signalfeuermenü kannst du eine Hauptkraft für dein Signalfeuer auswählen. Je mehr Stufen deine Pyramide hat, desto mehr Kräfte stehen dir zur Auswahl.{*B*} +Bei einem Signalfeuer auf einer Pyramide mit mindestens vier Stufen hast du außerdem die Option, entweder die Regeneration als Zweitkraft oder eine stärkere Hauptkraft auszuwählen.{*B*}{*B*} +Um die Kräfte deines Signalfeuers einzustellen, musst du einen Smaragd, Diamant, Gold- oder Eisenbarren im Bezahl-Slot opfern.{*B*} +Danach strahlt das Signalfeuer für unbegrenzte Zeit die Kräfte aus.{*B*} + + +Feuerwerk + +{*T3*}SO WIRD GESPIELT: FEUERWERK{*ETW*}{*B*}{*B*} +Feuerwerk sind dekorative Gegenstände, die manuell oder von Dispensern gestartet werden können. Sie werden aus Papier, Schießpulver und wahlweise einigen Feuerwerkssternen gecraftet.{*B*} +Farben, Verblassen, Form, Größe und Effekte (wie Spuren und Funkeln) von Feuerwerkssternen können beim Craften durch zusätzliche Zutaten angepasst werden.{*B*}{*B*} +Feuerkwerk craftest du, indem du Schießpulver und Papier in das 3x3-Crafting-Raster legst, das über deinem Inventar angezeigt wird.{*B*} +Du kannst wahlweise mehrere Feuerwerkssterne in das Raster legen, um sie dem Feuerwerk hinzuzufügen.{*B*} +Mehr Schießpulver im Raster erhöht die Höhe, in der Feuerwerkssterne explodieren.{*B*}{*B*} +Du kannst das fertige Feuerwerk dann aus dem Ausgabeplatz nehmen.{*B*}{*B*} +Feuerwerkssterne werden hergestellt, indem du Schießpulver und Farbe in das Raster legst.{*B*} + – Die Explosion des Feuerwerkssterns nimmt die jeweilige Farbe an.{*B*} + – Die Form des Feuerwerkssterns ändert sich durch das Hinzufügen von Feuerkugeln, Goldklumpen, Federn oder NPC-Köpfen.{*B*} + – Spur oder Funkeln können mit Diamanten oder Glowstone-Staub hinzugefügt werden.{*B*}{*B*} +Wenn ein Feuerwerksstern gecraftet wurde, kannst du das Verblassen mit Farbe ändern. + + +Trichter + +{*T3*}SO WIRD GESPIELT: TRICHTER{*ETW*}{*B*}{*B*} +Mit Trichtern kannst du Gegenstände in Behälter füllen oder sie daraus entnehmen sowie automatisch Gegenstände aufheben, die hineingeworfen werden.{*B*} +Sie können mit Brauständen, Truhen, Dispensern, Auswurfblöcken, Loren mit Truhen, Loren mit Trichtern sowie anderen Trichtern verwendet werden.{*B*}{*B*} +Trichter versuchen fortwährend, Gegenstände aus einem geeigneten Behälter aufzusaugen, der über ihnen platziert wird. Sie versuchen auch, gelagerte Gegenstände in einen Ausgabebehälter zu legen.{*B*} +Wenn ein Trichter mit Redstone betrieben wird, wird er inaktiv und hört auf, Gegenstände aufzusaugen und einzufügen.{*B*}{*B*} +Ein Trichter zeigt in die Ausgaberichtung für Gegenstände. Damit ein Trichter auf einen bestimmten Block zeigt, platzierst du ihn dagegen, während du schleichst.{*B*} + + +Auswurfblöcke + +{*T3*}SO WIRD GESPIELT: AUSWURFBLÖCKE{*ETW*}{*B*}{*B*} +Von Redstone mit Energie versorgte Auswurfblöcke lassen einen einzelnen, zufälligen Gegenstand fallen. Öffne den Auswurfblock mit {*CONTROLLER_ACTION_USE*} und fülle ihn dann mit Gegenständen aus deinem Inventar.{*B*} +Wenn der Auswurfblock einer Truhe oder einem anderen Behälter zugewandt ist, wird der Gegenstand stattdessen darin abgelegt. Lange Ketten aus Auswurfblöcken können hergestellt werden, um Gegenstände über längere Entfernungen zu transportieren. Dafür müssen sie abwechselnd ein- und ausgeschaltet werden. + + Fügt mehr Schaden zu als eine leere Hand. Hiermit kannst du Erde, Gras, Sand, Kies und Schnee schneller als mit der Hand abbauen. Du brauchst eine Schaufel, um Schneebälle abzubauen. @@ -613,10 +668,36 @@ haben. Erzeugt ein Abbild einer Gegend, bei deren Erforschung du sie in der Hand hattest. Nützlich, um den Weg zu finden. +Wird bei Benutzung zu einem Kartenteil der aktuellen Welt und füllt sich, wenn du die Gegend erkundest. + Erlaubt Fernangriffe mit Pfeilen. Wird als Munition für Bögen verwendet. +Von der Dürre fallen gelassen, wird zur Herstellung von Signalfeuern verwendet. + +Erzeugt bei Aktivierung bunte Explosionen. Die Farbe, der Effekt, die Form und das Verblassen hängen davon ab, welcher Feuerwerksstern zur Herstellung verwendet wird. + +Legt die Farbe, den Effekt und die Form eines Feuerwerks fest. + +Wird in Redstone-Schaltkreisen verwendet, um die Signalstärke aufrechtzuerhalten, zu vergleichen oder zu mindern, oder um bestimmte Blockzustände zu messen. + +Ein Lorentyp, der als beweglicher TNT-Block funktioniert. + +Ein Block, der auf Grundlage des Sonnenlichts (oder des Mangels an Sonnenlicht) ein Redstone-Signal ausgibt. + +Ein besonderer Lorentyp, der ähnlich funktioniert wie ein Trichter. Er sammelt Gegenstände, die auf Schienen liegen, und aus Behältern darüber. + +Ein besonderer Rüstungstyp, der einem Pferd angelegt werden kann. Gewährt 5 Rüstungspunkte. + +Ein besonderer Rüstungstyp, der einem Pferd angelegt werden kann. Gewährt 7 Rüstungspunkte. + +Ein besonderer Rüstungstyp, der einem Pferd angelegt werden kann. Gewährt 11 Rüstungspunkte. + +Hiermit kannst du NPCs am Spieler oder an Zaunpfosten festbinden. + +Hiermit kannst du NPCs in der Welt Namen geben. + Regeneriert 2,5{*ICON_SHANK_01*}. Regeneriert 1,5{*ICON_SHANK_01*}. Kann 6-mal verwendet werden. @@ -668,7 +749,7 @@ Kann auch genutzt werden, um ein wenig Licht zu erzeugen. Beschleunigt darüberfahrende Loren, wenn sie unter Strom steht. Wenn kein Strom anliegt, bewirkt sie, dass Loren auf ihr anhalten. -Funktioniert wie eine Druckplatte – sendet ein Redstone-Signal, wenn sie aktiviert wird, kann aber nur durch Loren aktiviert werden. +Funktioniert wie eine Druckplatte – sendet ein Redstone-Signal, wenn sie aktiviert wird, kann aber nur durch Loren aktiviert werden. Kann dich, ein Tier oder ein Monster auf Schienen transportieren. @@ -944,100 +1025,158 @@ statt nur 3.) NPC-Köpfe können als Dekoration platziert werden oder als Maske anstatt eines Helms getragen werden. +Hiermit werden Befehle ausgeführt. + +Wirft einen Lichtstrahl in den Himmel und kann Spielern in der Nähe Statuseffekte gewähren. + +Lässt dich in ihrem Inneren Blöcke und Gegenstände lagern. Platzier zwei Truhen nebeneinander, um eine größere Truhe mit der doppelten Kapazität zu erschaffen. Die eingeklemmte Truhe erstellt beim Öffnen außerdem eine Redstone-Ladung. + +Gewährt eine Redstone-Ladung. Die Ladung wird stärker, wenn mehr Gegenstände auf der Platte liegen. + +Gewährt eine Redstone-Ladung. Die Ladung wird stärker, wenn mehr Gegenstände auf der Platte liegen. Erfordert mehr Gewicht als die leichte Platte. + +Dient als Redstone-Energiequelle. Kann in Redstone zurückverwandelt werden. + +Kann Gegenstände fangen oder sie in Behälter legen bzw. aus ihnen entfernen. + +Ein Schienentyp, der Loren mit Trichtern aktivieren oder deaktivieren und Loren mit TNT auslösen kann. + +Kann Gegenstände lagern und ablegen oder in einen anderen Behälter schieben, wenn er einen Impuls von einem Redstone-Stromkreis erhält. + +Bunte Blöcke aus gefärbtem, ausgehärtetem Lehm. + +Kann an Pferde, Esel oder Maultiere verfüttert werden, um bis zu 10 Herzen zu heilen. Lässt Fohlen schneller wachsen. + +Wird hergestellt, indem man Lehm in einem Ofen schmilzt. + +Wird aus Glas und einer Farbe hergestellt. + +Wird aus Buntglas hergestellt. + +Eine kompakte Art, Kohle zu lagern. Kann als Brennstoff in Öfen verwendet werden. + Tintenfisch - + Wenn er getötet wird, lässt er einen Tintensack fallen. - + Kuh - + Wenn sie getötet wird, lässt sie Leder fallen. Kann außerdem mit einem Eimer gemolken werden. - + Schaf - + Wenn es geschoren wird, lässt es Wolle fallen, wenn es nicht schon geschoren war. Kann gefärbt werden, wodurch seine Wolle eine andere Farbe erhält. - + Huhn - + Wenn es getötet wird, lässt es Federn fallen. Legt in zufälligen Abständen Eier. - + Schwein - + Wenn es getötet wird, lässt es Schweinefleisch fallen. Kann mithilfe eines Sattels geritten werden. - + Wolf - + Friedlich, bis er angegriffen wird, dann wehrt er sich. Kann mithilfe von Knochen gezähmt werden. Der Wolf wird dir dann folgen und alles angreifen, was dich angreift. - + Creeper - + Explodiert, wenn du ihm zu nahe kommst! - + Skelett - + Schießt mit Pfeilen auf dich. Wenn es getötet wird, lässt es Pfeile fallen. - + Spinne - + Greift dich an, wenn du ihr zu nahe kommst. Kann Wände hochklettern. Wenn sie getötet wird, lässt sie Faden fallen. - + Zombie - + Greift dich an, wenn du ihm zu nahe kommst. - + Zombie-Schweinezüchter - + Eigentlich friedlich, greift dich aber in Gruppen an, wenn du einen angreifst. - + Ghast - + Schießt Feuerbälle auf dich, die beim Auftreffen explodieren. - + Slime - + Zerfällt in kleinere Slimes, wenn er Schaden erhält. - + Enderman - + Greift dich an, wenn du ihn ansiehst. Kann außerdem Blöcke bewegen. - + Silberfisch - + Lockt in der Nähe versteckte Silberfische an, wenn er angegriffen wird. Versteckt sich in Steinblöcken. - + Höhlenspinne - + Hat einen giftigen Biss. - + Pilzkuh - + Kann mithilfe einer Schüssel zu Pilzsuppe verarbeitet werden. Lässt Pilze fallen und wird zu einer normalen Kuh, wenn man sie schert. - + Schneegolem - + Der Schneegolem entsteht, wenn Spieler Schneeblöcke und einen Kürbis kombinieren. Bewirft die Feinde seines Erbauers mit Schneebällen. - + Enderdrache - + Ein großer schwarzer Drache, den man im Ende findet. - + Lohe - + Gegner, die man im Nether findet, vorwiegend in Netherfestungen. Lassen Lohenruten fallen, wenn sie getötet werden. - + Magmawürfel - + Findet man im Nether. Ähnlich wie Schleim zerfallen sie zu kleineren Versionen, wenn man sie tötet. - + Dorfbewohner - + Ozelot - + Findet man in Dschungeln. Füttere sie mit rohem Fisch, um sie zu zähmen. Du musst aber zulassen, dass der Ozelot sich dir nähert, denn bei schnellen Bewegungen läuft er weg. - + Eisengolem - + Erscheinen in Dörfern, um sie zu beschützen, und können mittels Eisenblöcken und Kürbissen erstellt werden. - + +Fledermaus + +Diese fliegenden Geschöpfe findet man in Höhlen oder anderen großen geschlossenen Räumen. + +Hexe + +Diese Feinde findet man in Sümpfen, und sie werfen mit Tränken nach dir, um dich anzugreifen. Wenn sie sterben, lassen sie Tränke fallen. + +Pferd + +Diese Tiere können gezähmt und dann geritten werden. + +Esel + +Diese Tiere können gezähmt und dann geritten werden. Du kannst Truhen an ihnen anbringen. + +Maultier + +Eine Kreuzung aus einem Pferd und einem Esel. Diese Tiere können gezähmt und dann geritten werden. Sie können Truhen tragen. + +Zombiepferd + +Skelettpferd + +Dürre + +Werden aus Dörrschädeln und Seelensand hergestellt. Feuern explodierende Schädel auf dich ab. + Explosives Animator Concept Artist @@ -1384,6 +1523,8 @@ statt nur 3.) Karte +Leere Karte + Schallplatte - "13" Schallplatte - "cat" @@ -1486,6 +1627,28 @@ statt nur 3.) Creeper-Kopf +Netherstern + +Feuerwerksrakete + +Feuerwerksstern + +Redstone-Vergleicher + +Lore mit TNT + +Lore mit Trichter + +Eisen-Pferderüstung + +Gold-Pferderüstung + +Diamant-Pferderüstung + +Leine + +Namensschild + Stein Grasblock @@ -1502,6 +1665,8 @@ statt nur 3.) Dschungelholzbretter +Holzbretter (jeder Typ) + Setzling Eichensetzling @@ -1838,6 +2003,190 @@ statt nur 3.) Schädel +Befehlsblock + +Signalfeuer + +Eingeklemmte Truhe + +Beschwerte Druckplatte (leicht) + +Beschwerte Druckplatte (schwer) + +Redstone-Vergleicher + +Tageslichtsensor + +Redstone-Block + +Trichter + +Aktivierungsschiene + +Auswurfblock + +Gefärbter Lehm + +Heuballen + +Ausgehärteter Lehm + +Kohleblock + +Schwarz gefärbter Lehm + +Rot gefärbter Lehm + +Grün gefärbter Lehm + +Braun gefärbter Lehm + +Blau gefärbter Lehm + +Lila gefärbter Lehm + +Cyanfarbener gefärbter Lehm + +Hellgrau gefärbter Lehm + +Grau gefärbter Lehm + +Rosa gefärbter Lehm + +Hellgrün gefärbter Lehm + +Gelb gefärbter Lehm + +Hellblau gefärbter Lehm + +Magentafarben gefärbter Lehm + +Orange gefärbter Lehm + +Weiß gefärbter Lehm + +Buntglas + +Schwarzes Buntglas + +Rotes Buntglas + +Grünes Buntglas + +Braunes Buntglas + +Blaues Buntglas + +Lila Buntglas + +Cyanfarbenes Buntglas + +Hellgraues Buntglas + +Graues Buntglas + +Rosa Buntglas + +Hellgrünes Buntglas + +Gelbes Buntglas + +Hellblaues Buntglas + +Magentafarbenes Buntglas + +Oranges Buntglas + +Weißes Buntglas + +Buntglasscheibe + +Schwarze Buntglasscheibe + +Rote Buntglasscheibe + +Grüne Buntglasscheibe + +Braune Buntglasscheibe + +Blaue Buntglasscheibe + +Lila Buntglasscheibe + +Cyanfarbene Buntglasscheibe + +Hellgraue Buntglasscheibe + +Graue Buntglasscheibe + +Rosa Buntglasscheibe + +Hellgrüne Buntglasscheibe + +Gelbe Buntglasscheibe + +Hellblaue Buntglasscheibe + +Magentafarbene Buntglasscheibe + +Orange Buntglasscheibe + +Weiße Buntglasscheibe + +Kleiner Ball + +Großer Ball + +Sternförmig + +Creeper-förmig + +Explosion + +Unbekannte Form + +Schwarz + +Rot + +Grün + +Braun + +Blau + +Lila + +Cyan + +Hellgrau + +Grau + +Rosa + +Hellgrün + +Gelb + +Hellblau + +Magenta + +Orange + +Weiß + +Andere + +Verblassen + +Funkeln + +Spur + +Flugdauer: +  Derzeitige Steuerung Layout @@ -2015,8 +2364,7 @@ Nachts treiben sich Monster herum, du solltest dir einen Unterstand bauen, bevor Dies ist dein Inventar. Hier werden die Gegenstände angezeigt, die du in deiner Hand verwenden kannst, sowie alle anderen Gegenstände, die du bei dir trägst. Außerdem wird hier deine Rüstung angezeigt. - - + {*B*} Drück zum Fortfahren{*CONTROLLER_VK_A*}.{*B*} Drück{*CONTROLLER_VK_B*}, wenn du bereits weißt, wie das Inventar verwendet wird. @@ -2037,7 +2385,7 @@ Nachts treiben sich Monster herum, du solltest dir einen Unterstand bauen, bevor - Wenn du mehr Informationen über einen Gegenstand brauchst, beweg den Cursor über den Gegenstand und drück{*CONTROLLER_VK_RT*}. + Wenn du mehr Informationen über einen Gegenstand brauchst, beweg den Cursor über den Gegenstand und drück{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. @@ -2071,7 +2419,7 @@ Nachts treiben sich Monster herum, du solltest dir einen Unterstand bauen, bevor - Wenn du mehr Informationen über einen Gegenstand brauchst, beweg den Cursor über den Gegenstand und drück{*CONTROLLER_VK_RT*}. + Wenn du mehr Informationen über einen Gegenstand brauchst, beweg den Cursor über den Gegenstand und drück{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. @@ -2618,6 +2966,211 @@ Im Flugmodus halte{*CONTROLLER_ACTION_JUMP*} nach unten gedrückt, um dich nach Drück{*CONTROLLER_VK_B*}, wenn du schon alles über die Hungerleiste und die Nahrungsaufnahme weißt. + + Dies ist das Pferdeinventar. + + + + {*B*}Drücke zum Fortfahren {*CONTROLLER_VK_A*}. + {*B*}Drücke {*CONTROLLER_VK_B*}, wenn du bereits weißt, wie das Pferdeinventar verwendet wird. + + + + Im Pferdeinventar kannst du Gegenstände an dein Pferd, deinen Esel oder dein Maultier übertragen oder es mit ihnen ausrüsten. + + + + Sattle dein Pferd, indem du einen Sattel im Sattel-Slot platzierst. Pferde können Rüstungen tragen, wenn du Pferderüstung im Rüstungs-Slot platzierst. + + + + Du kannst hier auch Gegenstände zwischen deinem eigenen Inventar und den Satteltaschen von Eseln und Maultieren austauschen. + + +Du hast ein Pferd gefunden. + +Du hast einen Esel gefunden. + +Du hast ein Maultier gefunden. + + + {*B*}Drücke {*CONTROLLER_VK_A*}, um mehr über Pferde, Esel und Maultiere zu erfahren. + {*B*}Drücke {*CONTROLLER_VK_B*}, wenn du bereits alles über Pferde, Esel und Maultiere weißt. + + + + Pferde und Esel findet man hauptsächlich auf freiem Feld. Maultiere sind die Nachfahren von jeweils einem Esel und einem Pferd, sie sind aber selbst unfruchtbar. + + + + Alle ausgewachsenen Pferde, Esel und Maultiere können geritten werden. Allerdings können nur Pferden Rüstungen angelegt werden und nur Maultiere sowie Esel können mit Satteltaschen für den Transport von Gegenständen ausgestattet werden. + + + + Pferde, Esel und Maultiere müssen vor dem Gebrauch gezähmt werden. Du zähmst ein Pferd, indem du versuchst, es zu reiten, und oben bleibst, wenn es versucht, dich abzuwerfen. + + + + Wenn das Tier gezähmt ist, erscheinen Liebesherzen und es versucht nicht mehr, dich abzuwerfen. + + + + Versuche jetzt, dieses Pferd zu reiten. Verwende {*CONTROLLER_ACTION_USE*} ohne Gegenstände oder Werkzeuge in der Hand, um aufzusteigen. + + + + Um ein Pferd beim Reiten zu lenken, musst du ihm einen Sattel anlegen. Du kannst Sättel von Dorfbewohnern kaufen oder in versteckten Truhen in der Welt finden. + + + + Du kannst zahmen Eseln und Maultieren Satteltaschen geben, indem du eine Truhe anbringst. Du kannst dann während des Reitens oder beim Schleichen auf die Taschen zugreifen. + + + + Pferde und Esel (nicht aber Maultiere) können wie andere Tiere mithilfe von goldenen Äpfeln oder goldenen Karotten gezüchtet werden. Fohlen wachsen mit der Zeit zu Pferden heran und du kannst dies beschleunigen, indem du sie mit Weizen oder Heu fütterst. + + + + Du kannst versuchen, die Pferde und Esel hier zu zähmen, und in den Truhen in der Nähe liegen Sättel, Pferderüstungen und andere nützliche Dinge. + + + + Dies ist das Signalfeuermenü. Hier kannst du auswählen, welche Kräfte dein Signalfeuer gewähren soll. + + + + {*B*}Drücke zum Fortfahren {*CONTROLLER_VK_A*}. + {*B*}Drücke {*CONTROLLER_VK_B*}, wenn du bereits weißt, wie das Signalfeuermenü verwendet wird. + + + + Im Signalfeuermenü kannst du 1 Hauptkraft für dein Signalfeuer auswählen. Je mehr Stufen deine Pyramide hat, desto mehr Kräfte stehen dir zur Auswahl. + + + + Bei einem Signalfeuer auf einer Pyramide mit mindestens 4 Stufen hast du außerdem die Option, entweder die Regeneration als Zweitkraft oder eine stärkere Hauptkraft auszuwählen. + + + + Um die Kräfte deines Signalfeuers einzustellen, musst du einen Smaragd, Diamant, Gold- oder Eisenbarren im Bezahl-Slot opfern. Danach strahlt das Signalfeuer für unbegrenzte Zeit die Kräfte aus. + + +Auf der Spitze dieser Pyramide steht ein inaktives Signalfeuer. + + + {*B*}Drücke {*CONTROLLER_VK_A*}, um mehr über Signalfeuer zu erfahren. + {*B*}Drücke {*CONTROLLER_VK_B*}, wenn du bereits alles über Signalfeuer weißt. + + + + Aktive Signalfeuer werfen einen hellen Lichtstrahl in den Himmel und gewähren Spielern in der Nähe Kräfte. Sie werden aus Glas, Obsidian und Nethersternen gefertigt, die du erhältst, wenn du die Dürre besiegst. + + + + Signalfeuer müssen auf Pyramiden aus Eisen, Gold, Smaragd oder Diamant so platziert werden, dass sie tagsüber dem Sonnenlicht ausgesetzt sind. Das Material der Unterlage hat aber keine Auswirkungen auf die Kraft des Signalfeuers. + + + + Verwende das Signalfeuer, um die gewährte Kraft festzulegen. Du kannst mit den bereitgestellten Eisenbarren bezahlen. + + +Dieser Raum enthält Trichter. + + + {*B*}Drücke {*CONTROLLER_VK_A*}, um mehr über Trichter zu erfahren. + {*B*}Drücke {*CONTROLLER_VK_B*}, wenn du bereits alles über Trichter weißt. + + + + Mit Trichtern kannst du Gegenstände in Behälter füllen oder sie daraus entnehmen sowie automatisch Gegenstände aufheben, die hineingeworfen werden. + + + + Sie können mit Brauständen, Truhen, Dispensern, Auswurfblöcken, Loren mit Truhen, Loren mit Trichtern sowie anderen Trichtern verwendet werden. + + + + Trichter versuchen fortwährend, Gegenstände aus einem geeigneten Behälter aufzusaugen, der über ihnen platziert wird. Sie versuchen auch, gelagerte Gegenstände in einen Ausgabebehälter zu legen. + + + + Wenn ein Trichter allerdings mit Redstone betrieben wird, wird er inaktiv und hört auf, Gegenstände aufzusaugen und einzufügen. + + + + Ein Trichter zeigt in die Ausgaberichtung für Gegenstände. Damit ein Trichter auf einen bestimmten Block zeigt, platzierst du ihn dagegen, während du schleichst. + + + + Es gibt viele nützliche Anwendungsmöglichkeiten für Trichter. In diesem Raum kannst du sie dir ansehen und ausprobieren. + + + + Dies ist das Feuerwerkmenü. Hier kannst du Feuerwerk und Feuerwerkssterne craften. + + + + {*B*}Drücke zum Fortfahren {*CONTROLLER_VK_A*}. + {*B*}Drücke {*CONTROLLER_VK_B*}, wenn du bereits weißt, wie das Signalfeuermenü verwendet wird. + + + + Leg Schießpulver und Papier in das 3x3-Crafting-Raster, das über deinem Inventar angezeigt wird, um Feuerwerk zu craften. + + + + Du kannst wahlweise mehrere Feuerwerkssterne in das Raster legen, um sie dem Feuerwerk hinzuzufügen. + + + + Mehr Schießpulver im Raster erhöht die Höhe, in der Feuerwerkssterne explodieren. + + + + Du kannst das fertige Feuerwerk dann aus dem Ausgabeplatz nehmen. + + + + Feuerwerkssterne werden hergestellt, indem du Schießpulver und Farbe in das Raster legst. + + + + Die Explosion des Feuerwerkssterns nimmt die jeweilige Farbe an. + + + + Die Form des Feuerwerkssterns ändert sich durch das Hinzufügen von Feuerkugeln, Goldklumpen, Federn oder NPC-Köpfen. + + + + Spur oder Funkeln können mit Diamanten oder Glowstone-Staub hinzugefügt werden. + + + + Wenn ein Feuerwerksstern gecraftet wurde, kannst du das Verblassen mit Farbe ändern. + + + + In diesen Truhen befinden sich verschiedene Gegenstände, die bei der Herstellung von FEUERWERK verwendet werden! + + + + {*B*}Drück{*CONTROLLER_VK_A*}, um mehr über Feuerwerk zu erfahren. + {*B*}Drück{*CONTROLLER_VK_B*}, wenn du bereits alles über Feuerwerk weißt. + + + + Feuerwerk sind dekorative Gegenstände, die manuell oder von Dispensern gestartet werden können. Sie werden aus Papier, Schießpulver und wahlweise einigen Feuerwerkssternen gecraftet. + + + + Farben, Verblassen, Form, Größe und Effekte (wie Spuren und Funkeln) von Feuerwerkssternen können beim Craften durch zusätzliche Zutaten angepasst werden. + + + + Probiere, Feuerwerk mit verschiedenen Zutaten aus den Truhen an der Werkbank herzustellen. + +  Auswählen Verwenden @@ -2678,7 +3231,7 @@ Im Flugmodus halte{*CONTROLLER_ACTION_JUMP*} nach unten gedrückt, um dich nach Schnellauswahl leeren -? +Was ist das? Auf Facebook teilen @@ -2840,6 +3393,22 @@ Im Flugmodus halte{*CONTROLLER_ACTION_JUMP*} nach unten gedrückt, um dich nach Spielstand für Xbox One hochladen +Aufsteigen + +Absteigen + +Truhe befestigen + +Starten + +Festbinden + +Losbinden + +Befestigen + +Name + OK Abbrechen @@ -3150,6 +3719,20 @@ Möchtest du das vollständige Spiel freischalten? Dispenser +Pferd + +Auswurfblock + +Trichter + +Signalfeuer + +Hauptkraft + +Zweitkraft + +Lore + Es stehen derzeit keine entsprechenden Inhalte zum Herunterladen für diesen Titel zur Verfügung. %s ist dem Spiel beigetreten. @@ -3309,10 +3892,14 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Spielmodus: Kreativ +Spielmodus: Abenteuer + Überleben Kreativ +Abenteuer + Im Überlebensmodus Im Kreativmodus @@ -3333,6 +3920,8 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Superflach +Gib einen Seed ein, um das gleiche Gelände erneut zu erstellen. Lass das Feld leer, um eine zufällige Welt zu erstellen. + Wenn dies aktiviert ist, ist das Spiel online. Wenn dies aktiviert ist, können nur eingeladene Spieler beitreten. @@ -3349,7 +3938,7 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Aktiviert, dass der Host das Fliegen nutzen, Erschöpfung deaktivieren und sich selbst im Spielmenü unsichtbar machen kann. Deaktiviert Erfolge und Bestenlisten-Aktualisierungen. -Sorgt bei Aktivierung dafür, dass der Nether neu erstellt wird. Dies ist nützlich, wenn du einen alten Spielstand hast, der keine Netherfestungen enthält. +Bei Aktivierung wird der Nether neu erstellt. Nützlich bei alten Spielständen, die keine Netherfestungen enthalten. Aktiviert, dass Strukturen wie Dörfer und Festungen in der Welt erstellt werden. @@ -3357,6 +3946,20 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Aktiviert, dass eine Truhe mit nützlichen Gegenständen in der Nähe des Startpunkts des Spielers erstellt wird. +Bei Deaktivierung können Monster und Tiere keine Blöcke verändern (z. B. werden bei Creeper-Explosionen keine Blöcke zerstört und Schafe entfernen kein Gras) oder Gegenstände aufheben. + +Bei Aktivierung behalten Spieler ihr Inventar, wenn sie sterben. + +Bei Deaktivierung erscheinen keine NPCs auf natürlichem Weg. + +Bei Deaktivierung lassen Monster und Tiere keine Beute fallen (z. B. lassen Creeper kein Schießpulver fallen). + +Bei Deaktivierung lassen Blöcke keine Gegenstände zurück, wenn sie zerstört werden (z. B. hinterlassen Steinblöcke keine Pflastersteine). + +Bei Deaktivierung wird die Gesundheit von Spielern nicht auf natürlichem Weg wiederhergestellt. + +Bei Deaktivierung ändert sich die Tageszeit nicht. + Skinpakete Themen @@ -3405,7 +4008,49 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? {*PLAYER*} wurde von {*SOURCE*} erschlagen. -{*PLAYER*} wurde durch {*SOURCE*} getötet. +{*PLAYER*} wurde durch {*SOURCE*} mit Magie getötet. + +{*PLAYER*} ist von einer Leiter gefallen. + +{*PLAYER*} ist von Ranken heruntergefallen. + +{*PLAYER*} ist aus dem Wasser gefallen. + +{*PLAYER*} ist aus großer Höhe heruntergefallen. + +{*PLAYER*} wurde von {*SOURCE*} zum Absturz verdammt. + +{*PLAYER*} wurde von {*SOURCE*} zum Absturz verdammt. + +{*PLAYER*} wurde von {*SOURCE*} mit {*ITEM*} zum Absturz verdammt. + +{*PLAYER*} ist zu tief gefallen und wurde von {*SOURCE*} erledigt. + +{*PLAYER*} ist zu tief gefallen und wurde von {*SOURCE*} mit {*ITEM*} erledigt. + +{*PLAYER*} ist im Kampf gegen {*SOURCE*} ins Feuer gegangen. + +{*PLAYER*} wurde im Kampf gegen {*SOURCE*} eingeäschert. + +{*PLAYER*} hat versucht, in Lava zu schwimmen, um {*SOURCE*} zu entkommen. + +{*PLAYER*} ist beim Versuch ertrunken, {*SOURCE*} zu entkommen. + +{*PLAYER*} ist beim Versuch, {*SOURCE*} zu entkommen, in einen Kaktus gelaufen. + +{*PLAYER*} wurde von {*SOURCE*} in die Luft gejagt. + +{*PLAYER*} ist verdorrt. + +{*PLAYER*} wurde durch {*SOURCE*} mit {*ITEM*} getötet. + +{*PLAYER*} wurde von {*SOURCE*} mit {*ITEM*} erschossen. + +{*PLAYER*} starb durch einen Feuerball von {*SOURCE*} mit {*ITEM*}. + +{*PLAYER*} wurde von {*SOURCE*} mit {*ITEM*} erschlagen. + +{*PLAYER*} wurde durch {*SOURCE*} mit {*ITEM*} getötet. Grundgesteinnebel @@ -3570,9 +4215,9 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Nether nicht zurücksetzen -Pilzkuh kann momentan nicht geschoren werden. Die Höchstanzahl von Schweinen, Schafen, Kühen und Katzen wurde erreicht. +Pilzkuh kann momentan nicht geschoren werden. Die Höchstanzahl von Schweinen, Schafen, Kühen, Katzen und Pferden wurde erreicht. -Eintrittsei kann momentan nicht verwendet werden. Die Höchstanzahl von Schweinen, Schafen, Kühen und Katzen wurde erreicht. +Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Schweinen, Schafen, Kühen, Katzen und Pferden wurde erreicht. Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Pilzkühen wurde erreicht. @@ -3582,6 +4227,8 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Tintenfischen in einer Welt wurde erreicht. +Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Fledermäusen in einer Welt wurde erreicht. + Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Feinden in einer Welt wurde erreicht. Kann momentan kein Eintrittsei verwenden. Die Höchstanzahl von Dorfbewohnern in einer Welt wurde erreicht. @@ -3590,12 +4237,14 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Im friedlichen Modus kannst du keine Feinde erscheinen lassen. -Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Schweine, Schafe, Kühe und Katzen wurde erreicht. +Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Schweine, Schafe, Kühen, Katzen und Pferden wurde erreicht. Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Wölfe wurde erreicht. Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Hühner wurde erreicht. +Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Pferde wurde erreicht. + Tier kann nicht in den Liebesmodus versetzt werden. Die Zuchtobergrenze für Pilzkühe wurde erreicht. Die Höchstanzahl von Booten in einer Welt wurde erreicht. @@ -3623,27 +4272,43 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Mitwirkende Inhalte neu installieren - + Debug-Einstellungen - + Feuer breitet sich aus - + TNT explodiert - + Spieler gegen Spieler - + Spielern vertrauen - + Hostprivilegien - + Strukturen erzeugen - + Superflache Welt - + Bonustruhe - + Weltoptionen - + +Spieloptionen + +NPC-Griefing + +Inventar behalten + +NPC-Eintritt + +NPC-Beute + +Felderertrag + +Natürliche Erholung + +Tageslichtzyklus + Kann bauen und abbauen Kann Türen und Schalter verwenden @@ -3830,6 +4495,14 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Gift +Dürre + +Gesundheitsbonus + +Absorption + +Sättigung + der Geschwindigkeit der Langsamkeit @@ -3868,6 +4541,14 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? des Gifts +des Verfalls + +des Gesundheitsbonus + +der Absorption + +der Sättigung + II @@ -3964,6 +4645,22 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Verringert mit der Zeit die Gesundheit von betroffenen Spielern, Tieren und Monstern. +Bei Anwendung: + +Pferdesprungstärke + +Zombie-Verstärkungen + +Max. Gesundheit + +NPC-Folgereichweite + +Rückstoßwiderstand + +Geschwindigkeit + +Angriffsschaden + Schärfe Bann @@ -4054,7 +4751,7 @@ Möchtest du das Mash-up-Paket oder Texturpaket jetzt installieren? Regeneriert 3{*ICON_SHANK_01*}. Entsteht, wenn man eine Kartoffel im Ofen brät. -Regeneriert 1{*ICON_SHANK_01*}, doch du kannst dich damit vergiften. Kann in einem Ofen gebraten oder auf Ackerland gepflanzt werden. +Regeneriert 1{*ICON_SHANK_01*}, doch du kannst dich damit vergiften. Regeneriert 3{*ICON_SHANK_01*}. Wird aus einer Karotte und Goldnuggets hergestellt. @@ -4452,7 +5149,7 @@ Alle Endertruhen in einer Welt sind verknüpft, sodass Gegenstände, die in eine Xbox 360 -Back +BACK Diese Option deaktiviert für diese Welt Erfolge und Bestenlisten-Aktualisierungen während des Spielens und wenn nach dem Speichern mit aktivierter Option erneut geladen wird. diff --git a/Minecraft.Client/Common/Media/es-ES/4J_strings.resx b/Minecraft.Client/Common/Media/es-ES/4J_strings.resx index ea428db6..4882271b 100644 --- a/Minecraft.Client/Common/Media/es-ES/4J_strings.resx +++ b/Minecraft.Client/Common/Media/es-ES/4J_strings.resx @@ -73,11 +73,11 @@ Perfil de jugador no en línea -Este juego ofrece características que requieren un perfil de jugador habilitado para Xbox Live, pero en estos momentos estás desconectado. +Este juego ofrece características que requieren un perfil de jugador habilitado para Xbox LIVE, pero en estos momentos estás desconectado. -Esta característica requiere un perfil de jugador con sesión iniciada en Xbox Live. +Esta característica requiere un perfil de jugador con sesión iniciada en Xbox LIVE. -Conectarse a Xbox Live +Conectarse a Xbox LIVE Seguir jugando sin conexión @@ -100,7 +100,7 @@ Desbloquear juego completo Esta es la versión de prueba de Minecraft. Si tuvieras el juego completo, ¡habrías conseguido un logro! -Desbloquea el juego completo para vivir toda la emoción de Minecraft y jugar con amigos de todo el mundo a través de Xbox Live. +Desbloquea el juego completo para vivir toda la emoción de Minecraft y jugar con amigos de todo el mundo a través de Xbox LIVE. ¿Te gustaría desbloquear el juego completo? Volverás al menú principal porque se ha producido un error al leer tu perfil. diff --git a/Minecraft.Client/Common/Media/es-ES/strings.resx b/Minecraft.Client/Common/Media/es-ES/strings.resx index 6fbeff35..1e07927c 100644 --- a/Minecraft.Client/Common/Media/es-ES/strings.resx +++ b/Minecraft.Client/Common/Media/es-ES/strings.resx @@ -11,7 +11,7 @@ Si estableces la dificultad del juego en Pacífico, tu salud se regenerará automáticamente. ¡Además, no saldrán monstruos por la noche! -Dale un hueso a un lobo para domesticarlo. Puedes hacer que se siente o que te siga. +Dale un hueso a un lobo para domarlo. Puedes hacer que se siente o que te siga. Para soltar objetos desde el menú de inventario, mueve el cursor fuera del menú y pulsa{*CONTROLLER_VK_A*}. @@ -87,7 +87,7 @@ Si colocas dos cofres juntos crearás un cofre grande. -Los lobos domesticados indican su salud con la posición de su cola. Dales de comer para curarlos. +Los lobos domados indican su salud con la posición de su cola. Dales de comer para curarlos. Cocina un cactus en un horno para obtener tinte verde. @@ -216,7 +216,7 @@ Los ingredientes originales de las pociones son :{*B*}{*B*} * {*T2*}Verruga del mundo inferior{*ETW*}{*B*} * {*T2*}Ojo de araña{*ETW*}{*B*} * {*T2*}Azúcar{*ETW*}{*B*} -* {*T2*}Lágrima de espectro{*ETW*}{*B*} +* {*T2*}Lágrima de Ghast{*ETW*}{*B*} * {*T2*}Polvo de llama{*ETW*}{*B*} * {*T2*}Crema de magma{*ETW*}{*B*} * {*T2*}Melón resplandeciente{*ETW*}{*B*} @@ -229,7 +229,7 @@ Tendrás que experimentar y combinar ingredientes para averiguar cuántas pocion {*T3*}CÓMO SE JUEGA: HECHIZOS{*ETW*}{*B*}{*B*} Los puntos de experiencia que se recogen cuando muere un enemigo, o cuando se extraen o se funden determinados bloques en un horno, se pueden usar para hechizar herramientas, armas, armaduras y libros.{*B*} -Cuando la espada, el arco, el hacha, el pico, la pala, la armadura o el libro se colocan en el espacio que está debajo del libro en la mesa de hechizos, los tres botones de la parte derecha del espacio mostrarán algunos hechizos y sus niveles de experiencia correspondientes.{*B*} +Cuando la espada, el arco, el hacha, el pico, la pala, la armadura o el libro se colocan en el espacio que está debajo del libro en la mesa de hechizos, los tres botones de la parte derecha del espacio mostrarán algunos hechizos y sus niveles de experiencia correspondientes.{*B*} Si no tienes suficientes niveles de experiencia para usarlos, el coste aparecerá en rojo; si no, aparecerá en verde.{*B*}{*B*} El hechizo real que se aplica se selecciona aleatoriamente en función del coste que aparece.{*B*}{*B*} Si la mesa de hechizos está rodeada de estanterías (hasta un máximo de 15), con un espacio de un bloque entre la estantería y la mesa de hechizos, la intensidad de los hechizos aumentará y aparecerán glifos arcanos en el libro de la mesa de hechizos.{*B*}{*B*} @@ -286,19 +286,40 @@ En modo de vuelo, puedes mantener pulsado{*CONTROLLER_ACTION_JUMP*} para subir y Al cargar o crear un mundo, pulsa el botón "Más opciones" para entrar en un menú donde podrás tener más control sobre tu juego.{*B*}{*B*} {*T2*}Jugador contra jugador{*ETW*}{*B*} - Si está habilitada, los jugadores pueden causar daño a otros jugadores. Esta opción solo afecta al modo Supervivencia.{*B*}{*B*} + Si está habilitado, los jugadores pueden causar daño a otros jugadores. Esta opción solo afecta al modo Supervivencia.{*B*}{*B*} {*T2*}Confiar en jugadores{*ETW*}{*B*} - Si está deshabilitada, los jugadores que se unen al juego tienen restringidas sus acciones. No pueden extraer ni usar objetos, colocar bloques, usar puertas ni interruptores, usar contenedores, atacar a jugadores o atacar a animales. Las opciones de un jugador determinado se pueden cambiar en el menú de juego.{*B*}{*B*} + Si está deshabilitado, los jugadores que se unen al juego tienen restringidas sus acciones. No pueden extraer ni usar objetos, colocar bloques, usar puertas ni interruptores, usar contenedores, atacar a jugadores o atacar a animales. Las opciones de un jugador determinado se pueden cambiar en el menú de juego.{*B*}{*B*} {*T2*}El fuego se propaga{*ETW*}{*B*} - Si está habilitada, el fuego se puede propagar a los bloques inflamables cercanos. Esta opción también se puede cambiar dentro del juego.{*B*}{*B*} + Si está habilitado, el fuego se puede propagar a los bloques inflamables cercanos. Esta opción también se puede cambiar dentro del juego.{*B*}{*B*} {*T2*}La dinamita explota{*ETW*}{*B*} - Si está habilitada, la dinamita explota cuando se detona. Esta opción también se puede cambiar dentro del juego.{*B*}{*B*} + Si está habilitado, la dinamita explota cuando se denota. Esta opción también se puede cambiar dentro del juego.{*B*}{*B*} {*T2*}Privilegios de host{*ETW*}{*B*} - Si está habilitada, el host puede activar su habilidad para volar, deshabilitar la extenuación y hacerse invisible desde el menú de juego. Esta opción deshabilita los logros y las actualizaciones del marcador de este mundo cuando se juega y si se vuelve a cargar después de guardarlo con esta opción activada.{*B*}{*B*} + Si está habilitado, el host puede activar su habilidad para volar, deshabilitar la extenuación y hacerse invisible desde el menú de juego. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + + {*T2*}Ciclo de luz diurna{*ETW*}{*B*} + Al desactivarse, la hora del día no cambiará.{*B*}{*B*} + + {*T2*}Mantener inventario{*ETW*}{*B*} + Al activarse, los jugadores mantendrán el inventario al morir.{*B*}{*B*} + + {*T2*}Generación de enemigos{*ETW*}{*B*} + Al desactivarse, los enemigos no se generarán de forma natural.{*B*}{*B*} + + {*T2*}Vandalismo de enemigos{*ETW*}{*B*} + Cuando se desactiva, impide que monstruos y animales cambien bloques (por ejemplo, las explosiones de Creepers no destruirán bloques y las ovejas no quitarán el césped) o recojan objetos.{*B*}{*B*} + + {*T2*}Botín de enemigos{*ETW*}{*B*} + Al desactivarse, los monstruos y animales no soltarán botín (por ejemplo, los Creepers no soltarán pólvora).{*B*}{*B*} + + {*T2*}Soltar casillas{*ETW*}{*B*} + Al desactivarse, los bloques no soltarán objetos cuando se destruyan (por ejemplo, los bloques de piedra no soltarán guijarros).{*B*}{*B*} + + {*T2*}Regeneración natural{*ETW*}{*B*} + Al desactivarse, los jugadores no regenerarán salud de forma natural.{*B*}{*B*} {*T1*}Opciones de generación del mundo{*ETW*}{*B*} Cuando se crea un mundo existen opciones adicionales.{*B*}{*B*} @@ -313,10 +334,10 @@ Cuando se crea un mundo existen opciones adicionales.{*B*}{*B*} Si está habilitada, se creará un cofre con objetos útiles cerca del punto de generación del jugador.{*B*}{*B*} {*T2*}Restablecer mundo inferior{*ETW*}{*B*} - Si está habilitada, el mundo inferior se regenará. Esta opción te será útil si tienes una partida guardada en la que no aparecían fortalezas del mundo inferior.{*B*}{*B*} + Si está habilitado, el mundo inferior se regenerará. Esta opción te será útil si tienes una partida guardada en la que no aparecían fortalezas del mundo inferior.{*B*}{*B*} {*T1*}Opciones del juego{*ETW*}{*B*} - Dentro del juego se pueden acceder a varias opciones pulsando BACK para mostrar el menú del juego.{*B*}{*B*} + Dentro del juego se pueden acceder a varias opciones pulsando {*BACK_BUTTON*} para mostrar el menú del juego.{*B*}{*B*} {*T2*}Opciones de host{*ETW*}{*B*} El host y cualquier jugador establecido como moderador pueden acceder al menú "Opciones de host". En este menú se puede habilitar y deshabilitar la propagación del fuego y la explosión de dinamita.{*B*}{*B*} @@ -325,42 +346,44 @@ Cuando se crea un mundo existen opciones adicionales.{*B*}{*B*} Para modificar los privilegios de un jugador, selecciona su nombre y pulsa{*CONTROLLER_VK_A*} para mostrar el menú de privilegios donde podrás usar las siguientes opciones.{*B*}{*B*} {*T2*}Puede construir y extraer{*ETW*}{*B*} - Esta opción solo está disponible cuando "Confiar en jugadores" está desactivada. Cuando esta opción está habilitada, el jugador puede interaccionar con el mundo de forma normal. Cuando está deshabilitada el jugador no puede colocar ni destruir bloques ni interaccionar con muchos objetos y bloques.{*B*}{*B*} + Esta opción solo está disponible cuando "Confiar en jugadores" está desactivado. Cuando esta opción está habilitada, el jugador puede interaccionar con el mundo de forma normal. Cuando está deshabilitado el jugador no puede colocar ni destruir bloques ni interaccionar con muchos objetos y bloques.{*B*}{*B*} {*T2*}Puede usar puertas e interruptores{*ETW*}{*B*} - Esta opción solo está disponible cuando "Confiar en jugadores" está desactivada. Cuando esta opción está deshabilitada, el jugador no puede usar puertas e interruptores.{*B*}{*B*} + Esta opción solo está disponible cuando "Confiar en jugadores" está desactivado. Cuando esta opción está deshabilitada, el jugador no puede usar puertas e interruptores.{*B*}{*B*} {*T2*}Puede abrir contenedores{*ETW*}{*B*} - Esta opción solo está disponible cuando "Confiar en jugadores" está desactivada. Cuando esta opción está deshabilitada, el jugador no puede abrir contenedores, como por ejemplo cofres.{*B*}{*B*} + Esta opción solo está disponible cuando "Confiar en jugadores" está desactivado. Cuando esta opción está deshabilitada, el jugador no puede abrir contenedores, como por ejemplo cofres.{*B*}{*B*} {*T2*}Puede atacar a jugadores{*ETW*}{*B*} - Esta opción solo está disponible cuando "Confiar en jugadores" está desactivada. Cuando esta opción está deshabilitada, el jugador no puede causar daños a otros jugadores.{*B*}{*B*} + Esta opción solo está disponible cuando "Confiar en jugadores" está desactivado. Cuando esta opción está deshabilitada, el jugador no puede causar daños a otros jugadores.{*B*}{*B*} {*T2*}Puede atacar a animales{*ETW*}{*B*} - Esta opción solo está disponible cuando "Confiar en jugadores" está desactivada. Cuando esta opción está deshabilitada, el jugador no puede causar daños a los animales.{*B*}{*B*} + Esta opción solo está disponible cuando "Confiar en jugadores" está desactivado. Cuando esta opción está deshabilitada, el jugador no puede causar daños a los animales.{*B*}{*B*} {*T2*}Moderador{*ETW*}{*B*} Cuando esta opción está habilitada, el jugador puede cambiar los privilegios de otros jugadores (excepto los del host) si "Confiar en jugadores" está desactivada, expulsar jugadores, y activar y desactivar "El fuego se propaga" y "La dinamita explota".{*B*}{*B*} {*T2*}Expulsar jugador{*ETW*}{*B*} - En el caso de jugadores que no estén en la misma Consola Xbox 360 que el host, si se selecciona esta opción se expulsará al jugador de la partida y a cualquier otro jugador en la misma Consola Xbox 360. El jugador no podrá volver a unirse al juego hasta que se reinicie.{*B*}{*B*} + {*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} {*T1*}Opciones de host{*ETW*}{*B*} Si "Privilegios de host" está habilitado, el host podrá modificar algunos privilegios para sí mismo. Para modificar los privilegios de un jugador, selecciona su nombre y pulsa{*CONTROLLER_VK_A*} para mostrar el menú de privilegios donde podrás usar las siguientes opciones.{*B*}{*B*} {*T2*}Puede volar{*ETW*}{*B*} Cuando esta opción está habilitada, el jugador puede volar. Esta opción solo es relevante en el modo Supervivencia, ya que el vuelo está habilitado para todos los jugadores en el modo Creativo.{*B*}{*B*} - - {*T2*}Desactivar extenuación{*ETW*}{*B*} + + {*T2*}Desactiva la extenuación{*ETW*}{*B*} Esta opción solo afecta al modo Supervivencia. Si se habilita, las actividades físicas (caminar/correr/saltar, etc.) no disminuyen la barra de comida. Sin embargo, si el jugador resulta herido, la barra de comida disminuye lentamente mientras el jugador se cura.{*B*}{*B*} - + {*T2*}Invisible{*ETW*}{*B*} Cuando esta opción está habilitada, el jugador es invisible para otros jugadores y es invulnerable.{*B*}{*B*} - - {*T2*}Puede teletransportarse{*ETW*}{*B*} + + {*T2*}Puede teletransportarse{*ETW*}{*B*} Permite al jugador desplazarse o desplazar a otros hasta la posición de otros jugadores en el mundo. +En el caso de jugadores que no estén en la misma {*PLATFORM_NAME*} que el host, si se selecciona esta opción se expulsará al jugador de la partida y a cualquier otro jugador en la misma {*PLATFORM_NAME*}. El jugador no podrá volver a unirse al juego hasta que se reinicie. + Página siguiente Página anterior @@ -424,62 +447,94 @@ para que puedan unirse a ti con facilidad. Novedades - -{*T3*}Cambios e incorporaciones{*ETW*}{*B*}{*B*} -- Se han añadido nuevos objetos: esmeralda, mena de esmeralda, bloque de esmeralda, cofre de Ender, gancho de cable trampa, manzana dorada hechizada, yunque, maceta, paredes de adoquines, paredes de adoquines musgosas, pintura de Wither, patata, patata asada, patata venenosa, zanahoria, zanahoria dorada, palo y zanahoria, -pastel de calabaza, poción de visión nocturna, poción de invisibilidad, cuarzo del mundo inferior, mena de cuarzo del mundo inferior, bloque de cuarzo, losa de cuarzo, escaleras de cuarzo, bloque de cuarzo cincelado, pilar de cuarzo, libro hechizado, alfombra.{*B*} -- Se han añadido nuevas recetas de arenisca lisa y arenisca cincelada.{*B*} -- Se han añadido nuevos enemigos: aldeanos zombis.{*B*} -- Se han añadido nuevas funciones de generación de terrenos: templos del desierto, aldeas del desierto, templos de la jungla.{*B*} -- Se ha añadido la función de comerciar con los aldeanos.{*B*} -- Se ha añadido la interfaz del yunque.{*B*} -- Se ha añadido la posibilidad de teñir las armaduras de cuero.{*B*} -- Se ha añadido la posibilidad de teñir los collares de los lobos.{*B*} -- Se puede montar sobre un cerdo y controlarlo con un palo y una zanahoria.{*B*} -- Actualización del contenido de los cofres de bonificación con más objetos.{*B*} -- Se ha modificado la colocación de medios bloques y otros bloques en medios bloques.{*B*} -- Se ha modificado la colocación de las escaleras y las losas del revés.{*B*} -- Se han añadido diferentes profesiones de aldeanos.{*B*} -- Los aldeanos generados a partir de un huevo generador desempeñarán profesiones al azar.{*B*} -- Se ha añadido la posibilidad de colocar troncos de lado.{*B*} -- Los hornos pueden usar herramientas de madera como combustible.{*B*} -- Los paneles de hielo y cristal se pueden recoger mediante herramientas hechizadas con el toque sedoso.{*B*} -- Los botones de madera y los platos de presión de madera se pueden activar mediante flechas.{*B*} -- Los enemigos del mundo inferior pueden acceder al mundo superior mediante portales.{*B*} -- Los Creepers y las arañas son agresivos con el último jugador que los toque.{*B*} -- Los enemigos en el modo Creativo vuelven a ser neutrales tras un breve periodo de tiempo.{*B*} -- Se ha eliminado el derribo durante el ahogamiento.{*B*} -- Las puertas muestran daños cuando los zombis las rompen.{*B*} -- El hielo se derrite en el mundo inferior.{*B*} -- Los calderos se llenan cuando están bajo la lluvia.{*B*} -- Los pistones tardan el doble en actualizarse.{*B*} -- Los cerdos dejan caer la silla de montar al morir (si llevan una).{*B*} -- Se ha modificado el color del cielo en El Fin.{*B*} -- Se puede colocar una cuerda (para los cables trampa).{*B*} -- La lluvia cae entre las hojas.{*B*} -- Se pueden colocar palancas en la parte inferior de los bloques.{*B*} -- La dinamita provoca daños variables en función del nivel de dificultad.{*B*} -- Se han modificado las recetas de libros.{*B*} -- Los barcos rompen los nenúfares y no al contrario.{*B*} -- Los cerdos dejan caer más chuletas.{*B*} -- La generación de limos es menor en los mundos superplanos.{*B*} -- Los Creepers causan daños variables en función del nivel de dificultad; más derribo.{*B*} -- Se ha corregido el error que hacía que los Finalizadores no abrieran sus mandíbulas.{*B*} -- Se ha añadido el teletransporte de jugadores (usando el menú {*BACK_BUTTON*} del juego).{*B*} -- Se han añadido nuevas opciones de host que permiten a los jugadores remotos volar, volverse invisibles e invulnerables.{*B*} -- Se han añadido nuevos tutoriales al mundo tutorial sobre nuevos objetos y funciones.{*B*} -- Se han actualizado las posiciones de los cofres de discos en el mundo tutorial.{*B*} +{*T3*}Cambios e incorporaciones{*ETW*}{*B*}{*B*} +- Nuevos objetos añadidos: arcilla endurecida, arcilla tintada, bloque de hulla, fardo de heno, raíl activador, bloque de piedra rojiza, sensor de luz diurna, soltador, embudo, vagoneta con embudo, vagoneta con dinamita, comparador de piedra rojiza, plato de presión por peso, faro, cofre trampa, cohete de fuegos artificiales, estrella de fuegos artificiales, estrella del mundo inferior, rienda, armadura para caballo, etiqueta de nombre y huevo generador de caballos.{*B*} +- Nuevos enemigos añadidos: Wither, esqueletos atrofiados, brujas, murciélagos, caballos, burros y mulas.{*B*} +- Nuevas funciones de generación de terrenos: chozas de bruja.{*B*} +- Nueva interfaz de faro.{*B*} +- Nueva interfaz de caballo.{*B*} +- Nueva interfaz de embudo.{*B*} +- Nueva interfaz de fuegos artificiales: podrás acceder a ella desde la mesa de creación cuando tengas los ingredientes necesarios para fabricar una estrella de fuegos artificiales o un cohete de fuegos artificiales.{*B*} +- Nuevo modo Aventura: en él solo podrás romper bloques con las herramientas correctas.{*B*} +- Nuevos efectos de sonido.{*B*} +- Los enemigos, los objetos y los proyectiles podrán pasar ahora a través de portales.{*B*} +- Ahora los repetidores se pueden bloquear proporcionándoles energía con otros repetidores.{*B*} +- Los zombis y esqueletos pueden generarse con diferentes armas y armaduras.{*B*} +- Nuevos mensajes de muerte.{*B*} +- Ponles nombre a tus enemigos con una etiqueta y cámbiales el nombre a los contenedores para que aparezca en el título del menú.{*B*} +- Ahora la carne de hueso no hará crecer todo a su máximo tamaño, sino que lo hará por fases.{*B*} +- La señal de piedra rojiza que describe el contenido de los cofres, puestos de destilado, dispensadores y tocadiscos se puede detectar con un comparador de piedra rojiza.{*B*} +- Los dispensadores se pueden orientar en cualquier dirección.{*B*} +- Comerse una manzana dorada le da al jugador salud de "absorción" extra durante un corto periodo de tiempo.{*B*} +- Cuanto más tiempo permanezcas en una zona, más fuertes serán los monstruos que se generen en dicha zona.{*B*} {*ETB*}¡Hola otra vez! Quizá no te hayas dado cuenta, pero hemos actualizado Minecraft.{*B*}{*B*} -Hay un montón de novedades con las que lo pasarás en grande con tus amigos. A continuación te detallamos las más destacadas:{*B*}{*B*} -{*T1*}Nuevos objetos{*ETB*}: esmeralda, mena de esmeralda, bloque de esmeralda, cofre de Ender, gancho de cable trampa, manzana dorada hechizada, yunque, maceta, paredes de adoquines, paredes de adoquines musgosas, pintura de Wither, patata, patata asada, patata venenosa, zanahoria, zanahoria dorada, palo y zanahoria, -Pastel de calabaza, poción de visión nocturna, poción de invisibilidad, cuarzo del mundo inferior, mena de cuarzo del mundo inferior, bloque de cuarzo, losa de cuarzo, escaleras de cuarzo, bloque de cuarzo cincelado, pilar de cuarzo,, libro hechizado, alfombra.{*B*}{*B*} - {*T1*}Nuevos enemigos{*ETB*}: aldeanos zombis.{*B*}{*B*} -{*T1*}Nuevas funciones{*ETB*}: ¡comercia con los aldeanos, repara o hechiza armas y herramientas con el yunque, guarda objetos en un cofre de Ender o controla a un cerdo mientras montas sobre él usando un palo y una zanahoria!{*B*}{*B*} -{*T1*}Nuevos minitutoriales{*ETB*} – ¡Aprende a utilizar las nuevas funciones con el mundo tutorial!{*B*}{*B*} -{*T1*}Nuevos "huevos de Pascua"{*ETB*} – Hemos cambiado de sitio todos los discos secretos del mundo tutorial. ¡Intenta encontrarlos de nuevo!{*B*}{*B*} - +Hay un montón de novedades con las que lo pasarás en grande con tus amigos. A continuación te detallamos las más destacadas:{*B*}{*B*} +{*T1*}Nuevos objetos{*ETB*}: arcilla endurecida, arcilla tintada, bloque de hulla, fardo de heno, raíl activador, bloque de piedra rojiza, sensor de luz diurna, soltador, embudo, vagoneta con embudo, vagoneta con dinamita, comparador de piedra rojiza, plato de presión por peso, faro, cofre trampa, cohete de fuegos artificiales, estrella de fuegos artificiales, estrella del mundo inferior, rienda, armadura para caballo, etiqueta de nombre y huevo generador de caballos.{*B*}{*B*} +{*T1*}Nuevos enemigos{*ETB*}: Wither, esqueletos atrofiados, brujas, murciélagos, caballos, burros y mulas.{*B*}{*B*} +{*T1*}Nuevas funciones{*ETB*}: doma caballos y móntalos, fabrica fuegos artificiales y lánzalos, ponle nombre a los animales y a los monstruos con etiquetas, crea circuitos de piedra rojiza más avanzados y, además, descubre las nuevas opciones de host que te ayudarán a controlar lo que tus invitados pueden hacer en tu mundo.{*B*}{*B*} +{*T1*}Nuevos mundo tutorial{*ETB*} – ¡Aprende a utilizar las antiguas y las nuevas funciones con el mundo tutorial! ¡A ver si puedes encontrar todos los discos secretos ocultos en el mundo!{*B*}{*B*} + + +Caballos + +{*T3*}CÓMO SE JUEGA: CABALLOS{*ETW*}{*B*}{*B*} +Los caballos y los burros se suelen encontrar en las llanuras abiertas. Las mulas son las crías de un burro y un caballo, pero no son fértiles.{*B*} +Todos los caballos, burros y mulas adultos se pueden montar. Sin embargo, solo los caballos pueden llevar armadura, y solo las mulas y los burros pueden equiparse con alforjas para llevar objetos.{*B*}{*B*} +Los caballos, burros y mulas deben domarse antes de poder usarse. Un caballo se doma intentando montarlo y logrando mantenerse sobre él mientras trata de tirarte.{*B*} +Cuando estén domados, aparecerán corazones de amor a su alrededor y ya no intentarán tirarte. Para dirigir un caballo, debes equiparlo con una silla de montar.{*B*}{*B*} +Puedes comprar sillas de montar a los aldeanos o encontrarlas en cofres ocultos por el mundo.{*B*} +Puedes poner alforjas a los burros y mulas domados; solo tienes que colocarles un cofre. Puedes acceder a estas alforjas mientras montas o acechas.{*B*}{*B*} +Los caballos y los burros (pero no las mulas) pueden cruzarse como los demás animales utilizando manzanas doradas o zanahorias doradas.{*B*} +Los potros se convertirán en caballos adultos con el tiempo, aunque alimentarlos con trigo o heno acelerará el proceso.{*B*} + + +Faros + +{*T3*}CÓMO SE JUEGA: FAROS{*ETW*}{*B*}{*B*} +Los faros activos proyectan un rayo de luz brillante hacia el cielo y otorgan poderes a los jugadores cercanos.{*B*} +Se crean con cristal, obsidiana y estrellas del mundo inferior, que se pueden obtener derrotando al Wither.{*B*}{*B*} +Los faros deben situarse de modo que queden al sol durante el día. Los faros deben colocarse en pirámides de hierro, oro, esmeralda o diamante.{*B*} +El material sobre el que se sitúe el faro no tiene ningún efecto sobre el poder del mismo.{*B*}{*B*} +En el menú de faro puedes elegir un poder principal para este. Podrás elegir entre más poderes cuantas más plantas tenga la pirámide.{*B*} +Un faro sobre una pirámide de al menos cuatro plantas también ofrece la posibilidad de o bien tener el poder secundario Regeneración, o bien tener un poder principal más fuerte.{*B*}{*B*} +Para establecer los poderes del faro, debes sacrificar un lingote de esmeralda, diamante, oro o hierro en el espacio de pago.{*B*} +Una vez establecidos, los poderes emanarán del faro indefinidamente.{*B*} + + +Fuegos artificiales + +{*T3*}CÓMO SE JUEGA: FUEGOS ARTIFICIALES{*ETW*}{*B*}{*B*} +Los fuegos artificiales son objetos decorativos que se pueden lanzar manualmente o con dispensadores. Se pueden crear usando papel, pólvora y, opcionalmente, una cantidad específica de estrellas de fuegos artificiales.{*B*} +Se pueden personalizar el color, el desvanecimiento, la forma, el tamaño y los efectos (como estelas y brillos) de las estrellas de fuegos artificiales si se les incluye ingredientes adicionales durante la creación.{*B*}{*B*} +Para crear un fuego artificial, coloca pólvora y papel en el recuadro de creación de 3x3 que se ve en tu inventario.{*B*} +También puedes colocar varias estrellas de fuegos artificiales en el recuadro de creación para agregarlas a los fuegos artificiales.{*B*} +Cuanta más pólvora utilices durante la creación, más ascenderá la estrella de fuegos artificiales antes de explotar.{*B*}{*B*} +Luego recoge el fuego artificial que has creado del espacio de producción.{*B*}{*B*} +Las estrellas de fuegos artificiales se pueden crear con pólvora y tinte.{*B*} + - El tinte determinará el color de la estrella al explotar.{*B*} + - La forma de la estrella se puede determinar añadiéndole descargas de fuego, pepitas de oro, plumas o cabeza de enemigos.{*B*} + - Se puede añadir una estela o un brillo usando diamantes o polvo de piedra brillante.{*B*}{*B*} +Cuando hayas creado un fuego artificial, puedes determinar el color de desvanecimiento de la estrella con tinte. + + +Embudos + +{*T3*}CÓMO SE JUEGA: EMBUDOS{*ETW*}{*B*}{*B*} +Los embudos se utilizan para insertar o quitar objetos de contenedores y para recoger de forma automática los objetos que se hayan lanzado en su interior.{*B*} +Pueden afectar a puestos de destilado, cofres, dispensadores, soltadores, vagonetas con cofres, vagonetas con embudos y otros embudos.{*B*}{*B*} +Los embudos intentarán absorber sin cesar objetos de un contenedor apto que se coloque sobre ellos. También tratarán de insertar objetos almacenados en un contenedor de salida.{*B*} +Si un embudo funciona con piedra rojiza, se volverá inactivo y dejará tanto de absorber como de insertar objetos.{*B*}{*B*} +Un embudo apunta en la dirección en la que intenta soltar objetos. Para que un embudo apunte a cierto bloque, colócalo contra dicho bloque mientras acechas.{*B*} + + +Soltadores + +{*T3*}CÓMO SE JUEGA: SOLTADORES{*ETW*}{*B*}{*B*} +Cuando se encuentren junto a una piedra rojiza, los soltadores dejarán caer un objeto aleatorio. Usa {*CONTROLLER_ACTION_USE*} para abrir el soltador y cargarlo con objetos de tu inventario.{*B*} +Si el soltador se encuentra frente a un cofre o a otro tipo de contenedor, el objeto caerá en dicho cofre o contenedor. Se pueden construir largas cadenas de soltadores para transportar objetos a grandes distancias. Para que esto funcione, se los tiene que activar y desactivar alternativamente. + Causa más daño que a mano. @@ -606,10 +661,36 @@ Los colores de la cama siempre son los mismos, independientemente del color de l Cuando se porta, crea una imagen del área explorada. Se puede usar para buscar rutas. +Al usarse, se convierte en un mapa de la parte del mundo en la que te encuentras y se llena conforme lo exploras. + Permite ataques a distancia con flechas. Se usa como munición para arcos. +La suelta el Wither y se utiliza para crear faros. + +Cuando se activan, crean coloridas explosiones. El color, efecto, forma y desaparición vienen determinados por la estrella de fuegos artificiales que se utilice al crear unos fuegos artificiales. + +Se utiliza para determinar el color, efecto y forma de unos fuegos artificiales. + +Se utiliza en los circuitos de piedra rojiza para mantener, comparar o sustraer fuerza de señal, o para medir el estado de ciertos bloques. + +Es un tipo de vagoneta que funciona como un bloque de dinamita móvil. + +Es un bloque que emite una señal de piedra rojiza en función de la luz solar (o la falta de la misma). + +Es un tipo especial de vagoneta que funciona de forma similar a un embudo. Recogerá objetos que estén sueltos en las vías y de los contenedores de encima. + +Un tipo especial de armadura con la que se puede equipar un caballo. Proporciona 5 de armadura. + +Un tipo especial de armadura con la que se puede equipar un caballo. Proporciona 7 de armadura. + +Un tipo especial de armadura con la que se puede equipar un caballo. Proporciona 11 de armadura. + +Se utiliza para atar enemigos al jugador o a postes de valla. + +Se utiliza para nombrar enemigos del mundo. + Restablece 2,5{*ICON_SHANK_01*}. Restablece 1{*ICON_SHANK_01*}. Se puede usar 6 veces. @@ -626,7 +707,7 @@ Los colores de la cama siempre son los mismos, independientemente del color de l Restablece 1.5{*ICON_SHANK_01*}, o se puede cocinar en el horno. -Restablece {*ICON_SHANK_01*}. Se crea cocinando ternera cruda en el horno. +Restablece 4{*ICON_SHANK_01*}. Se crea cocinando ternera cruda en el horno. Restablece 1.5{*ICON_SHANK_01*}, o se puede cocinar en el horno. @@ -667,7 +748,7 @@ de nivel bajo. Cuando se activa, acelera las vagonetas que pasan por encima. Si no está activado, las vagonetas se detendrán. -Funciona como un plato de presión, envía una señal de piedra rojiza cuando se activa, pero solo una vagoneta puede hacerlo. +Funciona como un plato de presión, ya que envía una señal de piedra rojiza cuando se activa, pero solo una vagoneta puede hacer que se active. Se usa para transportarte a ti, a un animal o a un monstruo por raíles. @@ -731,7 +812,7 @@ de tinta en vez de 3). Se usa para crear libros y mapas. -Se usa para crear una estantería o para hechizar libros. +Se usa para crear estanterías o libros hechizados. Permite crear hechizos más potentes cuando se coloca alrededor de una mesa de hechizos. @@ -881,7 +962,7 @@ de tinta en vez de 3). Se usa para destilar pociones y para localizar fortalezas. Lo sueltan las llamas, que se suelen encontrar en las fortalezas del mundo inferior o cerca. -Se usa para destilar pociones. Lo sueltan los espectros cuando mueren. +Se usa para destilar pociones. Lo sueltan los Ghast cuando mueren. Lo sueltan los porqueros zombis cuando mueren. Los porqueros zombis se encuentran en el mundo inferior. Se usa como ingrediente para destilar pociones. @@ -911,7 +992,7 @@ de tinta en vez de 3). Flota en el agua y se puede caminar sobre él. -Se usa para construir fortalezas del mundo inferior. Inmume a las bolas de fuego del espectro. +Se usa para construir fortalezas del mundo inferior. Inmume a las bolas de fuego del Ghast. Se usa en las fortalezas del mundo inferior. @@ -947,100 +1028,158 @@ de tinta en vez de 3). Las cabezas de enemigos pueden colocarse como decoración o llevarse como una máscara en el espacio de casco. +Se utiliza para ejecutar comandos. + +Proyecta un rayo de luz hacia el cielo y puede causar efectos de estado en los jugadores cercanos. + +Almacena bloques y objetos en su interior. Coloca dos cofres uno junto a otro para crear un cofre más grande con el doble de capacidad. El cofre trampa también crea una descarga de piedra rojiza cuando se abre. + +Proporciona una descarga de piedra rojiza. La descarga será más fuerte si hay más objetos en el plato. + +Proporciona una descarga de piedra rojiza. La descarga será más fuerte si hay más objetos en el plato. Requiere más peso que el plato ligero. + +Se usa como fuente de energía de piedra rojiza. Se puede volver a transformar en piedra rojiza. + +Se utiliza para coger objetos o transferir objetos dentro o fuera de contenedores. + +Un tipo de raíl que puede activar o desactivar vagonetas con embudos y activar vagonetas con dinamita. + +Se usa para sujetar y soltar objetos, o para empujarlos dentro de otro contenedor cuando recibe una descarga de piedra rojiza. + +Bloques coloridos que se crean tiñendo arcilla endurecida. + +Se le puede dar de comer a los caballos, burros o mulas para curar hasta 10 corazones. Acelera el crecimiento de los potros. + +Se crea al fundir arcilla en un horno. + +Se crea a partir de cristal y un tinte. + +Se crea a partir de vidrio tintado. + +Una manera de almacenar hulla de forma compacta. Se puede usar como combustible en un horno. + Calamar - + Suelta bolsas de tinta cuando muere. - + Vaca - + Suelta cuero cuando muere. Se puede ordeñar con un cubo. - + Oveja - + Suelta lana cuando se esquila (si aún no ha sido esquilada). Se puede teñir para que su lana sea de diferente color. - + Gallina - + Suelta plumas cuando muere y pone huevos al azar. - + Cerdo - + Suelta chuletas de cerdo cuando muere. Se puede montar con una silla. - + Lobo - + Es dócil hasta que lo atacan, ya que devolverá el ataque. Se puede domar con huesos, lo que ocasionará que el lobo te siga a todas partes y ataque a cualquier cosa que te ataque a ti. - + Creeper - + ¡Explota si te acercas demasiado! - + Esqueleto - + Te dispara flechas. Suelta flechas cuando muere. - + Araña - + Te ataca cuando está cerca. Puede escalar muros. Suelta cuerda cuando muere. - + Zombi - + Te ataca cuando está cerca. - + Porquero zombi - + En principio es manso, pero si atacas a uno atacará en grupo. - + Ghast - + Te dispara bolas de fuego que explotan al hacer contacto. - + Limo - -Escupe limos más pequeños cuando recibe daños. - + +Se divide en Limos más pequeños cuando recibe daños. + Enderman - + Te ataca si lo miras. También puede mover bloques de sitio. - + Pez plateado - + Atrae a los peces plateados ocultos cercanos al atacarlo. Se oculta en bloques de piedra. - + Araña de las cuevas - + Tiene una picadura venenosa. - + Champiñaca - + Crea estofado de champiñón si se usa en un cuenco. Suelta champiñones y se convierte en una vaca normal cuando se esquila. - + Gólem de nieve - + Los jugadores pueden crear el gólem de nieve con bloques de nieve y una calabaza. Lanza bolas de nieve a los enemigos de su creador. - + Dragón de Ender - + Un dragón negro y grande que se encuentra en El Fin. - + Llama - + Son enemigos que se encuentran en el mundo inferior, principalmente dentro de las fortalezas del mundo inferior. Sueltan barras de llama cuando mueren. - + Cubo de magma - + Se encuentran en el mundo inferior. Son parecidos a los limos y se fragmentan en versiones más pequeñas cuando mueren. - + Aldeano - + Ocelote - -Se encuentran en junglas. Pueden domesticarse dándoles de comer pescado crudo. Tienes que dejar se te acerque el ocelote, aunque ten cuidado: cualquier movimiento repentino le espantará. - + +Se encuentran en junglas. Pueden domarse dándoles de comer pescado crudo. Tienes que dejar se te acerque el ocelote, aunque ten cuidado: cualquier movimiento repentino le espantará. + Gólem de hierro - + Aparecen en aldeas para protegerlas y pueden crearse usando bloques de hierro y calabazas. - + +Murciélago + +Estas criaturas voladoras se encuentran en cuevas y otros grandes espacios cerrados. + +Bruja + +Estos enemigos pueden encontrarse en pantanos y atacan lanzando pociones. Si las matas, sueltan pociones. + +Caballo + +Estos animales se pueden domar y montar. + +Burro + +Estos animales se pueden domar y montar. Es posible colocarles un cofre. + +Mula + +Nace del cruce de un caballo y un burro. Estos animales se pueden domar y, después, montar y usar para transportar cofres. + +Caballo zombi + +Caballo esqueleto + +Wither + +Se crea a partir de calaveras atrofiadas y arena de almas. Dispara calaveras explosivas. + Explosives Animator Concept Artist @@ -1203,7 +1342,7 @@ de tinta en vez de 3). Casco de malla -Peto de malla +Coraza de malla Mallas de malla @@ -1319,7 +1458,7 @@ de tinta en vez de 3). Libro -Repugnante +Bola de limo Vagoneta con cofre @@ -1387,6 +1526,8 @@ de tinta en vez de 3). Mapa +Mapa vacío + Disco: "13" Disco: "gato" @@ -1433,7 +1574,7 @@ de tinta en vez de 3). Barra de llama -Lágrima de espectro +Lágrima de Ghast Pepita de oro @@ -1489,6 +1630,28 @@ de tinta en vez de 3). Cabeza de Creeper +Estrella del mundo inferior + +Cohete de fuegos artificiales + +Estrella de fuegos artificiales + +Comparador de piedra rojiza + +Vagoneta con dinamita + +Vagoneta con embudo + +Armadura para caballo de hierro + +Armadura para caballo de oro + +Armadura para caballo de diamante + +Rienda + +Etiqueta de nombre + Piedra Bloque de hierba @@ -1505,6 +1668,8 @@ de tinta en vez de 3). Tablones de la jungla +Tablones (de cualquier tipo) + Arbolillo Arbolillo de roble @@ -1765,7 +1930,7 @@ de tinta en vez de 3). Ladrillos de piedra musgosa -Ladrillos de piedra requebrajada +Ladrillos de piedra resquebrajada Ladrillos de piedra cincelados @@ -1841,6 +2006,190 @@ de tinta en vez de 3). Calavera +Bloque de comando + +Faro + +Cofre trampa + +Plato de presión por peso (ligero) + +Plato de presión por peso (pesado) + +Comparador de piedra rojiza + +Sensor de luz diurna + +Bloque de piedra rojiza + +Embudo + +Raíl activador + +Soltador + +Arcilla tintada + +Fardo de heno + +Arcilla endurecida + +Bloque de hulla + +Arcilla tintada negra + +Arcilla tintada roja + +Arcilla tintada verde + +Arcilla tintada marrón + +Arcilla tintada azul + +Arcilla tintada púrpura + +Arcilla tintada cian + +Arcilla tintada gris claro + +Arcilla tintada gris + +Arcilla tintada rosa + +Arcilla tintada lima + +Arcilla tintada amarilla + +Arcilla tintada azul claro + +Arcilla tintada magenta + +Arcilla tintada naranja + +Arcilla tintada blanca + +Vidrio tintado + +Vidrio tintado negro + +Vidrio tintado rojo + +Vidrio tintado verde + +Vidrio tintado marrón + +Vidrio tintado azul + +Vidrio tintado púrpura + +Vidrio tintado cian + +Vidrio tintado gris claro + +Vidrio tintado gris + +Vidrio tintado rosa + +Vidrio tintado lima + +Vidrio tintado amarillo + +Vidrio tintado azul claro + +Vidrio tintado magenta + +Vidrio tintado naranja + +Vidrio tintado blanco + +Panel de vidrio tintado + +Panel de vidrio tintado negro + +Panel de vidrio tintado rojo + +Panel de vidrio tintado verde + +Panel de vidrio tintado marrón + +Panel de vidrio tintado azul + +Panel de vidrio tintado púrpura + +Panel de vidrio tintado cian + +Panel de vidrio tintado gris claro + +Panel de vidrio tintado gris + +Panel de vidrio tintado rosa + +Panel de vidrio tintado lima + +Panel de vidrio tintado amarillo + +Panel de vidrio tintado azul claro + +Panel de vidrio tintado magenta + +Panel de vidrio tintado naranja + +Panel de vidrio tintado blanco + +Bola pequeña + +Bola grande + +Forma de estrella + +Forma de Creeper + +Explosión + +Forma desconocida + +Negros + +Rojos + +Verdes + +Marrones + +Azules + +Púrpuras + +Cian + +Gris claro + +Grises + +Rosas + +Lima + +Amarillos + +Azul claro + +Magenta + +Naranjas + +Blancos + +Personalizados + +Desaparición en + +Destello + +Rastro + +Duración del vuelo: +  Controles actuales Diseño @@ -2018,8 +2367,7 @@ Pulsa{*CONTROLLER_VK_A*} para continuar el tutorial.{*B*} Este es tu inventario. Muestra los objetos que llevas en la mano y los demás objetos que portas. Aquí también aparece tu armadura. - - + {*B*} Pulsa{*CONTROLLER_VK_A*} para continuar.{*B*} Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo usar el inventario. @@ -2040,7 +2388,7 @@ Pulsa{*CONTROLLER_VK_A*} para continuar el tutorial.{*B*} - Si quieres obtener más información sobre un objeto, mueve el foco sobre él y pulsa{*CONTROLLER_VK_RT*} . + Si quieres obtener más información sobre un objeto, mueve el foco sobre él y pulsa{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . @@ -2074,7 +2422,7 @@ Pulsa{*CONTROLLER_VK_A*} para continuar el tutorial.{*B*} - Si quieres obtener más información sobre un objeto, mueve el foco sobre él y pulsa{*CONTROLLER_VK_RT*} . + Si quieres obtener más información sobre un objeto, mueve el foco sobre él y pulsa{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . @@ -2540,7 +2888,7 @@ En el modo de vuelo, mantén pulsado{*CONTROLLER_ACTION_JUMP*} para moverte haci Algunos animales te seguirán si tienes su comida en la mano. Así te será más fácil agrupar animales para hacer que se reproduzcan.{*ICON*}296{*/ICON*} - Los lobos salvajes se pueden domesticar dándoles huesos. Una vez domesticados, aparecerán corazones de amor a su alrededor. Los lobos mansos seguirán al jugador y lo defenderán si no reciben la orden de quedarse sentados. + Los lobos salvajes se pueden domar dándoles huesos. Una vez domados, aparecerán corazones de amor a su alrededor. Los lobos mansos seguirán al jugador y lo defenderán si no reciben la orden de quedarse sentados. Has completado el tutorial de reproducción de animales. @@ -2620,6 +2968,211 @@ En el modo de vuelo, mantén pulsado{*CONTROLLER_ACTION_JUMP*} para moverte haci Pulsa{*CONTROLLER_VK_B*} si ya tienes información sobre la barra de comida y cómo comer. + + Esta es la interfaz del inventario equino. + + + + {*B*}Pulsa{*CONTROLLER_VK_A*} para continuar. + {*B*}Pulsa {*CONTROLLER_VK_B*} si ya sabes cómo usar el inventario equino. + + + + El inventario equino te permite transferir o equipar con objetos tu caballo, burro o mula. + + + + Ensilla tu caballo colocando una silla de montar en el espacio correspondiente. Puedes poner armaduras a los caballos; solo tienes que colocar la armadura para caballo en el espacio correspondiente. + + + + También puedes transferir objetos entre tu propio inventario y las alforjas que llevan los burros y mulas desde este menú. + + +Has encontrado un caballo. + +Has encontrado un burro. + +Has encontrado una mula. + + + {*B*}Pulsa {*CONTROLLER_VK_A*} para obtener más información sobre los caballos, los burros y las mulas. + {*B*}Pulsa {*CONTROLLER_VK_B*} si ya sabes cómo funcionan los caballos, los burros y las mulas. + + + + Los caballos y los burros se suelen encontrar en las llanuras abiertas. Las mulas se pueden criar a partir de un burro y un caballo, pero no son fértiles. + + + + Todos los caballos, burros y mulas adultos se pueden montar. Sin embargo, solo los caballos pueden llevar armadura, y solo las mulas y los burros pueden equiparse con alforjas para llevar objetos. + + + + Los caballos, burros y mulas deben domarse antes de poder usarse. Un caballo se doma intentando montarlo y logrando mantenerse sobre él mientras trata de tirarte. + + + + Cuando estén domados, aparecerán corazones de amor a su alrededor y ya no intentarán tirarte. + + + + Ahora intenta montar este caballo. Usa {*CONTROLLER_ACTION_USE*} sin objetos ni herramientas en las manos para montarlo. + + + + Para dirigir un caballo, debe estar equipado antes con una silla de montar que se puede comprar a los aldeanos o encontrar en cofres ocultos por el mundo. + + + + Puedes poner alforjas a los burros y mulas domados; solo tienes que colocarles un cofre. Puedes acceder a estas alforjas mientras montas o acechas. + + + + Los caballos y los burros (pero no las mulas) pueden cruzarse como los demás animales utilizando manzanas doradas o zanahorias doradas. Los potros se convertirán en caballos adultos con el tiempo, aunque alimentarlos con trigo o heno acelerará el proceso. + + + + Aquí puedes intentar domar los caballos y burros, y hay sillas de montar, armaduras de caballo y otros objetos útiles para caballos en los cofres de la zona. + + + + Esta es la interfaz de faro, que puedes utilizar para elegir los poderes que otorgará tu faro. + + + + {*B*}Pulsa{*CONTROLLER_VK_A*} para continuar. + {*B*}Pulsa {*CONTROLLER_VK_B*} si ya sabes cómo usar la interfaz de faro. + + + + En el menú de faro puedes elegir un poder principal para este. Podrás elegir entre más poderes cuantas más plantas tenga la pirámide. + + + + Un faro sobre una pirámide de al menos cuatro plantas también ofrece la posibilidad de o bien tener el poder secundario Regeneración, o bien tener un poder principal más fuerte. + + + + Para establecer los poderes del faro, debes sacrificar un lingote de esmeralda, diamante, oro o hierro en el espacio de pago. Una vez establecidos, los poderes emanarán del faro indefinidamente. + + +En lo alto de esta pirámide hay un faro inactivo. + + + {*B*}Pulsa {*CONTROLLER_VK_A*} para obtener más información sobre los faros. + {*B*}Pulsa {*CONTROLLER_VK_B*} si ya sabes cómo funcionan los faros. + + + + Los faros activos proyectan un rayo de luz brillante hacia el cielo y otorgan poderes a los jugadores cercanos. Se crean con cristal, obsidiana y estrellas del mundo inferior, que se pueden obtener derrotando al Wither. + + + + Los faros deben situarse de modo que queden al sol durante el día. Los faros deben colocarse en pirámides de hierro, oro, esmeralda o diamante. Sin embargo, el material sobre el que se sitúe el faro no tiene ningún efecto sobre el poder del mismo. + + + + Intenta utilizar el faro para establecer los poderes que otorga; puedes pagar con los lingotes de hierro que se te han proporcionado. + + +Esta sala contiene embudos + + + {*B*}Pulsa {*CONTROLLER_VK_A*} para obtener más información sobre los embudos. + {*B*}Pulsa {*CONTROLLER_VK_B*} si ya sabes cómo funcionan los embudos. + + + + Los embudos se utilizan para insertar o quitar objetos de contenedores y para recoger de forma automática los objetos que se hayan lanzado en su interior. + + + + Pueden afectar a puestos de destilado, cofres, dispensadores, soltadores, vagonetas con cofres, vagonetas con embudos y otros embudos. + + + + Los embudos intentarán absorber sin cesar objetos de un contenedor apto que se coloque sobre ellos. También tratarán de insertar objetos almacenados en un contenedor de salida. + + + + Sin embargo, si un embudo funciona con piedra rojiza, se volverá inactivo y dejará tanto de absorber como de insertar objetos. + + + + Un embudo apunta en la dirección en la que intenta soltar objetos. Para que un embudo apunte a cierto bloque, colócalo contra dicho bloque mientras acechas. + + + + Hay varias configuraciones útiles de embudo que ver y probar en esta sala. + + + + Esta es la interfaz de fuegos artificiales, que puedes utilizar para fabricar fuegos artificiales y estrellas de fuegos artificiales. + + + + {*B*}Pulsa{*CONTROLLER_VK_A*} para continuar. + {*B*}Pulsa{*CONTROLLER_VK_B*} si ya sabes cómo usar la interfaz de fuegos artificiales. + + + + Para crear un fuego artificial, coloca pólvora y papel en el recuadro de creación de 3x3 que se ve en tu inventario. + + + + También puedes colocar varias estrellas de fuegos artificiales en el recuadro de creación para agregarlas a los fuegos artificiales. + + + + Cuanta más pólvora utilices durante la creación, más ascenderá la estrella de fuegos artificiales antes de explotar. + + + + Luego recoge el fuego artificial que has creado del espacio de producción si quieres usarlo. + + + + Las estrellas de fuegos artificiales se pueden crear con pólvora y tinte. + + + + El tinte determinará el color de la estrella al explotar. + + + + La forma de la estrella se puede determinar añadiéndole descargas de fuego, pepitas de oro, plumas o cabeza de enemigos. + + + + Se puede añadir una estela o un brillo usando diamantes o polvo de piedra brillante. + + + + Cuando hayas creado un fuego artificial, puedes determinar el color de desvanecimiento de la estrella con tinte. + + + + ¡Dentro del cofre hay varios objetos que puedes usar para crear FUEGOS ARTIFICIALES! + + + + {*B*}Pulsa {*CONTROLLER_VK_A*} para obtener más información sobre los fuegos artificiales. + {*B*}Pulsa {*CONTROLLER_VK_B*} si ya sabes cómo funcionan los fuegos artificiales. + + + + Los fuegos artificiales son objetos decorativos que se pueden lanzar manualmente o con dispensadores. Se pueden crear usando papel, pólvora y, opcionalmente, una cantidad específica de estrellas de fuegos artificiales. + + + + Se pueden personalizar el color, el desvanecimiento, la forma, el tamaño y los efectos (como estelas y brillos) de las estrellas de fuegos artificiales si se les incluye ingredientes adicionales durante la creación. + + + + Prueba a crear fuegos artificiales en la mesa de creación usando los ingredientes que desees de los cofres. + +  Seleccionar Usar @@ -2708,7 +3261,7 @@ En el modo de vuelo, mantén pulsado{*CONTROLLER_ACTION_JUMP*} para moverte haci Alimentar -Domesticar +Domar Curar @@ -2816,7 +3369,7 @@ En el modo de vuelo, mantén pulsado{*CONTROLLER_ACTION_JUMP*} para moverte haci Equipar -Retirar +Tensar Soltar @@ -2840,8 +3393,24 @@ En el modo de vuelo, mantén pulsado{*CONTROLLER_ACTION_JUMP*} para moverte haci Eliminar todos los espacios -Subir partida guardada para Xbox One +Cargar partida guardada para Xbox One +Montar + +Desmontar + +Colocar cofre + +Lanzar + +Atar + +Soltar + +Colocar + +Nombre + Aceptar Cancelar @@ -3152,6 +3721,20 @@ Ve a la Interfaz para seleccionar este tema. Dispensador +Caballo + +Soltador + +Embudo + +Faro + +Poder principal + +Poder secundario + +Vagoneta + No existen ofertas de descarga de contenido de este tipo disponibles para este título en este momento. %s se ha unido al juego. @@ -3311,10 +3894,14 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. Modo juego: Creativo +Modo juego: Aventura + Supervivencia Creativo +Aventura + En modo Supervivencia En modo Creativo @@ -3335,6 +3922,8 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. Superplano +Introduce una semilla para volver a generar el mismo terreno. Déjalo vacío para un mundo aleatorio. + Si está habilitado, el juego será un juego en línea. Si está habilitado, solo los jugadores invitados pueden unirse. @@ -3359,6 +3948,20 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. Si está habilitado, se creará un cofre con objetos útiles cerca del punto de generación del jugador. +Cuando se desactiva, impide que monstruos y animales cambien bloques (por ejemplo, las explosiones de Creepers no destruirán bloques y las ovejas no quitarán el césped) o recojan objetos. + +Al activarse, los jugadores mantendrán el inventario al morir. + +Al desactivarse, los enemigos no se generarán de forma natural. + +Al desactivarse, los monstruos y animales no soltarán botín (por ejemplo, los Creepers no soltarán pólvora). + +Al desactivarse, los bloques no soltarán objetos cuando se destruyan (por ejemplo, los bloques de piedra no soltarán guijarros). + +Al desactivarse, los jugadores no regenerarán salud de forma natural. + +Al desactivarse, la hora del día no cambiará. + Packs de aspecto Temas @@ -3407,7 +4010,49 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. {*SOURCE*} apaleó a {*PLAYER*} -{*PLAYER*} ha muerto a manos de {*SOURCE*} +{*SOURCE*} mató a {*PLAYER*} con magia. + +{*PLAYER*} se cayó de una escalera. + +{*PLAYER*} se cayó de unas hiedras. + +{*PLAYER*} se cayó del agua. + +{*PLAYER*} se cayó de un lugar alto. + +{*SOURCE*} condenó a caer a {*PLAYER*}. + +{*SOURCE*} condenó a caer a {*PLAYER*}. + +{*SOURCE*} condenó a caer a {*PLAYER*} con {*ITEM*}. + + {*PLAYER*} cayó demasiado lejos y murió a manos de {*SOURCE*}. + + {*PLAYER*} cayó demasiado lejos y murió a manos de {*SOURCE*}, que utilizó {*ITEM*}. + +{*PLAYER*} tropezó con fuego mientras luchaba contra {*SOURCE*}. + +{*PLAYER*} acabó cual tostada chamuscada mientras luchaba contra {*SOURCE*}. + +{*PLAYER*} intentó nadar en la lava para escapar de {*SOURCE*}. + +{*PLAYER*} se ahogó mientras intentaba escapar de {*SOURCE*}. + +{*PLAYER*} tropezó con un cactus mientras intentaba escapar de {*SOURCE*}. + +{*SOURCE*} hizo volar por los aires a {*PLAYER*}. + +{*PLAYER*} sufrió los efectos del Wither. + +{*SOURCE*} asesinó a {*PLAYER*} con {*ITEM*}. + +{*SOURCE*} disparó a {*PLAYER*} con {*ITEM*}. + +{*SOURCE*} quemó con bolas de fuego a {*PLAYER*} con {*ITEM*}. + +{*SOURCE*} apaleó a {*PLAYER*} con {*ITEM*}. + +{*PLAYER*} ha muerto a manos de {*SOURCE*}, que utilizó {*ITEM*}. Niebla de lecho de roca @@ -3574,7 +4219,7 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. No se puede trasquilar esta champiñaca en este momento. Límite de cerdos, ovejas, vacas y gatos alcanzado. -El huevo generador no está disponible en estos momentos. Se ha alcanzado la cantidad máxima de cerdos, ovejas, vacas y gatos. +No se pueden usar huevos generadores en este momento. Límite de cerdos, ovejas, vacas y gatos alcanzado. No se pueden usar huevos generadores ahora. Límite de champiñacas en un mundo alcanzado. @@ -3584,6 +4229,8 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. No se pueden usar huevos generadores en este momento. Se ha alcanzado el límite de calamares en un mundo. +No se pueden usar huevos generadores en este momento. Se ha alcanzado el límite de murciélagos en un mundo. + No se pueden usar huevos generadores en este momento. Se ha alcanzado el límite de enemigos en un mundo. No se pueden usar huevos generadores en este momento. Se ha alcanzado el límite de aldeanos en un mundo. @@ -3592,12 +4239,14 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. No puedes generar enemigos en el modo pacífico. -Este animal no puede entrar en el modo Amor. Se ha alcanzado la cantidad máxima de cerdos, ovejas, vacas y gatos reproductores. +Este animal no puede estar en modo Amor. Límite de cría de cerdos, ovejas, vacas, gatos y caballos alcanzado. Este animal no puede estar en modo Amor. Se ha alcanzado el límite de cría de lobos. Este animal no puede estar en modo Amor. Se ha alcanzado el límite de cría de gallinas. +Este animal no puede estar en modo Amor. Se ha alcanzado el límite de cría de caballos. + Este animal no puede estar en modo Amor. Se ha alcanzado el límite de cría de champiñacas. Se ha alcanzado la cantidad máxima de barcos en un mundo. @@ -3610,7 +4259,7 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. ¡Has muerto! -Regenerarse +Regenerar Descarga de contenido @@ -3625,40 +4274,56 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. Créditos Volver a instalar contenido - + Configuración de depuración - + El fuego se propaga - + La dinamita explota - + Jugador contra jugador - + Confiar en jugadores - + Privilegios de host - + Genera estructuras - + Mundo superplano - + Cofre de bonificación - + Opciones del mundo - + +Opciones de juego + +Vandalismo de enemigos + +Mantener inventario + +Generación de enemigos + +Botín de enemigos + +Soltar casillas + +Regeneración natural + +Ciclo de luz diurna + Puede construir y extraer -Puedes usar puertas e interruptores. +Puede usar puertas e interruptores -Puedes abrir contenedores. +Puede abrir contenedores -Puede atacar a los jugadores +Puede atacar a jugadores -Puedes atacar a animales. +Puede atacar a animales Moderador -Expulsar +Expulsar jugador Puede volar @@ -3832,6 +4497,14 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. Veneno +Wither + +Mejora de salud + +Absorción + +Saturación + de rapidez de lentitud @@ -3870,6 +4543,14 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. de veneno +de decadencia + +de mejora de salud + +de absorción + +de saturación + II @@ -3966,6 +4647,22 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. Disminuye la salud de los jugadores, animales y monstruos afectados con el tiempo. +Cuando se aplica: + +Fuerza de salto de caballo + +Refuerzos zombis + +Salud máxima + +Alcance de seguimiento de enemigos + +Resistencia a derribo + +Velocidad + +Daño de ataque + Afilado Aporrear @@ -4056,7 +4753,7 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. Restablece 3{*ICON_SHANK_01*}. Se crea cocinando una patata en el horno. -Restablece 1{*ICON_SHANK_01*}o se puede cocinar en el horno. Se puede plantar en tierras de cultivo. Si comes esto puede que te envenene. +Restablece 1{*ICON_SHANK_01*}. Si comes esto puede que te envenene. Restablece 3{*ICON_SHANK_01*}. Se produce a partir de una zanahoria y pepitas de oro. Restablece 3. @@ -4066,7 +4763,7 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. Se usa junto con un yunque para hechizar armas, herramientas o armaduras. -Se crea fundiendo menas de cuarzo del mundo inferior. Se le puede dar forma de bloque de cuarzo. +Se crea fundiendo minerales de cuarzo del mundo inferior. Se le puede dar forma de bloque de cuarzo. Se fabrica con lana. Se usa como decoración. @@ -4092,7 +4789,7 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. Cuarzo del mundo inferior -Mena de esmeralda +Mineral de esmeralda Cofre de Ender @@ -4120,7 +4817,7 @@ No apagues la Consola Xbox 360 cuando aparezca este icono en pantalla. Yunque muy dañado -Mena de cuarzo del mundo inferior +Mineral de cuarzo del mundo inferior Bloque de cuarzo @@ -4435,7 +5132,7 @@ Todos los cofres de Ender de un mundo están vinculados, y los objetos que conti - Una vez domesticados, los lobos siempre llevarán un collar. Tíñelo para cambiarlo de color. + Una vez domados, los lobos siempre llevarán un collar. Tíñelo para cambiarlo de color. Planta zanahorias o patatas y coséchalas cuando empiecen a brotar del suelo. @@ -4458,7 +5155,7 @@ Todos los cofres de Ender de un mundo están vinculados, y los objetos que conti Esta opción deshabilita los logros y las actualizaciones del marcador de este mundo cuando se juega y si se vuelve a cargar después de guardarlo con esta opción activada. -Subir partida guardada para Xbox One +Cargar partida guardada para Xbox One Subir datos guardados diff --git a/Minecraft.Client/Common/Media/font/CHS/MSYH.ttf b/Minecraft.Client/Common/Media/font/CHS/MSYH.ttf new file mode 100644 index 00000000..96d1db19 Binary files /dev/null and b/Minecraft.Client/Common/Media/font/CHS/MSYH.ttf differ diff --git a/Minecraft.Client/Common/Media/fr-FR/strings.resx b/Minecraft.Client/Common/Media/fr-FR/strings.resx index 788799ff..541bbb7d 100644 --- a/Minecraft.Client/Common/Media/fr-FR/strings.resx +++ b/Minecraft.Client/Common/Media/fr-FR/strings.resx @@ -230,11 +230,11 @@ Vous devrez essayer diverses combinaisons d'ingrédients pour découvrir toutes {*T3*}COMMENT JOUER : ENCHANTEMENT{*ETW*}{*B*}{*B*} Les points d'expérience obtenus à la mort d'un monstre, ou lorsque certains blocs sont minés ou fondus dans un four, peuvent servir à enchanter les outils, armes, armures et livres.{*B*} -Lorsqu'une épée, une hache, une pioche, une pelle, une armure ou un livre est placé dans l'emplacement situé sous le livre de la table d'enchantement, les trois boutons à sa droite afficheront certains enchantements ainsi que leur coût en niveaux d'expérience.{*B*} +Lorsqu'une épée, une hache, une pioche, une pelle, une armure ou un livre est placé dans l'emplacement situé sous le livre de la table d'enchantement, les trois boutons à sa droite afficheront certains enchantements ainsi que leur coût en niveaux d'expérience.{*B*} Si vous n'avez pas assez de niveaux d'expérience pour utiliser certains d'entre eux, le coût apparaîtra en rouge ; sinon, en vert.{*B*}{*B*} L'enchantement appliqué par défaut est choisi aléatoirement d'après le coût affiché.{*B*}{*B*} Si la table d'enchantement est entourée de bibliothèques (jusqu'à 15) avec un intervalle d'un bloc entre la table et la bibliothèque, la puissance des enchantements sera renforcée et des glyphes arcaniques apparaîtront, projetés par le livre sur la table d'enchantement.{*B*}{*B*} -Tous les ingrédients nécessaires à une table d'enchantement peuvent se trouver dans les villages, ou bien en minant et cultivant.{*B*} +Tous les ingrédients nécessaires à une table d'enchantement peuvent se trouver dans les villages, ou bien en minant et cultivant.{*B*}{*B*} Utilisez les livres d'enchantement à l'enclume pour enchanter des objets. Ainsi, vous contrôlez mieux quels enchantements vous désirez utiliser sur vos objets.{*B*} @@ -274,14 +274,14 @@ Pour ce faire, affichez le menu Pause puis appuyez sur{*CONTROLLER_VK_RB*} pour Si vous tentez de rejoindre ce niveau à l'avenir, un message vous indiquera qu'il figure dans votre liste de niveaux exclus. Vous pourrez alors décider de le supprimer de la liste et d'y accéder, ou bien d'annuler. {*T3*}COMMENT JOUER : MODE CRÉATIF{*ETW*}{*B*}{*B*} -L'interface du mode Créatif permet de déplacer dans l'inventaire du joueur n'importe quel objet du jeu sans qu'il soit besoin de le miner ou de le fabriquer. {*B*} +L'interface du mode Créatif permet de déplacer dans l'inventaire du joueur n'importe quel objet du jeu sans qu'il soit besoin de le miner ou de le fabriquer. Les objets figurant dans l'inventaire du joueur ne sont pas supprimés lorsqu'ils sont placés ou utilisés dans l'environnement du jeu, ce qui permet au joueur de tout miser sur la construction sans se soucier de collecter des ressources.{*B*} Si vous créez, chargez ou sauvegardez un monde en mode Créatif, les mises à jour des succès et des classements seront désactivées pour ce monde, même s'il est chargé en mode Survie.{*B*} -Pour voler en mode Créatif, appuyez deux fois rapidement sur {*CONTROLLER_ACTION_JUMP*}. Pour ne plus voler, répétez l'opération. Pour voler plus vite, orientez rapidement{*CONTROLLER_ACTION_MOVE*} deux fois vers l'avant en cours de vol.{*B*} -En mode Vol, maintenez{*CONTROLLER_ACTION_JUMP*} pour monter et{*CONTROLLER_ACTION_SNEAK*} pour descendre, ou bien utilisez{*CONTROLLER_ACTION_DPAD_UP*} pour monter, {*CONTROLLER_ACTION_DPAD_DOWN*} pour descendre, {*B*} +Pour voler en mode Créatif, appuyez deux fois rapidement sur {*CONTROLLER_ACTION_JUMP*}. Pour ne plus voler, répétez l'opération. Pour voler plus vite, orientez rapidement{*CONTROLLER_ACTION_MOVE*} deux fois vers l'avant en cours de vol. +En mode Vol, maintenez{*CONTROLLER_ACTION_JUMP*} pour monter et{*CONTROLLER_ACTION_SNEAK*} pour descendre, ou bien utilisez{*CONTROLLER_ACTION_DPAD_UP*} pour monter, {*CONTROLLER_ACTION_DPAD_DOWN*} pour descendre, {*CONTROLLER_ACTION_DPAD_LEFT*} pour virer à gauche et {*CONTROLLER_ACTION_DPAD_RIGHT*} pour virer à droite. -{*T3*}COMMENT JOUER : OPTIONS DU JOUEUR ET DE L'HÔTE{*ETW*}{*B*}{*B*} +{*T3*}COMMENT JOUER : OPTIONS DU JOUEUR ET DE L'HÔTE{*ETW*}{*B*}{*B*} {*T1*}Options du joueur{*ETW*}{*B*} Lorsque vous chargez ou créez un monde, appuyez sur le bouton Plus d'options pour accéder à un menu où figurent d'autres paramètres de configuration de la partie.{*B*}{*B*} @@ -299,7 +299,28 @@ Lorsque vous chargez ou créez un monde, appuyez sur le bouton Plus d'options po Lorsque cette option est activée, le TNT peut exploser lorsqu'il est activé. Vous pouvez aussi modifier cette option depuis le menu de jeu.{*B*}{*B*} {*T2*}Privilèges d'hôte{*ETW*}{*B*} - Lorsque cette option est activée, l'hôte peut activer/désactiver sa capacité à voler, désactiver la fatigue et se rendre invisible depuis le menu de jeu. {*DISABLES ACHIEVEMENTS}{*.{*B*}{*B*} + Lorsque cette option est activée, l'hôte peut activer/désactiver sa capacité à voler, désactiver la fatigue et se rendre invisible depuis le menu de jeu. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + + {*T2*}Cycle jour/nuit{*ETW*}{*B*} + Si vous désactivez cette option, le moment de la journée ne change pas.{*B*}{*B*} + + {*T2*}Conservation d'inventaire{*ETW*}{*B*} + Si vous activez cette option, les joueurs conservent leur inventaire après leur mort.{*B*}{*B*} + + {*T2*}Apparition des monstres{*ETW*}{*B*} + Si vous désactivez cette option, les monstres n'apparaissent pas automatiquement.{*B*}{*B*} + + {*T2*}Ingérence des monstres{*ETW*}{*B*} + Si vous désactivez cette option, les monstres et animaux ne peuvent ni modifier des blocs (par exemple, les explosions des Creepers ne détruisent pas les blocs et les moutons ne retirent pas d'herbe), ni ramasser des objets.{*B*}{*B*} + + {*T2*}Butin des monstres{*ETW*}{*B*} + Si vous désactivez cette option, les monstres et animaux ne laissent pas d'objets (par exemple, les Creepers ne laissent pas de poudre à canon).{*B*}{*B*} + + {*T2*}Butin des blocs{*ETW*}{*B*} + Si vous désactivez cette option, les blocs ne laissent pas d'objets après être détruits (par exemple, les blocs de pierre ne laissent pas de pierre taillée).{*B*}{*B*} + + {*T2*}Régénération auto{*ETW*}{*B*} + Si vous désactivez cette option, les joueurs ne regagnent pas leur santé automatiquement.{*B*}{*B*} {*T1*}Options de création de monde{*ETW*}{*B*} Lorsque vous créez un monde, vous disposez d'options supplémentaires.{*B*}{*B*} @@ -314,10 +335,10 @@ Lorsque vous créez un monde, vous disposez d'options supplémentaires.{*B*}{*B* Lorsque cette option est activée, un coffre renfermant des objets utiles sera créé à proximité du point d'apparition du joueur.{*B*}{*B*} {*T2*}Réinitialiser le Nether{*ETW*}{*B*} - Quand activé, le Nether sera généré de nouveau. Ceci est utile si vous avez une sauvegarde plus ancienne sans forteresse du Nether.{*B*}{*B*} + Activé, le Nether se régénérera. Utile si vous avez une ancienne sauvegarde sans forteresse du Nether.{*B*}{*B*} {*T1*}Options de jeu{*ETW*}{*B*} - Appuyez sur la touche BACK pour afficher le menu de jeu et accéder à diverses options.{*B*}{*B*} + Appuyez sur {*BACK_BUTTON*} pour afficher le menu de jeu et accéder à diverses options.{*B*}{*B*} {*T2*}Options de l'hôte{*ETW*}{*B*} Le joueur hôte et les joueurs au statut de modérateur peuvent accéder au menu Options de l'hôte. Depuis ce menu, ils peuvent activer/désactiver la propagation du feu et l'explosion de TNT.{*B*}{*B*} @@ -337,38 +358,40 @@ Pour modifier les privilèges d'un joueur, sélectionnez son nom et appuyez sur{ {*T2*}Peut attaquer les joueurs{*ETW*}{*B*} Uniquement disponible si l'option Joueurs de confiance est désactivée. Cette option désactivée, le joueur ne pourra pas infliger de dégâts aux autres joueurs.{*B*}{*B*} - {*T2*}Peut attaquer des animaux{*ETW*}{*B*} + {*T2*}Peut attaquer les animaux{*ETW*}{*B*} Uniquement disponible quand l'option Joueurs de confiance est désactivée. Quand cette option est désactivée, le joueur ne pourra pas infliger des dégâts aux animaux.{*B*}{*B*} {*T2*}Modérateur{*ETW*}{*B*} Lorsque cette option est activée, le joueur peut modifier les privilèges des autres joueurs (à l'exception de l'hôte) si l'option Joueurs de confiance est désactivée, il peut exclure des joueurs et activer ou désactiver la propagation du feu et l'explosion de TNT.{*B*}{*B*} {*T2*}Exclure joueur{*ETW*}{*B*} - Pour les joueurs qui ne jouent pas sur la même console {*PLATFORM_NAME*} que le joueur hôte, sélectionner cette option exclura le joueur de la partie, ainsi que tout autre joueur sur sa console {*PLATFORM_NAME*}. Ce joueur ne pourra plus rejoindre la partie jusqu'à son redémarrage.{*B*}{*B*} + {*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} {*T1*}Options du joueur hôte{*ETW*}{*B*} Si l'option Privilèges d'hôte est activée, le joueur hôte peut modifier certains de ses propres privilèges. Pour modifier les privilèges d'un joueur, sélectionnez son nom et appuyez sur{*CONTROLLER_VK_A*} pour afficher le menu des privilèges et paramétrer les options suivantes.{*B*}{*B*} {*T2*}Peut voler{*ETW*}{*B*} Lorsque cette option est activée, le joueur peut voler. Cette option ne sert qu'en mode Survie, puisque tous les joueurs peuvent voler en mode Créatif.{*B*}{*B*} - + {*T2*}Fatigue désactivée{*ETW*}{*B*} Cette option ne s'applique qu'au mode Survie. Lorsque cette option est activée, les activités physiques (marcher, courir, sauter, etc.) n'épuisent pas la jauge de nourriture. En revanche, si le joueur est blessé, sa jauge de nourriture se videra progressivement tandis qu'il se remet de ses blessures.{*B*}{*B*} - + {*T2*}Invisible{*ETW*}{*B*} Lorsque cette option est activée, le joueur est dissimulé au regard des autres joueurs et est invulnérable.{*B*}{*B*} - - {*T2*}Peut se téléporter{*ETW*}{*B*} + + {*T2*}Peut se téléporter{*ETW*}{*B*} Cette option permet au joueur de se déplacer ou déplacer d'autres joueurs instantanément dans le monde. +Pour les joueurs qui ne sont pas sur la même console {*PLATFORM_NAME*} que le joueur hôte, la sélection de cette option éjectera le joueur de la partie, ainsi que tous les autres joueurs connectés sur sa console {*PLATFORM_NAME*}. Ce joueur ne pourra rejoindre la partie qu'après son redémarrage. + Page suivante Page précédente Principes -Interface principale +Interface Inventaire @@ -411,7 +434,7 @@ L'Ender est une autre dimension du jeu, atteinte par un portail de l'Ender actif Pour activer le portail de l'Ender, vous devrez placer un Å“il d'Ender dans n'importe quel cadre de portail de l'Ender qui n'en contient pas.{*B*} Quand le portail est actif, sautez dedans pour vous rendre dans l'Ender.{*B*}{*B*} Dans l'Ender, vous rencontrerez le dragon de l'Ender, un ennemi féroce et puissant, et de nombreux Enderman. Vous devrez donc être préparé au combat avant de vous y rendre !{*B*}{*B*} -Vous découvrirez qu'il existe des cristaux d'Ender à l'extrémité de huit pics d'obsidienne que le dragon utilise pour se soigner. +Vous découvrirez qu'il existe des cristaux d'Ender à l'extrémité de huit pics d'obsidienne que le dragon utilise pour se soigner. La première étape est donc de détruire chacun d'entre eux.{*B*} Les premiers peuvent être atteints par des flèches, mais les derniers sont protégés par une cage d'acier, et vous devrez les atteindre par étapes.{*B*}{*B*} Ce faisant, le dragon de l'Ender vous attaquera en volant vers vous et en crachant des boules d'acide de l'Ender !{*B*} @@ -425,63 +448,95 @@ et ils pourront facilement vous rejoindre. Nouveautés - -{*T3*}Modifications et ajouts {*ETW*}{*B*}{*B*} -- Ajout de nouveaux objets : émeraude, minerai d'émeraude, bloc d'émeraude, coffre du Néant, crochet, pomme dorée enchantée, enclume, pot de fleurs, murets, murets moussus, peinture de Wither, pomme de terre, pomme de terre cuite, pomme de terre empoisonnée, carotte, carotte dorée, carotte sur un bâton, -tarte à la citrouille, potion de vision nocturne, potion d'invisibilité, quartz du Nether, minerai de quartz du Nether, bloc de quartz du Nether, dalle de quartz, escalier en quartz, bloc de quartz taillé, pilier de blocs de quartz, livre enchanté, tapis.{*B*} -- Ajout de nouvelles recettes pour le grès lisse et le grès taillé.{*B*} -- Ajout de nouveaux monstres : villageois zombies.{*B*} -- Ajout de nouvelles fonctions de génération de terrain : pyramides, villages du désert, temples de la jungle.{*B*} -- Ajout de transactions avec les villageois.{*B*} -- Ajout d'une interface d'enclume.{*B*} -- Possibilité de teindre les armures en cuir.{*B*} -- Possibilité de teindre les colliers des loups.{*B*} -- Possibilité de contrôler un cochon comme monture à l'aide d'une carotte sur un bâton.{*B*} -- Mise à jour du contenu des coffres bonus, qui contiennent maintenant plus d'objets.{*B*} -- Modification du placement des demi-blocs et autres blocs sur demi-blocs.{*B*} -- Modification du placement des escaliers et dalles à l'envers.{*B*} -- Ajout de différentes professions pour les villageois.{*B*} -- Les villageois générés par un Å“uf d'apparition ont une profession aléatoire.{*B*} -- Ajout d'un placement de tronc oblique.{*B*} -- Les fours peuvent utiliser les outils en bois comme combustible.{*B*} -- Vous pouvez récupérer les vitres en glace et en verre à l'aide d'outils disposant de l'enchantement Délicatesse.{*B*} -- Vous pouvez déclencher les boutons en bois et les plaques de détection en bois à l'aide de flèches.{*B*} -- Les portails à la Surface peuvent générer des monstres du Nether.{*B*} -- Les creepers et les araignées attaquent le dernier joueur qui les a touchés.{*B*} -- En mode Créatif, les monstres redeviennent neutres après un bref laps de temps.{*B*} -- Suppression du recul en cas de noyade.{*B*} -- Les dégâts des portes abîmées par les zombies sont visibles.{*B*} -- La glace fond dans le Nether.{*B*} -- Les chaudrons se remplissent d'eau de pluie.{*B*} -- Les pistons sont deux fois plus longs à mettre à jour.{*B*} -- Le cochon laisse une selle à sa mort (s'il en possède une).{*B*} -- La couleur du ciel de La Fin a changé.{*B*} -- Il est possible de placer un fil de déclenchement relié à un crochet.{*B*} -- La pluie goutte à travers les feuilles.{*B*} -- Il est possible de placer des leviers sur le bas des blocs.{*B*} -- La TNT inflige des dégâts variables selon la difficulté choisie.{*B*} -- La recette des livres a changé.{*B*} -- Ce sont les bateaux qui cassent les nénuphars et non l'inverse.{*B*} -- Les cochons lâchent plus de viande de porc.{*B*} -- Les slimes se reproduisent moins dans les mondes superplats.{*B*} -- Les dégâts des creepers sont variables selon la difficulté choisie. Recul accru.{*B*} -- Correction du bug qui empêchait l'Enderman d'ouvrir les mâchoires.{*B*} -- Ajout d'une téléportation des joueurs (à l'aide du menu {*BACK_BUTTON*} dans le jeu).{*B*} -- Ajout de nouvelles options de l'hôte gérant la lévitation, l'invisibilité et l'invulnérabilité des joueurs distants.{*B*} -- Ajout de nouveaux didacticiels dans le monde didacticiel, correspondant aux nouveaux objets et fonctionnalités.{*B*} -- Mise à jour de l'emplacement des coffres à disques vinyles dans le monde didacticiel.{*B*} +{*T3*}Modifications et ajouts{*ETW*}{*B*}{*B*} +- Ajout de nouveaux objets : argile durcie, argile colorée, bloc de charbon, botte de foin, rail activateur, bloc de redstone, capteur de lumière, dropper, entonnoir, chariot de mine avec entonnoir, chariot de mine avec TNT, comparateur de redstone, plaque de détection lestée, balise, coffre piégé, fusée d'artifice, étoile à feux d'artifice, étoile du Nether, laisse, caparaçon, étiquette, Å“uf d'apparition de cheval{*B*} +- Ajout de nouveaux monstres et animaux : Wither, Withers squelettes, sorcières, chauves-souris, chevaux, ânes et mules{*B*} +- Ajout de nouvelles fonctions de génération de terrain : cabanes de sorcières.{*B*} +- Ajout d'une interface pour les balises.{*B*} +- Ajout d'une interface pour les chevaux.{*B*} +- Ajout d'une interface pour les entonnoirs.{*B*} +- Ajout de feux d'artifice : l'interface des feux d'artifice est accessible depuis l'atelier, quand vous disposez des ingrédients nécessaires à la fabrication d'une étoile à feux d'artifice ou d'une fusée d'artifice.{*B*} +- Ajout d'un "mode Aventure" : il vous faut les bons outils pour briser les blocs.{*B*} +- Ajout de nouveaux sons en pagaille.{*B*} +- Les monstres, animaux, objets et projectiles peuvent désormais traverser les portails.{*B*} +- Il est maintenant possible de verrouiller les répéteurs en alimentant leurs flancs avec un autre répéteur.{*B*} +- Les zombies et squelettes peuvent maintenant apparaître avec différentes armes et armures.{*B*} +- Nouveaux messages de mort.{*B*} +- Nommez les monstres et animaux à l'aide d'une étiquette et renommez les conteneurs pour modifier leur titre quand le menu est ouvert.{*B*} +- La poudre d'os ne fait plus tout grandir immédiatement à sa taille maximale, mais par étapes aléatoires.{*B*} +- Vous pouvez détecter un signal de redstone décrivant le contenu des coffres, alambics, distributeurs et juke-box en plaçant un comparateur directement devant l'objet en question.{*B*} +- Les distributeurs peuvent être orientés dans toutes les directions.{*B*} +- Si vous mangez une pomme dorée, vous bénéficiez temporairement d'un bonus d'absorption de santé.{*B*} +- Plus vous restez dans une zone, plus les montres qui y apparaissent sont dangereux.{*B*} {*ETB*}Bienvenue ! Comme vous l'avez peut-être déjà remarqué, votre Minecraft vient de bénéficier d'une nouvelle mise à jour.{*B*}{*B*} -Vous et vos amis pouvez découvrir de nombreuses nouvelles fonctionnalités. Jetez un Å“il à l'aperçu qui suit et allez jouer !{*B*}{*B*} -{*T1*}Nouveaux objets{*ETB*} - Émeraude, minerai d'émeraude, bloc d'émeraude, coffre du Néant, crochet, pomme dorée enchantée, enclume, pot de fleurs, murets, murets moussus, peinture de Wither, pomme de terre, pomme de terre cuite, pomme de terre empoisonnée, carotte, carotte dorée, carotte sur un bâton, -tarte à la citrouille, potion de vision nocturne, potion d'invisibilité, quartz du Nether, minerai de quartz du Nether, bloc de quartz, dalle de quartz, escalier en quartz, bloc de quartz taillé, pilier de blocs de quartz, livre enchanté, tapis.{*B*}{*B*} -{*T1*}Nouveaux monstres{*ETB*} - Villageois zombies.{*B*}{*B*} -{*T1*}Nouvelles fonctionnalités{*ETB*} - Commercez avec les villageois, réparez ou enchantez vos armes et outils à l'aide d'une enclume, stockez des objets dans le coffre du Néant, faites du rodéo sur un cochon avec une carotte sur un bâton !{*B*}{*B*} -{*T1*}Nouveaux mini-didacticiels{*ETB*} – Apprenez à utiliser ces nouvelles fonctionnalités dans le monde didacticiel !{*B*}{*B*} -{*T1*}Nouveaux 'Easter Eggs'{*ETB*} – Nous avons modifié l'emplacement de tous les disques vinyles secrets dans le monde didacticiel. Essayez de les retrouver !{*B*}{*B*} +Vous et vos amis pouvez découvrir de nombreuses nouvelles fonctionnalités. Jetez un Å“il à l'aperçu qui suit et amusez-vous bien !{*B*}{*B*} +{*T1*}Nouveaux objets{*ETB*} : argile durcie, argile colorée, bloc de charbon, botte de foin, rail activateur, bloc de redstone, capteur de lumière, dropper, entonnoir, chariot de mine avec entonnoir, chariot de mine avec TNT, comparateur de redstone, plaque de détection lestée, balise, coffre piégé, fusée d'artifice, étoile à feux d'artifice, étoile du Nether, laisse, caparaçon, étiquette, Å“uf d'apparition de cheval{*B*}{*B*} +{*T1*}Nouveaux monstres et animaux{*ETB*} : Wither, Withers squelettes, sorcières, chauves-souris, chevaux, ânes et mules{*B*}{*B*} +{*T1*}Nouvelles fonctions{*ETB*} : domptez et montez un cheval, fabriquez des feux d'artifice et assurez le spectacle, nommez les animaux et monstres à l'aide d'une étiquette, créez des circuits de redstone plus complexes et accédez en tant qu'hôte à de nouvelles options pour mieux contrôler les actions de vos visiteurs !{*B*}{*B*} +{*T1*}Nouveau monde didacticiel{*ETB*} : découvrez comment utiliser les fonctions existantes et nouvelles dans le monde didacticiel. Arriverez-vous à trouver tous les disques vinyles qui s'y cachent ?{*B*}{*B*} +Chevaux + +{*T3*}COMMENT JOUER : CHEVAUX{*ETW*}{*B*}{*B*} +C'est surtout dans les plaines que l'on trouve des chevaux et des ânes. En croisant ces deux espèces, on obtient une mule, mais celle-ci ne peut pas avoir de descendance.{*B*} +Vous pouvez monter tous les chevaux, ânes et mules adultes. En revanche, seuls les chevaux peuvent porter une armure (appelée caparaçon), alors que les ânes et les mules peuvent être équipés de sacoches pour transporter des objets.{*B*}{*B*} +Avant de pouvoir utiliser un cheval, un âne ou une mule, il faut le dompter. Un cheval se dompte en essayant de monter dessus et de vous y maintenir pendant qu'il tente de vous désarçonner.{*B*} +Quand des cÅ“urs apparaissent autour du cheval, c'est que vous l'avez dompté : il n'essaiera plus de vous désarçonner. Pour diriger un cheval, vous devez l'équiper d'une selle.{*B*}{*B*} +Vous pouvez trouver des selles auprès des villageois ou dans les coffres cachés dans l'environnement.{*B*} +Un âne ou une mule dompté peut être équipé d'une sacoche en lui associant un coffre. Vous pourrez ensuite accéder à cette sacoche en vous faufilant devant l'animal ou en le chevauchant.{*B*}{*B*} +Les chevaux et les ânes (mais pas les mules) s'élèvent comme les autres animaux, à l'aide de pommes dorées ou de carottes dorées.{*B*} +Les poulains deviennent adultes au fil du temps, mais vous pouvez accélérer le processus en leur donnant du blé ou du foin à manger.{*B*} + + +Balises + +{*T3*}COMMENT JOUER : BALISES{*ETW*}{*B*}{*B*} +Les balises actives projettent un intense rayon de lumière dans le ciel et octroient des pouvoirs aux joueurs avoisinants.{*B*} +Vous pouvez les fabriquer à l'aide de verre, d'obsidienne et d'étoiles du Nether, qui s'obtiennent en terrassant le Wither.{*B*}{*B*} +Une balise doit être placée au sommet d'une pyramide de fer, d'or, d'émeraude ou de diamant, et doit pouvoir recevoir la lumière du soleil le jour.{*B*} +Le matériau sur lequel la balise est placée n'a aucun effet sur son pouvoir.{*B*}{*B*} +Ouvrez le menu de la balise pour sélectionner son pouvoir principal. Plus votre pyramide a d'étages, plus il y a de pouvoirs disponibles.{*B*} +Une balise sur une pyramide d'au moins quatre étages dispose en outre d'un pouvoir secondaire (Régénération), ou d'un pouvoir principal plus puissant.{*B*}{*B*} +Pour définir les pouvoirs de votre balise, vous devez sacrifier un lingot d'émeraude, de diamant, d'or ou de fer dans l'emplacement de paiement.{*B*} +Cela fait, la balise restera active indéfiniment.{*B*} + + +Feux d'artifice + +{*T3*}COMMENT JOUER : FEUX D'ARTIFICE{*ETW*}{*B*}{*B*} +Les feux d'artifice sont des objets décoratifs pouvant être lancés à la main ou depuis un distributeur. Ils se fabriquent à l'aide de papier, de poudre à canon et (facultatif) de plusieurs étoiles à feux d'artifice.{*B*} +En ajoutant des ingrédients supplémentaires lors de la fabrication, vous pouvez personnaliser les étoiles à feux d'artifice : couleurs, disparition, forme, taille et effets (traînée, scintillement, etc.).{*B*}{*B*} +Pour fabriquer un feu d'artifice, placez de la poudre à canon et du papier dans la grille d'artisanat 3x3 qui s'affiche au-dessus de votre inventaire.{*B*} +Vous pouvez aussi placer plusieurs étoiles à feux d'artifice dans la grille d'artisanat pour les ajouter au feu d'artifice.{*B*} +Plus il y a de cases contenant de la poudre à canon dans la grille d'artisanat, plus les étoiles à feux d'artifice explosent haut.{*B*}{*B*} +Vous pouvez ensuite récupérer le feu d'artifice terminé dans la case de résultat.{*B*}{*B*} +Vous pouvez fabriquer une étoile à feux d'artifice en plaçant de la poudre à canon et un colorant dans la grille d'artisanat.{*B*} + - Ce colorant définit la couleur que prend l'étoile à feux d'artifice en explosant.{*B*} + - Pour définir la forme de l'étoile à feux d'artifice, ajoutez une boule de feu, une pépite d'or, une plume ou un crâne de monstre.{*B*} + - Pour ajouter une traînée ou un scintillement, utilisez des diamants ou de la poudre glowstone.{*B*}{*B*} +Après avoir fabriqué une étoile à feux d'artifice, vous pouvez définir sa couleur de disparition en lui ajoutant un colorant. + + +Entonnoirs + +{*T3*}COMMENT JOUER : ENTONNOIRS{*ETW*}{*B*}{*B*} +Les entonnoirs servent à insérer ou retirer des objets d'un conteneur et à ramasser automatiquement les objets qu'on y jette.{*B*} +Ils peuvent interagir avec les alambics, les coffres, les distributeurs, les droppers, les chariots de mine avec coffre, les chariots de mine avec entonnoir, et d'autres entonnoirs.{*B*}{*B*} +Un entonnoir cherche en permanence à aspirer les objets d'un conteneur compatible placé au-dessus. Il tente également d'insérer les objets stockés dans un conteneur de destination.{*B*} +Si un entonnoir est alimenté par un bloc de redstone, il devient inactif et arrête à la fois d'aspirer et d'insérer.{*B*}{*B*} +Un entonnoir est orienté dans la direction vers laquelle il essaie d'insérer des objets. Pour l'orienter vers un bloc précis, placez-le contre ce bloc tout en vous faufilant.{*B*} + + +Droppers + +{*T3*}COMMENT JOUER : DROPPERS{*ETW*}{*B*}{*B*} +Quand un dropper est alimenté par la redstone, il dépose au sol un unique objet aléatoire qu'il contient. Utilisez {*CONTROLLER_ACTION_USE*} pour ouvrir le dropper, après quoi vous pouvez y insérer des objets de votre inventaire.{*B*} +Si le dropper fait face à un coffre ou tout autre conteneur, l'objet sera transféré dedans. Il est possible de construire de longues chaînes de droppers pour transporter des objets en les allumant et éteignant à tour de rôle. + + Inflige plus de dégâts qu'à mains nues. Sert à pelleter la terre, l'herbe, le sable, le gravier et la neige plus vite qu'à mains nues. Vous devrez posséder une pelle pour creuser les boules de neige. @@ -609,13 +664,39 @@ La couleur des lits est toujours la même. Tenue en main, la carte crée l'image d'une zone explorée. Peut servir à la détermination d'un trajet. +Si vous utilisez cet objet, il devient une carte de la zone géographique dans laquelle vous vous trouvez et se remplit au fur et à mesure de votre exploration. + Permet d'attaquer à distance à l'aide de flèches. Sert de munitions pour les arcs. +Produite par le Wither, sert à fabriquer des balises. + +Crée des explosions colorées après activation. La couleur, l'effet, la forme et la disparition dépendent de l'étoile à feux d'artifice utilisée pour créer le feu d'artifice. + +Détermine la couleur, l'effet et la forme d'un feu d'artifice. + +À utiliser dans un circuit de redstone pour entretenir, comparer ou réduire la force du signal, ou encore mesurer l'état de blocs précis. + +Type de chariot de mine qui se comporte comme un bloc de TNT mobile. + +Bloc qui émet un signal de redstone selon l'ensoleillement (ou le manque d'ensoleillement). + +Type de chariot de mine spécial qui se comporte comme un entonnoir. Il connecte les objets sur le rail et les conteneurs au-dessus. + +Type d'armure spécial pour chevaux. Confère une armure de 5. + +Type d'armure spécial pour chevaux. Confère une armure de 7. + +Type d'armure spécial pour chevaux. Confère une armure de 11. + +Sert à tenir les monstres en laisse ou à les attacher à un piquet de barrière. + +Sert à nommer les monstres dans le monde. + Restitue 2,5{*ICON_SHANK_01*}. -Restitue 1{*ICON_SHANK_01*}.. Peut s'utiliser jusqu'à 6 fois. +Restitue 1{*ICON_SHANK_01*}. Peut s'utiliser jusqu'à 6 fois. Restitue 1{*ICON_SHANK_01*}. @@ -938,100 +1019,158 @@ Remarque : vous pouvez aussi combiner colorant gris et poudre d'os pour en produ Les crânes peuvent servir de décoration ou être portés comme masques dans l'emplacement pour le casque. +Sert à exécuter un ordre. + +Projette un rayon de lumière dans le ciel et peut octroyer des altérations aux joueurs avoisinants. + +Permet d'entreposer des blocs et objets. Placez deux coffres côte à côte pour former un grand coffre à la capacité doublée. Le coffre piégé crée en outre une charge de redstone à l'ouverture. + +Fournit une charge de redstone. Plus il y a d'objets sur la plaque, plus la charge est puissante. + +Fournit une charge de redstone. Plus il y a d'objets sur la plaque, plus la charge est puissante. Nécessite plus de poids que la plaque légère. + +Source d'alimentation de redstone. Peut être retransformé en redstone. + +Sert à intercepter des objets ou à en transférer depuis un conteneur vers un autre. + +Type de rail permettant d'activer ou de désactiver les chariots de mine avec entonnoir, ou encore de déclencher les chariots de mine avec du TNT. + +Sert à entreposer et distribuer des objets, ou à les pousser vers un autre conteneur, lorsqu'on lui applique une charge de redstone. + +Des blocs colorés en argile durcie puis teinte. + +Nourriture pour chevaux, ânes et mules qui restitue jusqu'à 10 cÅ“urs. Accélère la croissance des poulains. + +Obtenue en fondant de l'argile dans un four. + +Mélange de verre et d'un colorant. + +Panneau de verre coloré. + +Un moyen peu encombrant d'entreposer du charbon. Peut servir de combustible dans un four. + Pieuvre - + Produit une poche d'encre une fois tuée. - + Vache - + Produit du cuir une fois tuée. Utilisez un seau pour la traire. - + Mouton - + Produit de la laine dès qu'il est tondu (s'il ne l'a pas déjà été). Utilisez un colorant pour changer la couleur de sa laine. - + Poulet - + Produit des plumes une fois tué ; pond aussi des Å“ufs, à l'occasion. - + Cochon - + Produit de la viande de porc une fois tué. Utilisez une selle pour le chevaucher. - + Loup - + Inoffensif à moins d'être attaqué : il n'hésitera pas à riposter. Utilisez des os pour le domestiquer : le loup vous suivra et s'en prendra à tous vos assaillants. - + Creeper - + Explose si vous l'approchez de trop près ! - + Squelette - + Vous décoche des flèches. Produit des flèches une fois tué. - + Araignée - + Attaque dès que vous approchez. Peut escalader les murs. Produit du fil une fois tuée. - + Zombie - + Attaque dès que vous approchez. - + Cochon zombie - + Inoffensifs de nature, ils vous attaqueront en groupe si vous vous en prenez à l'un d'entre eux. - + Ghast - + Décoche des boules de feu qui explosent à l'impact. - + Slime - + Se divise en plusieurs slimes plus petits dès qu'il est touché. - + Enderman - + Vous attaquera si vous le regardez. Peut aussi déplacer des blocs. - + Poisson d'argent - + Attire les poissons d'argent tapis à proximité si vous l'attaquez. Se cache dans les blocs de pierre. - + Araignée bleue - + Sa morsure est empoisonnée. - + Champimeuh - + Combiné à un bol, sert à la préparation de ragoûts de champignons. Produit des champignons et devient une vache normale une fois tondue. - + Golem de neige - + Le Golem de neige se crée en combinant des blocs de neige et une citrouille. Ils lancent des boules de neige sur les ennemis de leur créateur. - + Dragon de l'Ender - + Un colossal dragon noir qu'on rencontre dans l'Ender. - + Blaze - + Des ennemis qu'on croise dans le Nether, surtout dans les forteresses du Nether. Ils produisent des bâtons de feu une fois tués. - + Cube de magma - + On les rencontre dans le Nether. De même que les Slimes, ils se scindent en plusieurs cubes plus petits dès qu'ils sont tués. - + Villageois - + Ocelot - + Se trouve dans la jungle. Peut être dompté en le nourrissant de poisson cru. Vous devrez cependant laisser l'ocelot vous approcher, tout mouvement brusque le fera fuir. - + Golem de fer - + Apparaît dans les villages pour les protéger et peut être créé à partir de blocs de fer et de citrouilles. - + +Chauve-souris + +Ces créatures volantes habitent les cavernes et autres grands espaces fermés. + +Sorcière + +Ces ennemis des marécages vous attaquent en lançant des potions, et en abandonnent aussi à leur mort. + +Cheval + +Vous pouvez monter ces animaux, à condition de les dompter d'abord. + +Âne + +Vous pouvez monter ces animaux, à condition de les dompter d'abord. Il est possible de leur associer un coffre. + +Mule + +Croisement entre un cheval et un âne. Vous pouvez monter ces animaux, à condition de les dompter d'abord. Ils peuvent aussi porter des sacoches. + +Cheval zombie + +Cheval squelette + +Wither + +Il vous faut des crânes de Wither et du sable des âmes pour créer ce monstre, qui vous attaque en tirant des crânes explosifs. + Explosives Animator Concept Artist @@ -1378,6 +1517,8 @@ Remarque : vous pouvez aussi combiner colorant gris et poudre d'os pour en produ Carte +Carte vide + Disque vinyle "13" Disque vinyle "cat" @@ -1480,6 +1621,28 @@ Remarque : vous pouvez aussi combiner colorant gris et poudre d'os pour en produ Crâne de creeper +Étoile du Nether + +Fusée d'artifice + +Étoile à feux d'artifice + +Comparateur de redstone + +Chariot de mine avec TNT + +Chariot de mine avec entonnoir + +Caparaçon en fer + +Caparaçon en or + +Caparaçon en diamant + +Plomb + +Étiquette + Pierre Bloc d'herbe @@ -1496,6 +1659,8 @@ Remarque : vous pouvez aussi combiner colorant gris et poudre d'os pour en produ Planches de bois tropical +Planches de bois (tout type) + Pousse d'arbre Pousse de chêne @@ -1832,6 +1997,190 @@ Remarque : vous pouvez aussi combiner colorant gris et poudre d'os pour en produ Crâne +Bloc de commande + +Balise + +Coffre piégé + +Plaque de détection lestée (légère) + +Plaque de détection lestée (lourde) + +Comparateur de redstone + +Capteur de lumière + +Bloc de redstone + +Entonnoir + +Rail activateur + +Dropper + +Argile colorée + +Botte de foin + +Argile durcie + +Bloc de charbon + +Argile noire + +Argile rouge + +Argile verte + +Argile marron + +Argile bleue + +Argile violette + +Argile cyan + +Argile gris clair + +Argile grise + +Argile rose + +Argile vert clair + +Argile jaune + +Argile bleu ciel + +Argile magenta + +Argile orange + +Argile blanche + +Verre coloré + +Verre gris + +Verre rouge + +Verre vert + +Verre marron + +Verre bleu + +Verre violet + +Verre cyan + +Verre gris clair + +Verre gris + +Verre rose + +Verre vert clair + +Verre jaune + +Verre bleu ciel + +Verre magenta + +Verre orange + +Verre blanc + +Vitrail + +Vitrail gris + +Vitrail rouge + +Vitrail vert + +Vitrail marron + +Vitrail bleu + +Vitrail violet + +Vitrail cyan + +Vitrail gris clair + +Vitrail gris + +Vitrail rose + +Vitrail vert clair + +Vitrail jaune + +Vitrail bleu ciel + +Vitrail magenta + +Vitrail orange + +Vitrail blanc + +Petite boule + +Grande boule + +Étoile + +Creeper + +Explosion + +Forme inconnue + +Noir + +Rouge + +Vert + +Marron + +Bleu + +Violet + +Cyan + +Gris clair + +Gris + +Rose + +Vert clair + +Jaune + +Bleu ciel + +Magenta + +Orange + +Blanc + +Perso. + +Dégradé + +Scintillement + +Traînée + +Durée du vol : +  Commandes actuelles Config. @@ -2009,8 +2358,7 @@ La nuit, les monstres sont de sortie ; tâchez donc d'aménager un abri avant l Voici votre inventaire. Il affiche les objets susceptibles d'être tenus en main ainsi que tous les autres objets que vous portez, armure comprise. - - + {*B*} Appuyez sur{*CONTROLLER_VK_A*} pour continuer.{*B*} Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser l'inventaire. @@ -2031,7 +2379,7 @@ La nuit, les monstres sont de sortie ; tâchez donc d'aménager un abri avant l - Si vous voulez en savoir plus sur un objet, déplacez le pointeur sur l'objet en question et appuyez sur{*CONTROLLER_VK_RT*}. + Si vous voulez en savoir plus sur un objet, déplacez le pointeur sur l'objet en question et appuyez sur{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. @@ -2065,7 +2413,7 @@ La nuit, les monstres sont de sortie ; tâchez donc d'aménager un abri avant l - Si vous voulez en savoir plus sur un objet, déplacez le pointeur sur l'objet en question et appuyez sur{*CONTROLLER_VK_RT*}. + Si vous voulez en savoir plus sur un objet, déplacez le pointeur sur l'objet en question et appuyez sur{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. @@ -2612,6 +2960,211 @@ En mode Vol, maintenez{*CONTROLLER_ACTION_JUMP*} pour monter et{*CONTROLLER_ACTI Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà tout ce qu'il y a à savoir sur la barre de nourriture et les aliments. + + Voici l'interface d'inventaire du cheval. + + + + {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour continuer. + {*B*}Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser l'inventaire du cheval. + + + + L'inventaire du cheval vous permet de transférer des objets ou d'en équiper votre cheval, âne ou mule. + + + + Sellez votre cheval en plaçant une selle dans l'emplacement à cet effet. Vous pouvez aussi l'équiper d'une armure en plaçant un caparaçon dans l'emplacement d'armure. + + + + Ce menu permet aussi de transférer des objets de votre inventaire vers les sacoches de votre âne ou mule, et vice versa. + + +Vous avez trouvé un cheval. + +Vous avez trouvé un âne. + +Vous avez trouvé une mule. + + + {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les chevaux, ânes et mules. + {*B*}Appuyez sur{*CONTROLLER_VK_B*} si vous n'avez plus rien à apprendre sur la question. + + + + C'est surtout dans les plaines et la savane que l'on trouve des chevaux et des ânes. En croisant ces deux espèces, on obtient une mule, mais celle-ci ne peut pas avoir de descendance. + + + + Vous pouvez monter tous les chevaux, ânes et mules adultes. En revanche, seuls les chevaux peuvent porter une armure (appelée caparaçon), alors que les ânes et les mules peuvent être équipés de sacoches pour transporter des objets. + + + + Avant de pouvoir utiliser un cheval, un âne ou une mule, il faut le dompter. Un cheval se dompte en essayant de monter dessus et de vous y maintenir pendant qu'il tente de vous désarçonner. + + + + Quand des cÅ“urs apparaissent autour du cheval, c'est que vous l'avez dompté : il n'essaiera plus de vous désarçonner. + + + + Essayez de monter ce cheval. Utilisez {*CONTROLLER_ACTION_USE*} sans objet ni outil en main pour le chevaucher. + + + + Pour diriger un cheval, vous devez l'équiper d'une selle que vous trouverez auprès des villageois, en pêchant, ou dans les coffres cachés à travers l'environnement. + + + + Un âne ou une mule dompté peut être équipé d'une sacoche en lui associant un coffre. Vous pourrez ensuite accéder à cette sacoche en vous faufilant devant l'animal ou en le chevauchant. + + + + Les chevaux et les ânes (mais pas les mules) s'élèvent comme les autres animaux, à l'aide de pommes dorées ou de carottes dorées. Les poulains deviennent adultes au fil du temps, mais vous pouvez accélérer le processus en leur donnant du blé ou du foin à manger. + + + + Vous pouvez essayer de dompter les chevaux et les ânes ici. Les coffres des environs contiennent également des selles, caparaçons et autres objets utiles pour chevaux. + + + + Vous êtes dans l'interface de la balise, qui vous permet de choisir les pouvoirs qu'octroiera votre balise. + + + + {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour continuer. + {*B*}Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser cet inventaire. + + + + Le menu de la balise vous permet de sélectionner son pouvoir principal. Plus votre pyramide a d'étages, plus il y a de pouvoirs disponibles. + + + + Une balise sur une pyramide d'au moins quatre étages dispose d'un pouvoir secondaire (Régénération), ou d'un pouvoir principal plus puissant. + + + + Pour définir les pouvoirs de votre balise, vous devez sacrifier un lingot d'émeraude, de diamant, d'or ou de fer dans l'emplacement de paiement. Cela fait, la balise restera active indéfiniment. + + +Cette pyramide est surmontée d'une balise inactive. + + + {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les balises. + {*B*}Appuyez sur{*CONTROLLER_VK_B*} si vous n'avez plus rien à apprendre sur la question. + + + + Les balises actives projettent un intense rayon de lumière dans le ciel et octroient des pouvoirs aux joueurs avoisinants. Vous pouvez les fabriquer à l'aide de verre, d'obsidienne et d'étoiles du Nether, qui s'obtiennent en terrassant le Wither. + + + + Une balise doit être placée au sommet d'une pyramide de fer, d'or, d'émeraude ou de diamant, et doit pouvoir recevoir la lumière du soleil le jour. Le matériau sur lequel la balise est placée n'a aucun effet sur son pouvoir. + + + + Essayez d'utiliser la balise pour définir ses pouvoirs. Vous pouvez utiliser en guise de paiement les lingots de fer fournis. + + +Cette pièce contient des entonnoirs. + + + {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les entonnoirs. + {*B*}Appuyez sur{*CONTROLLER_VK_B*} si vous n'avez plus rien à apprendre sur la question. + + + + Les entonnoirs servent à insérer ou retirer des objets d'un conteneur et à ramasser automatiquement les objets qu'on y jette. + + + + Ils peuvent interagir avec les alambics, les coffres, les distributeurs, les droppers, les chariots de mine avec coffre, les chariots de mine avec entonnoir, et d'autres entonnoirs. + + + + Un entonnoir cherche en permanence à aspirer un objet d'un conteneur compatible placé au-dessus. Il tente également d'insérer les objets stockés dans un conteneur de destination. + + + + Si un entonnoir est alimenté par un bloc de redstone, il devient inactif et arrête à la fois d'aspirer et d'insérer. + + + + Un entonnoir est orienté dans la direction vers laquelle il essaie d'insérer des objets. Pour l'orienter vers un bloc précis, placez-le contre ce bloc tout en vous faufilant. + + + + Cette salle contient diverses configurations d'entonnoirs qui méritent d'être étudiées et testées. + + + + Vous êtes dans l'interface des feux d'artifice, qui vous permet de fabriquer des feux d'artifice et des étoile à feux d'artifice. + + + + {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour continuer. + {*B*}Appuyez sur{*CONTROLLER_VK_B*} si vous savez déjà utiliser cet inventaire. + + + + Pour fabriquer un feu d'artifice, placez de la poudre à canon et du papier dans la grille d'artisanat 3x3 qui apparaît au-dessus de votre inventaire. + + + + Facultatif : vous pouvez placer plusieurs étoiles à feux d'artifice dans la grille d'artisanat pour les ajouter au feu d'artifice. + + + + Plus il y a de cases contenant de la poudre à canon dans la grille d'artisanat, plus les étoiles à feux d'artifice explosent haut. + + + + Vous pouvez ensuite récupérer le feu d'artifice terminé dans la case de résultat. + + + + Vous pouvez fabriquer une étoile à feux d'artifice en plaçant de la poudre à canon et un colorant dans la grille d'artisanat. + + + + Ce colorant définit la couleur que prend l'étoile à feux d'artifice en explosant. + + + + Pour définir la forme de l'étoile à feux d'artifice, ajoutez une boule de feu, une pépite d'or, une plume ou un crâne. + + + + Pour ajouter une traînée ou un scintillement, utilisez des diamants ou de la poudre glowstone. + + + + Après avoir fabriqué une étoile à feux d'artifice, vous pouvez définir sa couleur de disparition en lui ajoutant un colorant. + + + + Les coffres des environs contiennent divers objets servant à créer des FEUX D'ARTIFICE ! + + + + {*B*}Appuyez sur{*CONTROLLER_VK_A*} pour en savoir plus sur les feux d'artifice. + {*B*}Appuyez sur{*CONTROLLER_VK_B*} si vous n'avez plus rien à apprendre sur la question. + + + + Les feux d'artifice sont des objets décoratifs pouvant être lancés à la main ou depuis un distributeur. Ils se fabriquent à l'aide de papier, de poudre à canon et (facultatif) de plusieurs étoiles à feux d'artifice. + + + + En ajoutant des ingrédients supplémentaires lors de la fabrication, vous pouvez personnaliser les étoiles à feux d'artifice : couleurs, disparition, forme, taille et effets (traînée, scintillement, etc.). + + + + Essayez de fabriquer un feu d'artifice à l'atelier en combinant les ingrédients que contiennent les coffres. + +  Sélectionner Utiliser @@ -2834,6 +3387,22 @@ En mode Vol, maintenez{*CONTROLLER_ACTION_JUMP*} pour monter et{*CONTROLLER_ACTI Charger la sauvegarde pour Xbox One +Monter + +Descendre + +Associer un coffre + +Lancer + +Tenir en laisse + +Lâcher + +Fixer + +Nom + O.K. Annuler @@ -3144,6 +3713,20 @@ Voulez-vous déverrouiller le jeu complet ? Distributeur +Cheval + +Dropper + +Entonnoir + +Balise + +Pouvoir principal + +Pouvoir secondaire + +Chariot de mine + Aucun contenu téléchargeable de ce type n'est actuellement disponible pour ce jeu. %s a rejoint la partie. @@ -3303,10 +3886,14 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Mode de jeu : Créatif +Mode de jeu : Aventure + Survie Créatif +Aventure + Créé en mode Survie Créé en mode Créatif @@ -3327,6 +3914,8 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Superplat +Saisissez une valeur initiale pour générer à nouveau le même terrain. Champ vide = monde aléatoire. + Une fois activé, le jeu sera un jeu en ligne. Une fois activé, seuls les joueurs invités peuvent participer. @@ -3343,7 +3932,7 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Cette option permet à l'hôte d'activer sa capacité à voler et à se rendre un invisible, et de désactiver la fatigue. Elle désactive la mise à jour des succès et classements. -Si vous l'activez, le Nether sera régénéré. Très utile si vous avez une ancienne sauvegarde où les forteresses du Nether ne sont pas présentes. +Activé, le Nether se régénérera. Utile si vous avez une ancienne sauvegarde sans forteresse du Nether. Lorsque cette option est activée, les structures comme les villages et les forts apparaîtront dans le monde. @@ -3351,6 +3940,20 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Lorsque cette option est activée, un coffre renfermant des objets utiles sera créé à proximité du point d'apparition du joueur. +Si vous désactivez cette option, les monstres et animaux ne peuvent ni modifier des blocs (par exemple, les explosions des creepers ne détruisent pas les blocs et les moutons ne retirent pas d'herbe), ni ramasser des objets. + +Si vous activez cette option, les joueurs conservent leur inventaire après leur mort. + +Si vous désactivez cette option, les monstres n'apparaissent pas automatiquement. + +Si vous désactivez cette option, les monstres et animaux ne laissent pas d'objets (par exemple, les creepers ne laissent pas de poudre à canon). + +Si vous désactivez cette option, les blocs ne laissent pas d'objets après être détruits (par exemple, les blocs de pierre ne laissent pas de pierre taillée). + +Si vous désactivez cette option, les joueurs ne regagnent pas leur santé automatiquement. + +Si vous désactivez cette option, le moment de la journée ne change pas. + Packs de skins Thèmes @@ -3399,7 +4002,49 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? {*PLAYER*} s'est fait rouer de coups par {*SOURCE*} -{*PLAYER*} s'est fait tuer par {*SOURCE*} +{*SOURCE*} a tué {*PLAYER*} par magie + +{*PLAYER*} a chuté d'une échelle + +{*PLAYER*} a chuté d'une liane + +{*PLAYER*} a chuté hors de l'eau + +{*PLAYER*} a chuté d'un endroit élevé + +{*PLAYER*} s'est fait pousser par {*SOURCE*} + +{*PLAYER*} s'est fait pousser par {*SOURCE*} + +{*PLAYER*} s'est fait pousser par {*SOURCE*} avec {*ITEM*} + +Après une lourde chute, {*SOURCE*} a achevé {*PLAYER*} + +Après une lourde chute, {*SOURCE*} a achevé {*PLAYER*} avec {*ITEM*} + +{*PLAYER*} a marché dans le feu tout en combattant {*SOURCE*} + +{*PLAYER*} s'est fait carboniser tout en combattant {*SOURCE*} + +{*PLAYER*} a piqué une tête dans la lave pour échapper à {*SOURCE*} + +{*PLAYER*} a péri par noyade en tentant d'échapper à {*SOURCE*} + +{*PLAYER*} a percuté un cactus en tentant d'échapper à {*SOURCE*} + +{*PLAYER*} s'est fait exploser par {*SOURCE*} + +{*PLAYER*} s'est fait Witherifier + +{*PLAYER*} s'est fait occire par {*SOURCE*} avec {*ITEM*} + +{*PLAYER*} s'est fait tirer dessus par {*SOURCE*} avec {*ITEM*} + +{*PLAYER*} a encaissé une boule de feu décochée par {*SOURCE*} avec {*ITEM*} + +{*PLAYER*} s'est fait rouer de coups par {*SOURCE*} avec {*ITEM*} + +{*PLAYER*} s'est fait tuer par {*SOURCE*} avec {*ITEM*} Brouillard d'adminium @@ -3413,7 +4058,7 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Personnage animé -Animations personnalisée pour skin +Anim. pers. pour skin Vous ne pouvez plus miner ou utiliser d'objet @@ -3566,9 +4211,9 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Ne pas réinitialiser le Nether -Pas de tonte de champimeuh pour le moment. Le nombre max de cochons, moutons, vaches et chats a été atteint. +Pas de tonte de champimeuh pour le moment. Le nombre max de cochons, moutons, vaches chats et chevaux a été atteint. -Impossible d'utiliser l'Å“uf d'apparition pour le moment. Vous avez atteint le nombre maximum de cochons, moutons, vaches et chats. +Impossible d'utiliser l'Å“uf d'apparition pour le moment. Vous avez atteint le nombre maximum de cochons, moutons, vaches, chats et chevaux. Impossible d'utiliser l'Å“uf d'apparition pour le moment. Vous avez atteint le nombre maximum de champimeuh. @@ -3578,6 +4223,8 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Impossible d'utiliser l'Å“uf d'apparition pour le moment. Vous avez atteint le nombre maximum de pieuvres dans un monde. +Impossible d'utiliser l'Å“uf d'apparition pour le moment. Vous avez atteint le nombre maximum de chauves-souris dans un monde. + Impossible d'utiliser un Å“uf d'apparition pour le moment. Le nombre maximum d'ennemis dans un monde a été atteint. Impossible d'utiliser un Å“uf d'apparition pour le moment. Le nombre maximum de villageois dans un monde a été atteint. @@ -3586,12 +4233,14 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Vous ne pouvez pas faire apparaître des ennemis en mode Paisible. -Cet animal ne peut pas entrer en mode amour. Le nombre maximum de cochons, moutons, vaches et chats en cours d'élevage a été atteint. +Cet animal ne peut pas entrer en mode amour. Le nombre maximum de cochons, moutons, vaches, chats et chevaux en cours d'élevage a été atteint. Cet animal ne peut pas entrer en mode amour. Le nombre maximum de loups en cours d'élevage a été atteint. Cet animal ne peut pas entrer en mode amour. Le nombre maximum de poulets en cours d'élevage a été atteint. +Cet animal ne peut pas entrer en mode amour. Le nombre maximum de chevaux en cours d'élevage a été atteint. + Cet animal ne peut pas entrer en mode amour. Nbre max de champimeuh élevés atteint. Le nombre maximum de bateaux dans un monde a été atteint. @@ -3619,27 +4268,43 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ?Crédits Réinstaller le contenu - + Debug Settings - + Propagation du feu - + Explosion de TNT - + PvP - + Joueurs de confiance - + Privilèges d'hôte - + Génération de structures - + Monde superplat - + Coffre bonus - + Options mondiales - + +Options du joueur + +Ingérence des monstres + +Conservation d'inventaire + +Apparition des monstres + +Butin des monstres + +Butin des blocs + +Régénération auto + +Cycle jour/nuit + Peut construire et miner Utilisation de portes et leviers possible @@ -3648,7 +4313,7 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Peut attaquer les joueurs -Attaque d'animaux possible +Peut attaquer les animaux Modérateur @@ -3826,6 +4491,14 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Poison +Wither + +Boost de santé + +Absorption + +Saturation + de rapidité de lenteur @@ -3864,6 +4537,14 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? de poison +de flétrissure + +de boost de santé + +d'absorption + +de saturation + II @@ -3960,6 +4641,22 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Réduit progressivement la santé des joueurs, animaux et monstres affectés. +À l'application : + +Force de saut du cheval + +Renforts zombies + +Santé max + +Portée d'aggro + +Résistance au recul + +Vitesse + +Dégâts d'attaque + Tranchant Châtiment @@ -4050,7 +4747,7 @@ Voulez-vous installer le pack mash-up ou le pack de textures maintenant ? Restitue 3{*ICON_SHANK_01*}. Obtenu en cuisinant une pomme de terre dans un four. -Restitue 1{*ICON_SHANK_01*} mais peut vous empoisonner. À cuire dans un four ou planter dans une terre labourée. +Restitue 1{*ICON_SHANK_01*} mais peut vous rendre malade. Restitue 3{*ICON_SHANK_01*}. Se fabrique avec une carotte et des pépites d'or. diff --git a/Minecraft.Client/Common/Media/it-IT/strings.resx b/Minecraft.Client/Common/Media/it-IT/strings.resx index 8082dfdc..6eb30dc3 100644 --- a/Minecraft.Client/Common/Media/it-IT/strings.resx +++ b/Minecraft.Client/Common/Media/it-IT/strings.resx @@ -300,6 +300,27 @@ Quando carichi o crei un mondo, se premi il pulsante "Altre opzioni" accederai a {*T2*}Privilegi dell'host{*ETW*}{*B*} Se l'opzione è abilitata, l'host, tramite il menu di gioco, può attivare o disattivare la possibilità di volare, disabilitare la stanchezza e rendersi invisibile. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + {*T2*}Ciclo giorno/notte{*ETW*}{*B*} + Se disattivato, l'ora del giorno non cambia.{*B*}{*B*} + + {*T2*}Mantieni inventario{*ETW*}{*B*} + Se attivato, i giocatori mantengono l'inventario quando muoiono.{*B*}{*B*} + + {*T2*}Generazione mostri{*ETW*}{*B*} + Se disattivata, i mostri non vengono generati naturalmente.{*B*}{*B*} + + {*T2*}Immutabilità{*ETW*}{*B*} + Se disattivata, impedisce a mostri e animali di modificare i blocchi (per esempio, le esplosioni dei creeper non distruggono i blocchi e le pecore non brucano l'erba) o raccogliere oggetti.{*B*}{*B*} + + {*T2*}Bottino mostri{*ETW*}{*B*} + Se disattivato, mostri e animali non rilasciano bottino (per esempio, i creeper non rilasciano polvere da sparo).{*B*}{*B*} + + {*T2*}Rilascio blocchi{*ETW*}{*B*} + Se disattivato, i blocchi non rilasciano oggetti quando vengono distrutti (per esempio, i blocchi di pietra non rilasciano ciottoli).{*B*}{*B*} + + {*T2*}Rigenerazione naturale{*ETW*}{*B*} + Se disattivata, la salute dei giocatori non si rigenera naturalmente.{*B*}{*B*} + {*T1*}Opzioni di generazione del mondo{*ETW*}{*B*} Quando crei un nuovo mondo, sono disponibili alcune opzioni aggiuntive.{*B*}{*B*} @@ -316,7 +337,7 @@ Quando crei un nuovo mondo, sono disponibili alcune opzioni aggiuntive.{*B*}{*B* Quando è attivato, il Sottomondo sarà rigenerato. Questa funzionalità può essere molto utile se hai dei vecchi salvataggi in cui le Fortezze del Sottomondo non erano presenti.{*B*}{*B*} {*T1*}Opzioni di gioco{*ETW*}{*B*} - Durante la partita, premi BACK per aprire il menu di gioco, dove potrai accedere a diverse opzioni.{*B*}{*B*} + Durante la partita, premi{*BACK_BUTTON*}per aprire il menu di gioco, dove potrai accedere a diverse opzioni.{*B*}{*B*} {*T2*}Opzioni host{*ETW*}{*B*} L'host e tutti i giocatori identificati come moderatori possono accedere al menu "Opzioni host", nel quale avranno la possibilità di abilitare o disabilitare le opzioni "Diffusione incendio" ed "Esplosione TNT".{*B*}{*B*} @@ -325,42 +346,44 @@ Quando crei un nuovo mondo, sono disponibili alcune opzioni aggiuntive.{*B*}{*B* Per modificare i privilegi di un giocatore, seleziona il suo nome e premi{*CONTROLLER_VK_A*} per accedere al menu dei privilegi del giocatore, dove potrai agire sulle seguenti opzioni.{*B*}{*B*} {*T2*}Può costruire e scavare{*ETW*}{*B*} - Quando quest'opzione è abilitata, il giocatore può interagire con il mondo normalmente. Se, invece, l'opzione è disattivata, il giocatore non può posizionare né distruggere blocchi e non potrà interagire con oggetti e blocchi di vario tipo. Quest'opzione è disponibile solo se "Autorizza giocatori" è disattivata.{*B*}{*B*} + Questa opzione è disponibile solo se "Autorizza giocatori" è disattivata. Quando l'opzione è attiva, il giocatore può interagire normalmente con il mondo di gioco. Se, invece, l'opzione è disattivata, il giocatore non può posizionare né distruggere blocchi e non potrà interagire con oggetti e blocchi di vario tipo.{*B*}{*B*} {*T2*}Può usare porte e interruttori{*ETW*}{*B*} - Se disattivata, il giocatore non sarà in grado di usare né le porte né gli interruttori. Quest'opzione è disponibile solo se "Autorizza giocatori" è disattivata.{*B*}{*B*} + Questa opzione è disponibile solo se "Autorizza giocatori" è disattivata. Se disattivata, il giocatore non sarà in grado di usare né le porte né gli interruttori.{*B*}{*B*} {*T2*}Può aprire contenitori{*ETW*}{*B*} - Se disattivata, il giocatore non sarà in grado di aprire i contenitori, come le casse. Quest'opzione è disponibile solo se "Autorizza giocatori" è disattivata.{*B*}{*B*} + Questa opzione è disponibile solo se "Autorizza giocatori" è disattivata. Se disattivata, il giocatore non sarà in grado di aprire i contenitori, come le casse.{*B*}{*B*} {*T2*}Può attaccare i giocatori{*ETW*}{*B*} - Se disattivata, impedisce al giocatore di causare danni agli altri utenti. Quest'opzione è disponibile solo se "Autorizza giocatori" è disattivata.{*B*}{*B*} + Questa opzione è disponibile solo se "Autorizza giocatori" è disattivata. Se disattivata, impedisce al giocatore di causare danni agli altri utenti.{*B*}{*B*} {*T2*}Può attaccare animali{*ETW*}{*B*} - Se disattivata, il giocatore non sarà in grado di infliggere danni agli animali. Quest'opzione è disponibile solo se "Autorizza giocatori" è disattivata.{*B*}{*B*} + Questa opzione è disponibile solo se "Autorizza giocatori" è disattivata. Se disattivata, il giocatore non sarà in grado di infliggere danni agli animali.{*B*}{*B*} {*T2*}Moderatore{*ETW*}{*B*} Se quest'opzione è attivata, il giocatore potrà modificare i privilegi degli altri utenti, fatta eccezione per l'host, a patto che "Autorizza giocatori" sia disabilitata. Inoltre, il giocatore potrà espellere gli altri utenti e modificare le opzioni relative alla diffusione degli incendi e all'esplosione del TNT.{*B*}{*B*} {*T2*}Espelli giocatore{*ETW*}{*B*} - Selezionando quest'opzione, è possibile espellere qualsiasi giocatore che non si trova sulla console {*PLATFORM_NAME*} dell'host e tutti gli altri utenti eventualmente collegati tramite la console {*PLATFORM_NAME*} del giocatore espulso. I giocatori espulsi non potranno rientrare prima che la partita sia riavviata.{*B*}{*B*} + {*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} {*T1*}Opzioni del giocatore host{*ETW*}{*B*} -Se l'opzione "Privilegi dell'host" è attivata, l'host può modificare da solo alcuni privilegi. Per modificare i privilegi di un giocatore, seleziona il suo nome e premi {*CONTROLLER_VK_A*} per aprire il menu dei privilegi del giocatore e accedere alle seguenti opzioni.{*B*}{*B*} +Se l'opzione "Privilegi dell'host" è attivata, l'host può modificare da solo alcuni privilegi. Per modificare i privilegi di un giocatore, seleziona il suo nome e premi{*CONTROLLER_VK_A*} per aprire il menu dei privilegi del giocatore e accedere alle seguenti opzioni.{*B*}{*B*} {*T2*}Può volare{*ETW*}{*B*} Se l'opzione è attivata, il giocatore è in grado di volare. L'opzione ha effetto esclusivamente sulla modalità Sopravvivenza, perché in modalità Creativa, tutti i giocatori possono volare.{*B*}{*B*} - + {*T2*}Disabilita stanchezza{*ETW*}{*B*} L'opzione ha effetto esclusivamente sulla modalità Sopravvivenza. Se attivata, le attività fisiche (camminare, correre, saltare e altre ancora) non fanno diminuire la barra del cibo. Tuttavia, se il giocatore viene ferito, la barra del cibo diminuirà lentamente man mano che il giocatore guarisce.{*B*}{*B*} - + {*T2*}Invisibile{*ETW*}{*B*} Se l'opzione è abilitata, il giocatore è invulnerabile e gli altri utenti non possono vederlo.{*B*}{*B*} - + {*T2*}Può usare il teletrasporto{*ETW*}{*B*} - Permette al giocatore di spostare sé stesso o gli altri utenti, raggiungendo altri giocatori presenti nel mondo. + Permette al giocatore di spostare se stesso o gli altri utenti, raggiungendo altri giocatori presenti nel mondo. +Selezionando quest'opzione, è possibile espellere qualsiasi giocatore che non si trova sulla console {*PLATFORM_NAME*} dell'host e tutti gli altri utenti eventualmente collegati tramite la console {*PLATFORM_NAME*} del giocatore espulso. Il giocatore non potrà accedere nuovamente finché il gioco non sarà stato riavviato. + Pagina successiva Pagina precedente @@ -424,63 +447,95 @@ così saranno in grado di raggiungerti facilmente. Novità - -{*T3*}Modifiche e aggiunte{*ETW*}{*B*}{*B*} -- Nuovi oggetti: smeraldi, minerale di smeraldo, blocco di smeraldo, forziere di Ender, gancio a filo, mela d'oro incantata, incudine, vaso di fiori, muro di ciottoli, muro di ciottoli coperto di muschio, quadro sbiadito, patata, patata arrostita, patata velenosa, carota, carota d'oro, carota e bastone, -torta di zucca, pozione della visione notturna, pozione dell'invisibilità, quarzo del Sottomondo, minerale di quarzo del Sottomondo, blocco di quarzo, lastra di quarzo, scala di quarzo, blocco cesellato di quarzo, blocco portante di quarzo, libro incantato, tappeto.{*B*} -- Nuove ricette per arenaria liscia e arenaria cesellata.{*B*} -- Nuovi nemici: abitanti del villaggio zombie.{*B*} -- Nuove caratteristiche per la generazione del mondo: templi nel deserto, villaggi nel deserto, templi nella giungla.{*B*} -- Aggiunta la possibilità di commerciare con gli abitanti dei villaggi.{*B*} -- Aggiunta l'interfaccia incudine.{*B*} -- Il colore delle armature di pelle può essere cambiato usando le tinture.{*B*} -- Il colore dei collari dei lupi può essere cambiato usando le tinture.{*B*} -- I maiali possono essere controllati usando bastone e carota quando li si cavalca.{*B*} -- Il contenuto dei forzieri bonus è stato aggiornato con altri oggetti.{*B*} -- La posizione dei mezzi blocchi e degli altri blocchi sui mezzi blocchi è stata modificata.{*B*} -- La posizione delle scale e delle lastre al contrario è stata modificata.{*B*} -- Sono stati aggiunti mestieri diversi per gli abitanti dei villaggi.{*B*} -- Gli abitanti dei villaggi nati da un uovo generazione svolgono mestieri scelti in modo casuale.{*B*} -- È stata aggiunta la possibilità di posizionare i tronchi di legno in orizzontale.{*B*} -- Gli attrezzi di legno possono essere usati come combustibile nelle fornaci.{*B*} -- Le lastre di vetro e quelle di ghiaccio possono essere raccolte con attrezzi dotati dell'incantesimo "Tocco di seta".{*B*} -- Le piastre a pressione di legno e i pulsanti di legno possono essere attivati con le frecce.{*B*} -- I nemici del Sottomondo possono essere generati nel Sopramondo tramite i portali.{*B*} -- I creeper e i ragni sono aggressivi nei confronti del giocatore che li ha colpiti per ultimo.{*B*} -- I nemici in modalità Creativa tornano a essere neutrali dopo un breve periodo.{*B*} -- È stato rimosso l'atterramento in caso di annegamento.{*B*} -- Le porte rotte dagli zombie mostrano i segni dei danni subiti.{*B*} -- Il ghiaccio si scioglie nel Sottomondo.{*B*} -- I calderoni si riempiono d'acqua sotto la pioggia.{*B*} -- I pistoni impiegano il doppio del tempo per tornare al punto di partenza.{*B*} -- In caso siano sellati, i maiali lasciano cadere la sella quando sono uccisi.{*B*} -- Il colore del cielo nel Limite è stato cambiato.{*B*} -- È possibile posizionare corde (per i ganci a filo).{*B*} -- Le gocce di pioggia filtrano tra le foglie.{*B*} -- Le leve possono essere posizionate sulla parte inferiore dei blocchi.{*B*} -- Il TNT infligge danni che variano in base al livello di difficoltà.{*B*} -- La ricetta del libro è stata cambiata.{*B*} -- Le barche rompono le ninfee (le ninfee non rompono più le barche).{*B*} -- I maiali fanno guadagnare un maggior numero di costolette di maiale.{*B*} -- Sono generati meno slime nei mondi superpiatti.{*B*} -- I creeper infliggono una quantità di danni variabile in base al livello di difficoltà, ma l'atterramento è aumentato.{*B*} -- È stato risolto il problema degli Enderman che non aprono le mascelle.{*B*} -- È stato aggiunto il teletrasporto per i giocatori (usando il menu BACK durante il gioco).{*B*} -- Sono state aggiunte opzioni host per il volo, l'invisibilità e l'invulnerabilità per i giocatori in remoto.{*B*} -- Nel mondo tutorial sono stati aggiunti altri tutorial che spiegano nuovi oggetti e caratteristiche del gioco.{*B*} -- Le posizioni dei forzieri dei dischi nel mondo tutorial sono state aggiornate.{*B*} +{*T3*}Modifiche e aggiunte{*ETW*}{*B*}{*B*} +- Aggiunti nuovi oggetti: argilla indurita, argilla colorata, blocco di carbone, balla di fieno, binario attivatore, blocco di pietra rossa, sensore luce diurna, sgancio, vagoncino, carrello con vagoncino, carrello con TNT, comparatore pietra rossa, piastra a pressione con peso, segnale, cassa intrappolata, razzo d'artificio, stella Fuoco d'artificio, stella del Sottomondo, piombo, corazza per cavalli, targhetta nome, uovo generazione cavallo{*B*} +- Aggiunti nuovi mostri: Avvizzito, scheletri avvizziti, streghe, pipistrelli, cavalli, asini e muli{*B*} +- Aggiunte nuove funzionalità di generazione del terreno: capanna della strega.{*B*} +- Aggiunta interfaccia del segnale.{*B*} +- Aggiunta interfaccia del cavallo.{*B*} +- Aggiunta interfaccia del vagoncino.{*B*} +- Aggiunti i fuochi d'artificio, la cui interfaccia è accessibile dal tavolo da lavoro quando si dispone degli ingredienti per la produzione di una stella Fuoco d'artificio o di un razzo d'artificio.{*B*} +- Aggiunta la modalità Avventura: puoi distruggere i blocchi solo se disponi degli attrezzi adatti.{*B*} +- Aggiunti numerosi nuovi suoni.{*B*} +- Ora mostri, oggetti e proiettili possono attraversare i portali.{*B*} +- Ora i ripetitori possono essere bloccati attivandone i lati con un altro ripetitore.{*B*} +- Zombie e scheletri ora possono essere generati con diverse armi e armature.{*B*} +- Nuovi messaggi in caso di morte del giocatore.{*B*} +- Possibilità di dare un nome ai mostri con una targhetta e di rinominare i contenitori al fine di modificarne il titolo quando viene visualizzato il relativo menu.{*B*} +- La farina d'ossa non fa più crescere qualsiasi oggetto istantaneamente alla dimensione massima, invece lo fa crescere casualmente di vari livelli.{*B*} +- Collocando un comparatore di pietra rossa accanto a casse, banchi di distillazione, distributori e jukebox, è possibile rilevare un segnale pietra rossa che ne illustra il contenuto.{*B*} +- I distributori possono essere rivolti in qualsiasi direzione.{*B*} +- Mangiando una mela d'oro, il giocatore ottiene un "assorbimento" extra di salute temporaneo.{*B*} +- Maggiore è il tempo trascorso in un'area, più i mostri generati in quel luogo saranno potenti.{*B*} {*ETB*}Bentornato! Forse non lo sai, ma Minecraft è appena stato aggiornato.{*B*}{*B*} -Abbiamo aggiunto tante nuove funzionalità per te e i tuoi amici: di seguito troverai elencate quelle principali. Dai un'occhiata e corri a divertirti!{*B*}{*B*} -{*T1*}Nuovi oggetti{*ETB*} - Smeraldi, minerale di smeraldo, blocco di smeraldo, forziere di Ender, gancio a filo, mela d'oro incantata, incudine, vaso di fiori, muro di ciottoli, muro di ciottoli coperto di muschio, quadro sbiadito, patata, patata arrostita, patata velenosa, carota, carota d'oro, carota e bastone, -torta di zucca, pozione della visione notturna, pozione dell'invisibilità, quarzo del Sottomondo, minerale di quarzo del Sottomondo, blocco di quarzo, lastra di quarzo, scala di quarzo, blocco cesellato di quarzo, blocco portante di quarzo, libro incantato, tappeto.{*B*}{*B*} - {*T1*}Nuovi nemici{*ETB*} - Abitanti del villaggio zombie.{*B*}{*B*} -{*T1*}Nuove funzioni di gioco{*ETB*} - Commercia con gli abitanti dei villaggi, ripara e incanta armi e attrezzi con l'incudine, custodisci oggetti nei forzieri di Ender, controlla il maiale che cavalchi usando bastone e carota!{*B*}{*B*} -{*T1*}Nuovi mini tutorial{*ETB*} – Impara a usare le nuove funzioni di gioco nel mondo tutorial!{*B*}{*B*} -{*T1*}Nuove "sorprese nascoste"{*ETB*} – Abbiamo cambiato la posizione di tutti i dischi segreti nel mondo tutorial. Vediamo se riesci a trovarli di nuovo!{*B*}{*B*} +Abbiamo aggiunto tante nuove funzionalità per te e i tuoi amici: di seguito troverai elencate quelle principali. Dai un'occhiata e corri a divertirti!{*B*}{*B*} +{*T1*}Nuovi oggetti{*ETB*} - Argilla indurita, argilla colorata, blocco di carbone, balla di fieno, binario attivatore, blocco di pietra rossa, sensore luce diurna, sgancio, vagoncino, carrello con vagoncino, carrello con TNT, comparatore pietra rossa, piastra a pressione con peso, segnale, cassa intrappolata, razzo d'artificio, stella Fuoco d'artificio, stella del Sottomondo, piombo, corazza per cavalli, targhetta nome, uovo generazione cavallo{*B*}{*B*} +{*T1*}Nuovi mostri{*ETB*} - Avvizzito, scheletri avvizziti, streghe, pipistrelli, cavalli, asini e muli{*B*}{*B*} +{*T1*}Nuove funzionalità{*ETB*} - Doma e cavalca i cavalli, produci e usa i fuochi d'artificio, usa le targhette per dare un nome ad animali e mostri, crea circuiti a pietra rossa più avanzati e usa le nuove opzioni host per controllare le azioni disponibili per i visitatori del tuo mondo!{*B*}{*B*} +{*T1*}Nuovo mondo tutorial{*ETB*} – Scopri funzionalità nuove e familiari nel mondo tutorial. Cerca di trovare tutti i dischi nascosti!{*B*}{*B*} +Cavalli + +{*T3*}COME GIOCARE: CAVALLI{*ETW*}{*B*}{*B*} +Cavalli e asini si trovano principalmente nelle pianure. Se un asino si accoppia con una cavalla, nasce un mulo, il quale però è sterile.{*B*} +Puoi cavalcare tutti i cavalli, asini e muli adulti, ma solo i cavalli possono essere dotati di armatura, così come le borse da sella per il trasporto di oggetti sono riservate ad asini e muli.{*B*}{*B*} +Prima di poter cavalcare un cavallo, un asino o un mulo, dovrai domarlo tentando di cavalcarlo e rimanendo in groppa mentre cerca di disarcionarti.{*B*} +Quando compaiono dei cuoricini intorno all'animale, significa che è domato e potrai cavalcarlo. Per controllare un cavallo, devi dotarlo di una sella.{*B*}{*B*} +Puoi acquistare le selle dagli abitanti dei villaggi oppure trovarle nelle casse nascoste un po' ovunque.{*B*} +Puoi mettere una borsa da sella su un asino o un mulo domato assicurandovi una cassa. Potrai accedere alle borse da sella mentre cavalchi o sei in modalità furtiva.{*B*}{*B*} +Puoi allevare cavalli e asini (ma non muli) come gli altri animali, usando mele d'oro o carote d'oro.{*B*} +Col passare del tempo, i puledri diventeranno adulti, comunque puoi velocizzare l'operazione nutrendoli con fieno o grano.{*B*} + + +Segnali + +{*T3*}COME GIOCARE: SEGNALI{*ETW*}{*B*}{*B*} +I segnali attivi proiettano un raggio di luce nel cielo, conferendo poteri speciali ai giocatori nelle vicinanze.{*B*} +Per produrli servono vetro, ossidiana e stelle del Sottomondo, le quali si ottengono sconfiggendo l'Avvizzito.{*B*}{*B*} +I segnali devono essere collocati in modo tale che siano colpiti dalla luce del sole durante il giorno; inoltre vanno posti su piramidi di ferro, oro, smeraldo o diamante.{*B*} +Il materiale su cui è collocato il segnale non influisce sul suo potere.{*B*}{*B*} +Nel menu dei segnali puoi selezionare un potere principale per il tuo segnale: più livelli possiede la piramide, maggiore sarà il numero di poteri tra cui scegliere.{*B*} +Un segnale su una piramide con almeno quattro livelli offre inoltre il potere secondario Rigenerazione o un potere principale rafforzato.{*B*}{*B*} +Per impostare i poteri del tuo segnale, devi sacrificare un lingotto di smeraldo, diamante, oro o ferro nello slot di pagamento.{*B*} +Una volta impostati, i poteri saranno emanati dal segnale senza scadenze o limiti.{*B*} + + +Fuochi d'artificio + +{*T3*}COME GIOCARE: FUOCHI D'ARTIFICIO{*ETW*}{*B*}{*B*} +I fuochi d'artificio sono oggetti decorativi che possono essere lanciati manualmente o dai distributori. Si producono usando carta, povere da sparo e alcune stelle Fuoco d'artificio (facoltative).{*B*} +Colori, dissolvenza, forma, dimensione ed effetti (come scia o scintillii) delle stelle Fuoco d'artificio possono essere personalizzati includendo ingredienti aggiuntivi durante la produzione.{*B*}{*B*} +Per produrre un fuoco d'artificio, inserisci polvere da sparo e carta nella griglia di produzione 3x3 al di sopra dell'inventario.{*B*} +Se lo desideri, puoi inserire alcune stelle Fuoco d'artificio nella griglia di produzione, per aggiungerle al fuoco d'artificio.{*B*} +Più caselle occupi con la polvere da sparo, maggiore sarà l'altezza a cui esploderanno le stelle Fuoco d'artificio.{*B*}{*B*} +Quando vuoi produrre il fuoco d'artificio, prendilo dalla casella di produzione.{*B*}{*B*} +Per produrre le stelle Fuoco d'artificio, inserisci polvere da sparo e tintura nella griglia di produzione.{*B*} + - La tintura stabilisce il colore dell'esplosione della stella Fuoco d'artificio.{*B*} + - Per decidere la forma della stella Fuoco d'artificio, aggiungi una scarica di fuoco, una pepita d'oro, una piuma o una testa di mostro.{*B*} + - Puoi aggiungere una scia usando diamanti e polvere di pietra brillante.{*B*}{*B*} +Una volta creata una stella Fuoco d'artificio, puoi stabilirne il colore di dissolvenza usando la tintura. + + +Vagoncini + +{*T3*}COME GIOCARE: VAGONCINI{*ETW*}{*B*}{*B*} +I vagoncini si usano per inserire o rimuovere oggetti dai contenitori e per raccogliere automaticamente gli oggetti che vi vengono riposti.{*B*} +Possono influire su Banchi di distillazione, casse, distributori, sganci, carrelli con casse, carrelli con vagoncini e altri vagoncini.{*B*}{*B*} +I vagoncini tentano continuamente di estrarre oggetti da un contenitore adatto posizionato sopra di essi. Inoltre, cercheranno di inserire gli oggetti in essi riposti in un contenitore di scarico.{*B*} +Se un vagoncino funziona grazie a una pietra rossa, si disattiverà e smetterà di prelevare e consegnare oggetti.{*B*}{*B*} +Il vagoncino punta nella direzione in cui cerca di scaricare gli oggetti. Per rivolgere un vagoncino verso un blocco particolare, posizionalo a ridosso di tale blocco mentre ti muovi furtivamente.{*B*} + + +Sganci + +{*T3*}COME GIOCARE: SGANCI{*ETW*}{*B*}{*B*} +Se attivati da una pietra rossa, gli sganci rilasciano un oggetto casuale sul terreno. Usa {*CONTROLLER_ACTION_USE*} per aprire lo sgancio e inserisci gli oggetti del tuo inventario.{*B*} +Se lo sgancio è rivolto verso un forziere o un altro tipo di contenitore, l'oggetto verrà riposto lì. Puoi creare lunghe serie di sganci per trasportare gli oggetti, ma affinché funzionino devono essere alternativamente attivati e disattivati. + + Infligge un danno maggiore della mano. Serve per scavare terra, erba, sabbia, ghiaia e neve più in fretta che a mano. Le pale servono per scavare palle di neve. @@ -553,7 +608,7 @@ torta di zucca, pozione della visione notturna, pozione dell'invisibilità, quar Si usa per creare scale lunghe. Due lastre una sopra l'altra creano un blocco doppio di dimensioni normali. -Si usa per costruire scale lunghe. Due lastre poste l'una sull'altra creano un blocco da due lastre di dimensioni normali. +Si usa per creare scale lunghe. Due lastre una sopra l'altra creano un blocco doppio di dimensioni normali. La torcia si usa per fare luce, nonché per sciogliere neve e ghiaccio. @@ -606,10 +661,36 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Mentre la tieni in mano, crea un'immagine di un'area esplorata. Può essere utile per orientarti. +Quando viene utilizzata, diventa una mappa della parte del mondo in cui ti trovi e si compila man mano che procedi nell'esplorazione. + Consente attacchi a distanza con le frecce. Si usa come munizione per l'arco. +Rilasciato dall'Avvizzito, si usa per produrre segnali. + +Quando si attiva, crea esplosioni colorate. Colore, effetto, forma e dissolvenza sono determinati dalla stella Fuoco d'artificio utilizzata al momento della sua produzione. + +Si usa per determinare colore, effetto e forma di un fuoco d'artificio. + +Si usa nei circuiti con pietre rosse per mantenere, confrontare o sottrarre forza al segnale o per misurare le condizioni di determinati blocchi. + +È un tipo di carrello che funge da blocco di TNT mobile. + +È un blocco che emette un segnale pietra rossa in base alla luce del sole (o alla sua assenza). + +È uno speciale tipo di carrello che funziona in modo simile al vagoncino. Raccoglie gli oggetti sui binari e dai contenitori sopra di esso. + +Speciale tipo di corazza che si può far indossare a un cavallo. Garantisce 5 punti armatura. + +Speciale tipo di corazza che si può far indossare a un cavallo. Garantisce 7 punti armatura. + +Speciale tipo di corazza che si può far indossare a un cavallo. Garantisce 11 punti armatura. + +Serve per allacciare il nemico al giocatore o alle recinzioni. + +Serve per dare un nome ai nemici nel mondo. + Reintegra 2,5{*ICON_SHANK_01*}. Reintegra 1{*ICON_SHANK_01*}. Utilizzabile 6 volte. @@ -628,7 +709,7 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Reintegra 4{*ICON_SHANK_01*}. Si crea cucinando il manzo crudo nella fornace. -Reintegra 1,5{*ICON_SHANK_01*} o si può cucinare nella fornace. +Reintegra 1,5{*ICON_SHANK_01*}, o può essere cucinato in una fornace. Reintegra 4{*ICON_SHANK_01*}. Si crea cucinando una costoletta di maiale in una fornace. @@ -661,7 +742,7 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Accesi, fanno accelerare i carrelli da miniera che ci passano sopra. Spenti, fanno fermare i carrelli da miniera. -Funzionano come la piastra a pressione (inviano un segnale pietra rossa mentre sono in funzione) ma sono attivabili solo dal carrello da miniera. +Funziona come la piastra a pressione (invia un segnale pietra rossa mentre è in funzione) ma è attivabile solo dal carrello da miniera. Trasporta te, un animale o un mostro sui binari. @@ -934,100 +1015,158 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Le teste di Mob si possono collocare come decorazioni o indossare come maschere nello slot per l'elmo. +Serve per eseguire ordini. + +Proietta un raggio di luce nel cielo e conferisce effetti positivi ai giocatori vicini. + +Vi si possono conservare blocchi e oggetti. Colloca due casse una accanto all'altra per creare una cassa grande dalla capacità doppia. La cassa intrappolata crea inoltre una carica di pietra rossa quando viene aperta. + +Fornisce una carica di pietra rossa. La carica è più potente se ci sono più oggetti sulla piastra. + +Fornisce una carica di pietra rossa. La carica è più potente se ci sono più oggetti sulla piastra. Richiede un peso maggiore rispetto alla piastra leggera. + +Si usa come fonte energetica per la pietra rossa. Riconvertibile in pietra rossa. + +Si usa per prelevare oggetti o per trasferirli dentro e fuori vari contenitori. + +Un tipo di binario che attiva o disattiva i carrelli con vagoncini e attiva i carrelli con TNT. + +Serve per custodire e depositare oggetti o per spingerli in un altro contenitore quando viene fornita una carica di pietra rossa. + +Blocchi colorati prodotti tingendo l'argilla indurita. + +Si può usare per nutrire cavalli, asini o muli e reintegrare fino a 10 cuori. Accelera la crescita dei puledri. + +Si crea fondendo argilla nella fornace. + +Si produce usando vetro e tintura. + +Si produce con il vetro colorato. + +Per conservare il carbone in poco spazio. Utilizzabile per il funzionamento della fornace. + Calamaro - + Rilascia sacche di inchiostro quando viene ucciso. - + Mucca - + Rilascia pelle quando viene uccisa. Si può anche mungere usando un secchio. - + Pecora - + Rilascia lana quando viene tosata (se non è già stata tosata). Si può creare lana di vari colori usando le tinture. - + Gallina - + Rilascia piume quando viene uccisa, inoltre a volte depone le uova. - + Maiale - + Rilascia costolette quando viene ucciso. Si può cavalcare usando una sella. - + Lupo - + Docile finché non viene attaccato, nel qual caso reagisce. Si può domare usando le ossa, che lo convincono a seguirti e ad attaccare i tuoi nemici. - + Creeper - + Esplode se ti avvicini troppo! - + Scheletro - + Ti lancia delle frecce. Rilascia frecce quando viene ucciso. - + Ragno - + Ti attacca quando ti avvicini. Può arrampicarsi sui muri. Rilascia un pungiglione quando viene ucciso. - + Zombie - + Ti attacca quando ti avvicini. - + Uomo-maiale zombie - + Inizialmente docile, ma se ne colpisci uno verrai attaccato da un gruppo. - + Ghast - + Ti lancia sfere di fuoco che esplodono al contatto. - + Slime - + Se danneggiato, si divide in slime più piccoli. - + Enderman - + Ti attacca se lo guardi. Può anche spostare blocchi. - + Pesciolino d'argento - + Quando viene attaccato, attira tutti i Pesciolini d'argento nascosti nei dintorni. Si nasconde nei blocchi di pietra. - + Ragno delle grotte - + Il suo morso è velenoso. - + Muccafungo - + Si usa con una Ciotola per preparare la Zuppa di funghi. Deposita funghi e diventa una mucca normale quando viene tosata. - + Golem di neve - + Il Golem di neve può essere creato assemblando blocchi di neve e una zucca. Lancia palle di neve contro i nemici del suo creatore. - + Drago di Ender - + Grosso drago nero che si trova nel Limite. - + Vampe - + Nemici che si trovano nel Sottomondo, soprattutto all'interno delle Fortezze. Quando vengono uccisi, depositano Bacchette di Vampe. - + Cubo di magma - + Si trovano nel Sottomondo. Simili a Slime, si dividono in esemplari più piccoli quando vengono uccisi. - + Abitante del villaggio - + Ocelot - + Possono essere trovati nelle giungle. Sono addomesticabili se sfamati con pesce crudo, ma aspetta che sia lui ad avvicinarsi a te, perché un movimento brusco lo metterebbe in fuga. - + Golem di ferro - + Appare nei villaggi per proteggerli, può essere creato usando blocchi di ferro e zucche. - + +Pipistrello + +Queste creature volanti si trovano nelle caverne o in altri grandi spazi chiusi. + +Strega + +Si trovano nelle paludi e attaccano lanciando pozioni. Quando vengono uccise, rilasciano pozioni. + +Cavallo + +Questi animali possono essere domati e quindi cavalcati. + +Asino + +Questi animali possono essere domati e quindi cavalcati. Possono trasportare una cassa. + +Mulo + +Nasce dall'incrocio tra un cavallo e un asino. Questi animali possono essere domati e quindi cavalcati; inoltre possono trasportare casse. + +Cavallo zombie + +Cavallo scheletro + +Avvizzito + +Si producono usando teschi di Avvizzito e sabbie mobili. Scagliano teschi esplosivi contro di te. + Explosives Animator Concept Artist @@ -1374,6 +1513,8 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Mappa +Mappa vuota + Disco - "13" Disco - "gatto" @@ -1452,9 +1593,9 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Scarica di fuoco -Scarica di fuoco (carbone vegetale) +Scarica fuoco (carbone veg.) -Scarica di fuoco (carbone) +Scarica fuoco (carbone) Espositore @@ -1476,6 +1617,28 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Testa di Creeper +Stella del Sottomondo + +Razzo d'artificio + +Stella Fuoco d'artificio + +Comparatore pietra rossa + +Carrello con TNT + +Carrello con vagoncino + +Corazza di ferro per cavallo + +Corazza d'oro per cavallo + +Corazza di diamante per cavallo + +Piombo + +Targhetta nome + Pietra Blocco d'erba @@ -1492,6 +1655,8 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Assi di legno della giungla +Assi di legno (qualsiasi tipo) + Arbusto Arbusto di quercia @@ -1604,7 +1769,7 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Lastra di arenaria -Lastra di legno +Lastra di legno di quercia Lastra acciottolata @@ -1612,15 +1777,15 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Lastra di mattoni di pietra -Lastra di legna di quercia +Lastra di legno di quercia Lastra di arbusto Lastra di legno di betulla -Lastra di legno della giungla +Lastra di legno tropicale -Lastra di mattoni del Sottomondo +Lastra matt. Sottomondo Mattoni @@ -1750,7 +1915,7 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Mattoni di pietra -Mattoni di pietra coperti di muschio +Mattoni di pietra muschiati Mattoni di pietra lesionati @@ -1790,9 +1955,9 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Mattone del Sottomondo -Recinzione di mattoni del Sottomondo +Recinzione matt. Sottomondo -Scale di mattoni del Sottomondo +Scale matt. Sottomondo Verruca del Sottomondo @@ -1820,7 +1985,7 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Scale di legno di betulla -Scala di legno della giungla +Scala di legno tropicale Torcia di pietra rossa @@ -1828,6 +1993,190 @@ I colori sono sempre gli stessi, qualunque sia la lana usata. Teschio +Blocco di comando + +Segnale + +Cassa intrappolata + +Piastra a press. pesata (leggera) + +Piastra a press. pesata (pesante) + +Comparatore pietra rossa + +Sensore luce diurna + +Blocco di pietra rossa + +Vagoncino + +Binario attivatore + +Sgancio + +Argilla colorata + +Balla di fieno + +Argilla indurita + +Blocco di carbone + +Argilla colorata nera + +Argilla colorata rossa + +Argilla colorata verde + +Argilla colorata marrone + +Argilla colorata blu + +Argilla colorata viola + +Argilla colorata turchese + +Arg. col. grigio chiaro + +Argilla colorata grigia + +Argilla colorata rosa + +Arg. col. verde acido + +Argilla colorata gialla + +Argilla colorata azzurra + +Argilla colorata magenta + +Argilla colorata arancione + +Argilla colorata bianca + +Vetro colorato + +Vetro colorato nero + +Vetro colorato rosso + +Vetro colorato verde + +Vetro colorato marrone + +Vetro colorato blu + +Vetro colorato viola + +Vetro colorato turchese + +Vetro colorato grigio chiaro + +Vetro colorato grigio + +Vetro colorato rosa + +Vetro colorato verde lime + +Vetro colorato giallo + +Vetro colorato azzurro + +Vetro colorato magenta + +Vetro colorato arancione + +Vetro colorato bianco + +Lastra di vetro colorato + +Lastra di vetro colorato nera + +Lastra di vetro colorato rossa + +Lastra di vetro colorato verde + +Lastra di vetro colorato marrone + +Lastra di vetro colorato blu + +Lastra di vetro colorato viola + +Lastra di vetro colorato turchese + +Lastra di vetro colorato grigio chiaro + +Lastra di vetro colorato grigia + +Lastra di vetro colorato rosa + +Lastra di vetro colorato verde lime + +Lastra di vetro colorato gialla + +Lastra di vetro colorato azzurra + +Lastra di vetro colorato magenta + +Lastra di vetro colorato arancione + +Lastra di vetro colorato bianca + +Sfera piccola + +Sfera grande + +A forma di stella + +A forma di creeper + +Esplosione + +Forma sconosciuta + +Nero + +Rosso + +Verde + +Marrone + +Blu + +Viola + +Turchese + +Grigio chiaro + +Grigio + +Rosa + +Verde lime + +Giallo + +Azzurro + +Magenta + +Arancione + +Bianco + +Personalizzato + +Dissolvenza + +Luccichio + +Scia + +Durata volo: +  Comandi attuali Layout @@ -2005,8 +2354,7 @@ Di notte, i mostri vagano in libertà, quindi costruisci un riparo per tempo. Questo è il tuo inventario. Mostra gli oggetti che puoi tenere in mano e quelli che trasporti, nonché la tua eventuale armatura. - - + {*B*} Premi{*CONTROLLER_VK_A*} per continuare.{*B*} Premi{*CONTROLLER_VK_B*} se sai già come si usa l'inventario. @@ -2027,8 +2375,8 @@ Di notte, i mostri vagano in libertà, quindi costruisci un riparo per tempo. - Se vuoi maggiori informazioni su un oggetto, spostaci sopra il puntatore e premi{*CONTROLLER_VK_RT*}. - + Se vuoi maggiori informazioni su un oggetto, spostaci sopra il puntatore e premi{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + Ora premi{*CONTROLLER_VK_B*} per uscire dall'inventario. @@ -2061,8 +2409,8 @@ Di notte, i mostri vagano in libertà, quindi costruisci un riparo per tempo. - Se vuoi maggiori informazioni su un oggetto, spostaci sopra il puntatore e premi{*CONTROLLER_VK_RT*}. - + Se vuoi maggiori informazioni su un oggetto, spostaci sopra il puntatore e premi{*CONTROLLER_ACTION_MENU_PAGEDOWN*} . + Ora premi{*CONTROLLER_VK_B*} per uscire dall'inventario della modalità Creativa. @@ -2608,6 +2956,211 @@ Durante il volo, puoi tenere premuto{*CONTROLLER_ACTION_JUMP*} per salire e{*CON Premi{*CONTROLLER_VK_B*} se sai già come funzionano la barra del cibo e l'alimentazione. + + Questa è l'interfaccia dell'inventario del cavallo. + + + + {*B*}Premi{*CONTROLLER_VK_A*} per continuare. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già usare l'inventario del cavallo. + + + + L'inventario del cavallo ti consente di trasferire o equipaggiare oggetti per il tuo cavallo, asino o mulo. + + + + Sella il tuo cavallo inserendo una sella nel relativo slot. Puoi far indossare una corazza a un cavallo collocandola nel relativo slot. + + + + In questo menu puoi anche trasferire oggetti tra l'inventario e le borse da sella sulla groppa di asini e muli. + + +Hai trovato un cavallo. + +Hai trovato un asino. + +Hai trovato un mulo. + + + {*B*}Premi{*CONTROLLER_VK_A*} per saperne di più su cavalli, asini e muli. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già tutto su cavalli, asini e muli. + + + + Cavalli e asini si trovano principalmente nelle pianure, mentre i muli nascono dall'accoppiamento tra un asino e un cavallo, ma ricorda che sono sterili e non potranno riprodursi a loro volta. + + + + Puoi cavalcare tutti i cavalli, i muli e gli asini adulti, ma puoi far indossare una corazza soltanto ai cavalli, mentre asini e muli possono essere dotati di una borsa da sella per il trasporto di oggetti. + + + + Prima di poter cavalcare un cavallo, un asino o un mulo, è necessario domarlo tentando di cavalcarlo e resistendo mentre cerca di disarcionarti. + + + + Quando compaiono dei cuori e non tenta più di farti finire a terra, significa che è stato domato. + + + + Ora prova a cavalcare questo cavallo. Usa {*CONTROLLER_ACTION_USE*} senza impugnare oggetti o attrezzi per salirgli in groppa. + + + + Per controllare un cavallo, devi dotarlo di una sella, che puoi acquistare dagli abitanti dei villaggi o trovare nelle casse sparse per il mondo. + + + + Puoi mettere una borsa da sella su un asino o un mulo domato assicurandovi una cassa. Potrai accedere alle borse da sella mentre cavalchi o sei in modalità furtiva. + + + + Cavalli e asini (non i muli) possono essere allevati come gli altri animali, usando mele d'oro o carote d'oro. Col passare del tempo, i puledri diventeranno cavalli adulti, ma puoi velocizzare il processo nutrendoli con fieno o grano. + + + + Qui puoi provare a domare cavalli e asini; inoltre, troverai selle, corazze e altre oggetti utili nelle casse. + + + + Questa è l'interfaccia del segnale, che puoi usare per scegliere i poteri conferiti dai tuoi segnali. + + + + {*B*}Premi{*CONTROLLER_VK_A*} per continuare. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già usare l'inventario del segnale. + + + + Nel menu del segnale, puoi selezionare un potere principale: più livelli possiede la piramide, maggiore sarà il numero di poteri tra cui scegliere. + + + + Un segnale su una piramide con almeno quattro livelli offre inoltre il potere secondario Rigenerazione o un potere principale rafforzato. + + + + Per impostare i poteri del tuo segnale, devi sacrificare un lingotto di smeraldo, diamante, oro o ferro nello slot di pagamento. Una volta impostati, i poteri saranno emanati dal segnale senza scadenze o limiti. + + +Sulla cima di questa piramide c'è un segnale inattivo. + + + {*B*}Premi{*CONTROLLER_VK_A*} per saperne di più sui segnali. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già tutto sui segnali. + + + + I segnali attivi proiettano un raggio di luce nel cielo, conferendo poteri speciali ai giocatori nelle vicinanze. Per produrli servono vetro, ossidiana e stelle del Sottomondo, le quali si ottengono sconfiggendo l'Avvizzito. + + + + I segnali devono essere collocati in modo tale che siano colpiti dalla luce del sole durante il giorno; inoltre vanno posti su piramidi di ferro, oro, smeraldo o diamante. Il materiale su cui è collocato il segnale non influisce sul suo potere. + + + + Prova a usare il segnale per impostare il potere concesso: per il pagamento, puoi usare i lingotti di ferro che ti abbiamo fornito. + + +Questa stanza contiene dei vagoncini + + + {*B*}Premi{*CONTROLLER_VK_A*} per saperne di più sui vagoncini. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già tutto sui vagoncini. + + + + I vagoncini si usano per inserire o rimuovere oggetti dai contenitori e per raccogliere automaticamente gli oggetti che vi vengono riposti. + + + + Possono influire su Banchi di distillazione, casse, distributori, sganci, carrelli con casse, carrelli con vagoncini e altri vagoncini. + + + + I vagoncini tentano continuamente di estrarre oggetti da un contenitore adatto posizionato sopra di essi. Inoltre, cercheranno di inserire gli oggetti in essi riposti in un contenitore di scarico. + + + + Se un vagoncino funziona grazie a una pietra rossa, si disattiverà e smetterà di prelevare e consegnare oggetti. + + + + Il vagoncino punta nella direzione in cui cerca di scaricare gli oggetti. Per rivolgere un vagoncino verso un blocco particolare, posizionalo a ridosso di tale blocco mentre ti muovi furtivamente. + + + + In questa stanza puoi sperimentare diverse configurazioni di vagoncini. + + + + Questa è l'interfaccia dei fuochi d'artificio, che si usa per produrre i fuochi d'artificio e le relative stelle. + + + + {*B*}Premi{*CONTROLLER_VK_A*} per continuare. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già usare l'inventario dei fuochi d'artificio. + + + + Per produrre un fuoco d'artificio, inserisci polvere da sparo e carta nella griglia di produzione 3x3 al di sopra dell'inventario. + + + + Se lo desideri, puoi inserire alcune stelle Fuoco d'artificio nella griglia di produzione, per aggiungerle al fuoco d'artificio. + + + + Più caselle occupi con la polvere da sparo, maggiore sarà l'altezza a cui esploderanno le stelle Fuoco d'artificio. + + + + Quando vuoi produrre il fuoco d'artificio, prendilo dalla casella di produzione. + + + + Per produrre le stelle Fuoco d'artificio, inserisci polvere da sparo e tintura nella griglia di produzione. + + + + La tintura stabilisce il colore dell'esplosione della stella Fuoco d'artificio. + + + + Per decidere la forma della stella Fuoco d'artificio, aggiungi una scarica di fuoco, una pepita d'oro, una piuma o una testa. + + + + Puoi aggiungere uno scintillio usando diamanti e polvere di pietra brillante. + + + + Una volta creata una stella Fuoco d'artificio, puoi stabilirne il colore di dissolvenza usando la tintura. + + + + In queste casse ci sono vari oggetti usati nella produzione di FUOCHI D'ARTIFICIO! + + + + {*B*}Premi{*CONTROLLER_VK_A*} per saperne di più sui fuochi d'artificio. + {*B*}Premi{*CONTROLLER_VK_B*} se sai già tutto sui fuochi d'artificio. + + + + I fuochi d'artificio sono oggetti decorativi che possono essere lanciati manualmente o dai distributori. Si producono usando carta, povere da sparo e alcune stelle Fuoco d'artificio (facoltative). + + + + Colori, dissolvenza, forma, dimensione ed effetti (come scia o scintillii) delle stelle Fuoco d'artificio possono essere personalizzati includendo ingredienti aggiuntivi durante la produzione. + + + + Prova a realizzare un fuoco d'artificio al tavolo da lavoro usando gli ingredienti che trovi nelle casse. + +  Seleziona Usa @@ -2830,6 +3383,22 @@ Durante il volo, puoi tenere premuto{*CONTROLLER_ACTION_JUMP*} per salire e{*CON Carica salvataggio per Xbox One +Sali + +Scendi + +Posiziona cassa + +Lancia + +Guinzaglio + +Rilascia + +Attacca + +Nomina + OK Annulla @@ -3068,7 +3637,7 @@ Vuoi sbloccare il gioco completo? Disconnesso -Sei tornato alla schermata iniziale perché il tuo profilo giocatore si è disconnesso +Sei tornato alla schermata iniziale perché il tuo profilo giocatore si è disconnesso. Difficoltà @@ -3140,6 +3709,20 @@ Vuoi sbloccare il gioco completo? Dispenser +Cavallo + +Sgancio + +Vagoncino + +Segnale + +Potere principale + +Potere secondario + +Carrello da miniera + Nessuna offerta di contenuto scaricabile disponibile per questo titolo al momento. %s si unisce alla partita. @@ -3299,10 +3882,14 @@ Vuoi installare uno dei due pacchetti ora? Modalità: Creativa +Modalità: Avventura + Sopravvivenza Creativa +Avventura + In modalità Sopravvivenza In modalità Creativa @@ -3323,6 +3910,8 @@ Vuoi installare uno dei due pacchetti ora? Superpiatto +Inserisci un seme per generare di nuovo lo stesso terreno. Lascia vuoto per un mondo casuale. + Se attivato, il gioco sarà un gioco online. Se attivato, i giocatori potranno unirsi solo su invito. @@ -3347,6 +3936,20 @@ Vuoi installare uno dei due pacchetti ora? Se l'opzione è abilitata, vicino al punto di generazione del giocatore apparirà una cassa contenente alcuni oggetti utili. +Se disattivato, impedisce a mostri e animali di cambiare i blocchi (per esempio, le esplosioni dei creeper non distruggono i blocchi e le pecore non brucano erba) o di raccogliere oggetti. + +Se attivo, i giocatori mantengono il proprio inventario quando muoiono. + +Se disattivato, i nemici non vengono generati naturalmente. + +Se disattivato, mostri e animali non rilasciano bottino (per esempio, i creeper non rilasciano polvere da sparo). + +Se disattivato, i blocchi non rilasciano oggetti quando vengono distrutti (per esempio, i blocchi di pietra non rilasciano ciottoli). + +Se disattivato, la salute dei giocatori non si rigenera naturalmente. + +Se disattivato, l'ora del giorno non cambia. + Pacchetti di skin Temi @@ -3395,7 +3998,49 @@ Vuoi installare uno dei due pacchetti ora? {*PLAYER*} è stato pestato a morte da {*SOURCE*} -{*PLAYER*} è stato ucciso da {*SOURCE*} +{*PLAYER*} è stato ucciso da {*SOURCE*} con la magia + +{*PLAYER*} è caduto da una scala + +{*PLAYER*} è caduto dai rampicanti + +{*PLAYER*} è caduto fuori dall'acqua + +{*PLAYER*} è caduto da una grande altezza + +{*SOURCE*} ha condannato {*PLAYER*} alla caduta + +{*SOURCE*} ha condannato {*PLAYER*} alla caduta + +{*SOURCE*} ha condannato {*PLAYER*} alla caduta usando {*ITEM*} + +{*PLAYER*} è caduto troppo lontano ed è stato fatto fuori da {*SOURCE*} + +{*PLAYER*} è caduto troppo lontano ed è stato fatto fuori da {*SOURCE*} usando {*ITEM*} + +{*PLAYER*} è finito nel fuoco mentre affrontava {*SOURCE*} + +{*PLAYER*} è finito arrosto mentre affrontava {*SOURCE*} + +{*PLAYER*} ha cercato di nuotare nella lava per sfuggire a {*SOURCE*} + +{*PLAYER*} è annegato mentre cercava di sfuggire a {*SOURCE*} + +{*PLAYER*} è finito contro un cactus mentre cercava di sfuggire a {*SOURCE*} + +{*SOURCE*} ha fatto esplodere {*PLAYER*} + +{*PLAYER*} è avvizzito + +{*SOURCE*} ha massacrato {*PLAYER*} usando {*ITEM*} + +{*SOURCE*} ha sparato a {*PLAYER*} usando {*ITEM*} + +{*SOURCE*} ha lanciato una sfera di fuoco a {*PLAYER*} usando {*ITEM*} + +{*SOURCE*} ha preso a pugni {*PLAYER*} usando {*ITEM*} + +{*SOURCE*} ha ucciso {*PLAYER*} usando {*ITEM*} Nebbia substrato roccioso @@ -3560,9 +4205,9 @@ Vuoi installare uno dei due pacchetti ora? Non ripristinare il Sottomondo -Impossibile tosare il muccafungo al momento. Hai raggiunto il numero massimo di maiali, pecore, mucche e gatti. +Impossibile tosare il muccafungo al momento. Hai raggiunto il numero massimo di maiali, pecore, mucche, gatti e cavalli. -Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di maiali, pecore, mucche e gatti. +Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di maiali, pecore, mucche, gatti e cavalli. Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di muccafunghi. @@ -3572,6 +4217,8 @@ Vuoi installare uno dei due pacchetti ora? Impossibile usare l'uovo generazione al momento. Hai raggiunto il numero massimo di calamari. +Impossibile usare l'uovo generazione al momento. È stato raggiunto il numero massimo di pipistrelli per mondo. + Impossibile usare Uovo rigenerazione al momento. È stato raggiunto il numero massimo di nemici nel mondo. Impossibile usare Uovo rigenerazione al momento. È stato raggiunto il numero massimo di villici nel mondo. @@ -3580,12 +4227,14 @@ Vuoi installare uno dei due pacchetti ora? Non puoi generare nemici in modalità Relax. -Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di maiali, pecore, mucche e gatti. +Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di maiali, pecore, mucche, gatti e cavalli. Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di riproduzione di lupi. Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di riproduzione di galline. +Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di riproduzione di cavalli. + Questo animale non può entrare in "modalità Amore". Hai raggiunto il numero massimo di riproduzione di muccafunghi. È stato raggiunto il numero massimo di navi per mondo. @@ -3613,27 +4262,43 @@ Vuoi installare uno dei due pacchetti ora? Riconoscimenti Reinstalla contenuto - + Impostazioni debug - + Diffusione incendio - + Esplosione TNT - + Giocatore vs Giocatore - + Autorizza giocatori - + Privilegi dell'host - + Genera strutture - + Mondo superpiatto - + Cassa bonus - + Opzioni mondo - + +Opzioni di gioco + +Immutabilità + +Mantieni inventario + +Generazione mostri + +Bottino mostri + +Rilascio blocchi + +Rigenerazione naturale + +Ciclo giorno/notte + Può costruire e scavare Può usare porte e interruttori @@ -3820,6 +4485,14 @@ Vuoi installare uno dei due pacchetti ora? Veleno +Avvizzito + +Bonus salute + +Assorbimento + +Saturazione + della Velocità della Lentezza @@ -3858,6 +4531,14 @@ Vuoi installare uno dei due pacchetti ora? del Veleno +del decadimento + +del bonus salute + +dell'assorbimento + +della saturazione + II @@ -3954,6 +4635,22 @@ Vuoi installare uno dei due pacchetti ora? Riduce progressivamente la salute di giocatori, animali e mostri affetti. +Quando applicato: + +Forza salto cavallo + +Rinforzi zombie + +Salute massima + +Distanza inseguimento mostri + +Resistenza ad atterramento + +Velocità + +Danno attacco + Acutezza Percossa @@ -4044,7 +4741,7 @@ Vuoi installare uno dei due pacchetti ora? Fa recuperare 3 {*ICON_SHANK_01*}. Si crea cucinando una patata nella fornace. -Reintegra 1 {*ICON_SHANK_01*}, o si può cucinare nella fornace. Si può piantare sulle zolle. Può avvelenarti. +Fa recuperare 1 {*ICON_SHANK_01*}. Può avvelenarti. Reintegra 3 {*ICON_SHANK_01*}. Si realizza usando una carota e delle pepite d'oro. @@ -4092,7 +4789,7 @@ Vuoi installare uno dei due pacchetti ora? Muro di ciottoli -Muro di ciottoli coperto di muschio +Muro di ciottoli muschiato Vaso di fiori diff --git a/Minecraft.Client/Common/Media/ja-JP/4J_strings.resx b/Minecraft.Client/Common/Media/ja-JP/4J_strings.resx index 63927afe..5ef7111d 100644 --- a/Minecraft.Client/Common/Media/ja-JP/4J_strings.resx +++ b/Minecraft.Client/Common/Media/ja-JP/4J_strings.resx @@ -73,9 +73,9 @@ Xbox LIVE ã«ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã—ã¦ã„ã¾ã›ã‚“ -ã“ã®ã‚²ãƒ¼ãƒ ã®ä¸€éƒ¨ã®æ©Ÿèƒ½ã§ã¯ã€Xbox LIVE ã«ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã—ã¦ã„るゲーマー プロフィールãŒå¿…è¦ã¨ãªã‚Šã¾ã™ã€‚ç¾åœ¨ã¯ Xbox LIVE ã«ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã—ã¦ã„ã¾ã›ã‚“ +ã“ã®ã‚²ãƒ¼ãƒ ã®ä¸€éƒ¨ã®æ©Ÿèƒ½ã§ã¯ã€Xbox LIVE ã«ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã—ã¦ã„るゲーマー プロフィールãŒå¿…è¦ã¨ãªã‚Šã¾ã™ã€‚ç¾åœ¨ã¯ Xbox LIVE ã«ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã—ã¦ã„ã¾ã›ã‚“。 -ã“ã®æ©Ÿèƒ½ã‚’使ã†ã«ã¯ã€Xbox LIVE ã«ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã—ã¦ã„るゲーマー プロフィールãŒå¿…è¦ã§ã™ +ã“ã®æ©Ÿèƒ½ã‚’使ã†ã«ã¯ã€Xbox LIVE ã«ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã—ã¦ã„るゲーマー プロフィールãŒå¿…è¦ã§ã™ã€‚ Xbox LIVE ã«ã‚µã‚¤ãƒ³ã‚¤ãƒ³ @@ -100,7 +100,7 @@ 完全版を購入 ã“れ㯠Minecraft ã®ãŠè©¦ã—版ã§ã™ã€‚完全版ã§ã‚れã°ã€ä»Šã™ãç²å¾—ã§ãる実績ãŒã‚りã¾ã™! -完全版を購入ã—ã¦ã€Xbox LIVE を通ã˜ã¦ä¸–界中ã®ãƒ•レンドã¨ä¸€ç·’ã«éŠã¹ã‚‹Minecraft ã®æ¥½ã—ã•を体験ã—ã¦ãã ã•ã„。 +完全版を購入ã—ã¦ã€Xbox LIVE を通ã˜ã¦ä¸–界中ã®ãƒ•レンドã¨ä¸€ç·’ã«éŠã¹ã‚‹ Minecraft ã®æ¥½ã—ã•を体験ã—ã¦ãã ã•ã„。 完全版を購入ã—ã¾ã™ã‹? プロフィールã®èª­ã¿è¾¼ã¿ã«å•題ãŒç™ºç”Ÿã—ãŸãŸã‚ã€ãƒ¡ã‚¤ãƒ³ ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã«æˆ»ã‚Šã¾ã™ diff --git a/Minecraft.Client/Common/Media/ja-JP/strings.resx b/Minecraft.Client/Common/Media/ja-JP/strings.resx index 132435fb..5326fb11 100644 --- a/Minecraft.Client/Common/Media/ja-JP/strings.resx +++ b/Minecraft.Client/Common/Media/ja-JP/strings.resx @@ -159,7 +159,7 @@ Minecraft ã¯è‡ªç”±ãªç™ºæƒ³ã§ãƒ–ロックをç©ã¿ä¸Šã’ã¦ã€æŽ¢æ¤œã—ãŸã‚Š çµŒé¨“å€¤ã‚²ãƒ¼ã‚¸ã‚‚ç”»é¢ã«è¡¨ç¤ºã•れã€ç¾åœ¨ã®çµŒé¨“å€¤ãƒ¬ãƒ™ãƒ«ã¨æ¬¡ã®ãƒ¬ãƒ™ãƒ«ã¾ã§ã«å¿…è¦ãªå€¤ã‚’確èªã§ãã¾ã™ã€‚ 経験値ã¯ã€ç”Ÿã物を倒ã—ãŸæ™‚ã€ç‰¹å®šã®ãƒ–ロックを採掘ã—ãŸæ™‚ã€å‹•ç‰©ã‚’ç¹æ®–ã•ã›ãŸæ™‚ã€é‡£ã‚Šã€ã‹ã¾ã©ã§é‰±çŸ³ã‚’製錬ã—ãŸæ™‚ãªã©ã«ç²å¾—ã§ãる経験値オーブを集ã‚ã‚‹ã¨è²¯ã¾ã£ã¦ã„ãã¾ã™ã€‚{*B*}{*B*} ã•らã«ä½¿ç”¨ã§ãるアイテムも表示ã•れã€{*CONTROLLER_ACTION_LEFT_SCROLL*} 㨠{*CONTROLLER_ACTION_RIGHT_SCROLL*} ã§æ‰‹ã«æŒã¤ã‚¢ã‚¤ãƒ†ãƒ ã‚’切り替ãˆã‚‰ã‚Œã¾ã™ -{{*T3*}éŠã³æ–¹: æŒã¡ç‰©{*ETW*}{*B*}{*B*} +{*T3*}éŠã³æ–¹: æŒã¡ç‰©{*ETW*}{*B*}{*B*} æŒã¡ç‰©ã¯ {*CONTROLLER_ACTION_INVENTORY*} ã§è¦‹ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚{*B*}{*B*} ã“ã®ç”»é¢ã§ã¯ã€æ‰‹ã«ã—ã¦ã„る使用å¯èƒ½ãªã‚¢ã‚¤ãƒ†ãƒ ã€æ‰€æœ‰ã—ã¦ã„るアイテムã®ãƒªã‚¹ãƒˆã€ç¾åœ¨è£…å‚™ã—ã¦ã„る防具を確èªã§ãã¾ã™ã€‚{*B*}{*B*} ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’ {*CONTROLLER_MENU_NAVIGATE*} ã§å‹•ã‹ã—ã¦ã€ã‚¢ã‚¤ãƒ†ãƒ ã«åˆã‚ã›ã¦ã‹ã‚‰ {*CONTROLLER_VK_A*} を押ã™ã¨ã€ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã§ãã¾ã™ã€‚ãã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’複数所有ã—ã¦ã„ã‚‹å ´åˆã¯ã€ãã®ã™ã¹ã¦ãŒé¸æŠžã•れã¾ã™ã€‚åŠåˆ†ã ã‘é¸æŠžã™ã‚‹ã«ã¯ {*CONTROLLER_VK_X*} を使用ã—ã¾ã™ã€‚{*B*}{*B*} @@ -231,7 +231,7 @@ Minecraft ã¯è‡ªç”±ãªç™ºæƒ³ã§ãƒ–ロックをç©ã¿ä¸Šã’ã¦ã€æŽ¢æ¤œã—ãŸã‚Š ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã«å¿…è¦ãªçµŒé¨“値ã¯ã€ä¸è¶³ã—ã¦ã„ã‚‹å ´åˆã¯èµ¤ã€è¶³ã‚Šã¦ã„ã‚‹å ´åˆã¯ç·‘ã§è¡¨ç¤ºã•れã¾ã™ã€‚{*B*}{*B*} エンãƒãƒ£ãƒ³ãƒˆã¯æ¶ˆè²»å¯èƒ½ãªçµŒé¨“値ã®ç¯„囲ã§ãƒ©ãƒ³ãƒ€ãƒ ã«é¸æŠžã•れã¾ã™ã€‚{*B*}{*B*} エンãƒãƒ£ãƒ³ãƒˆãƒ†ãƒ¼ãƒ–ルã®å‘¨å›²ã«ã€ãƒ†ãƒ¼ãƒ–ルã¨ãƒ–ロック 1 ã¤åˆ†ã®ã™ã間を空ã‘ã¦æœ¬æ£š (最大 15 å°) を並ã¹ã‚‹ã“ã¨ã§ã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã®ãƒ¬ãƒ™ãƒ«ãŒä¸ŠãŒã‚Šã¾ã™ã€‚ã¾ãŸæœ¬æ£šã‹ã‚‰ãƒ†ãƒ¼ãƒ–ãƒ«ä¸Šã®æœ¬ã«å‘ã‘ã¦æ–‡å­—ãŒæµã‚Œè¾¼ã‚€ã‚¨ãƒ•ェクトãŒè¡¨ç¤ºã•れã¾ã™ã€‚{*B*}{*B*} -エンãƒãƒ£ãƒ³ãƒˆãƒ†ãƒ¼ãƒ–ルã«å¿…è¦ãªææ–™ã¯ã™ã¹ã¦æ‘や採掘ã€è¾²è€•ãªã©ã§æ‰‹ã«å…¥ã‚Šã¾ã™ã€‚{*B*}{*B} +エンãƒãƒ£ãƒ³ãƒˆãƒ†ãƒ¼ãƒ–ルã«å¿…è¦ãªææ–™ã¯ã™ã¹ã¦æ‘や採掘ã€è¾²è€•ãªã©ã§æ‰‹ã«å…¥ã‚Šã¾ã™ã€‚{*B*}{*B*} エンãƒãƒ£ãƒ³ãƒˆã—ãŸæœ¬ã¯é‡‘床を使ã£ã¦ã‚¢ã‚¤ãƒ†ãƒ ã‚’エンãƒãƒ£ãƒ³ãƒˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“れã«ã‚ˆã‚Šã‚¢ã‚¤ãƒ†ãƒ ã«ã‚ˆã‚Šå¤šãã®ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã‚’é¸æŠžã™ã‚‹ã“ã¨ãŒã§ãã¾ã™{*B*} @@ -280,9 +280,9 @@ Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ゲーム㫠{*CONTROLLER_ACTION_DPAD_LEFT*} ã§å·¦ã«ã€{*CONTROLLER_ACTION_DPAD_RIGHT*} ã§å³ã«é£›ã¹ã¾ã™ {*T3*}éŠã³æ–¹: ホストã¨ãƒ—レイヤーã®ã‚ªãƒ—ション{*ETW*}{*B*}{*B*} - + {*T1*}ゲーム オプション{*ETW*}{*B*} -世界をロードã¾ãŸã¯ç”Ÿæˆã™ã‚‹éš›ã€[ãã®ä»–ã®ã‚ªãƒ—ション] ã‚’é¸æŠžã—ã¦ã€ã‚ˆã‚Šè©³ç´°ãªè¨­å®šãŒã§ãるよã†ã«ãªã‚Šã¾ã—ãŸã€‚{*B*}{*B*} +世界をロードã¾ãŸã¯ç”Ÿæˆã™ã‚‹éš›ã€[ãã®ä»–ã®ã‚ªãƒ—ション] ã‚’é¸æŠžã—ã¦ã€ã•らã«è©³ç´°ãªè¨­å®šãŒã§ãるよã†ã«ãªã‚Šã¾ã—ãŸã€‚{*B*}{*B*} {*T2*}PvP{*ETW*}{*B*} 有効ã«ã™ã‚‹ã¨ã€ãƒ—レイヤーãŒä»–ã®ãƒ—レイヤーã«ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’与ãˆã‚‰ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ (サãƒã‚¤ãƒãƒ« モードã®ã¿)。{*B*}{*B*} @@ -299,6 +299,27 @@ Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ゲーム㫠{*T2*}ホスト特権{*ETW*}{*B*} 有効ã«ã™ã‚‹ã¨ã€ãƒ›ã‚¹ãƒˆã®é£›è¡Œèƒ½åŠ›ã€ç–²åŠ´ç„¡åŠ¹ã€ã‚²ãƒ¼ãƒ å†…メニューã§ã®éžè¡¨ç¤ºã‚’切り替ãˆã‚‰ã‚Œã¾ã™ã€‚{*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + {*T2*}時刻ã®å¤‰åŒ–{*ETW*}{*B*} + 無効ã«ã™ã‚‹ã¨ã€æ™‚刻ãŒå¤‰ã‚りã¾ã›ã‚“。{*B*}{*B*} + + {*T2*}æŒã¡ç‰©ã®ä¿æŒ{*ETW*}{*B*} + 有効ã«ã™ã‚‹ã¨ã€ã‚²ãƒ¼ãƒ ã‚ªãƒ¼ãƒãƒ¼æ™‚ã«ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ã®æŒã¡ç‰©ãŒå¤±ã‚れã¾ã›ã‚“。{*B*}{*B*} + + {*T2*}生ã物ã®å‡ºç¾{*ETW*}{*B*} + 無効ã«ã™ã‚‹ã¨ã€ç”Ÿã物ã¯è‡ªç„¶ã«å‡ºç¾ã—ã¾ã›ã‚“。{*B*}{*B*} + + {*T2*}生ã物ã«ã‚ˆã‚‹å¦¨å®³{*ETW*}{*B*} + 無効ã«ã™ã‚‹ã¨ã€ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ã‚„動物ãŒãƒ–ロックを変更ã—ãŸã‚Š (例: Creeper ãŒçˆ†ç™ºã—ã¦ã‚‚ブロックãŒç ´å£Šã•れãªã„ã€ç¾ŠãŒè‰ã‚’å–り除ã‹ãªã„)ã€ã‚¢ã‚¤ãƒ†ãƒ ã‚’拾ã„ã¾ã›ã‚“。{*B*}{*B*} + + {*T2*}生ã物ã‹ã‚‰ã®æˆ¦åˆ©å“{*ETW*}{*B*} + 無効ã«ã™ã‚‹ã¨ã€ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ã‚„å‹•ç‰©ã¯æˆ¦åˆ©å“をドロップã—ã¾ã›ã‚“ (例: Creeper ã¯ç«è–¬ã‚’ドロップã—ãªã„)。{*B*}{*B*} + + {*T2*}タイルã‹ã‚‰ã®ã‚¢ã‚¤ãƒ†ãƒ å…¥æ‰‹{*ETW*}{*B*} + 無効ã«ã™ã‚‹ã¨ã€ãƒ–ロックを壊ã—ã¦ã‚‚アイテムをè½ã¨ã—ã¾ã›ã‚“ (例: 石ブロックãŒä¸¸çŸ³ã‚’è½ã¨ã•ãªã„)。{*B*}{*B*} + + {*T2*}自然å†ç”Ÿ{*ETW*}{*B*} + 無効ã«ã™ã‚‹ã¨ã€ãƒ—レイヤー㮠HP ã¯è‡ªç„¶ã«å†ç”Ÿã•れã¾ã›ã‚“。{*B*}{*B*} + {*T1*}世界ã®ç”Ÿæˆã®ã‚ªãƒ—ション{*ETW*}{*B*} 世界ã®ç”Ÿæˆã«ã‚ªãƒ—ションãŒè¿½åŠ ã•れã¾ã—ãŸã€‚{*B*}{*B*} @@ -315,7 +336,7 @@ Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ゲーム㫠有効ã«ã™ã‚‹ã¨æš—黒界をå†ç”Ÿæˆã—ã¾ã™ã€‚æš—é»’ç ¦ãŒå­˜åœ¨ã—ãªã„セーブ データãŒã‚ã‚‹å ´åˆã«ä¾¿åˆ©ã§ã™{*B*}{*B*} {*T1*}ゲーム内ã®ã‚ªãƒ—ション{*ETW*}{*B*} - ゲーム中㫠BACK を押ã™ã¨ã€æ§˜ã€…ãªã‚ªãƒ—ション メニューを開ãã“ã¨ãŒã§ãã¾ã™ã€‚{*B*}{*B*} + ゲーム中㫠{*BACK_BUTTON*} を押ã™ã¨ã€æ§˜ã€…ãªã‚ªãƒ—ション メニューを開ãã“ã¨ãŒã§ãã¾ã™ã€‚{*B*}{*B*} {*T2*}ホスト オプション{*ETW*}{*B*} ホストプレイヤー㨠[ホストオプションを変更ã§ãã‚‹] ã«è¨­å®šã•れãŸãƒ—レイヤー㯠[ホスト オプション] メニューを使用ã§ãã¾ã™ã€‚ã“ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã§ã¯ç«ã®å»¶ç„¼ã‚„ TNT ã®çˆ†ç™ºãªã©ã‚’切り替ãˆã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚{*B*}{*B*} @@ -333,7 +354,7 @@ Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ゲーム㫠[é«˜åº¦ãªæ“作を許å¯] を無効ã«ã—ã¦ã„ã‚‹å ´åˆã®ã¿ä½¿ãˆã‚‹ã‚ªãƒ—ションã§ã™ã€‚無効ã«ã™ã‚‹ã¨ã€ã“ã®ã‚²ãƒ¼ãƒ ã«å‚加ã—ãŸãƒ—レイヤーã¯ãƒã‚§ã‚¹ãƒˆãªã©ã®å…¥ã‚Œç‰©ã‚’使用ã§ãã¾ã›ã‚“。{*B*}{*B*} {*T2*}プレイヤーを攻撃å¯èƒ½{*ETW*}{*B*} - [é«˜åº¦ãªæ“作を許å¯] を無効ã«ã—ã¦ã„ã‚‹å ´åˆã®ã¿ä½¿ãˆã‚‹ã‚ªãƒ—ションã§ã™ã€‚無効ã«ã™ã‚‹ã¨ã€ãƒ—レイヤーãŒä»–ã®ãƒ—レイヤーã«ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’与ãˆã‚‰ã‚Œãªããªã‚Šã¾ã™ã€‚{*B*}{*B*} + [é«˜åº¦ãªæ“作を許å¯] を無効ã«ã—ã¦ã„ã‚‹å ´åˆã®ã¿ä½¿ãˆã‚‹ã‚ªãƒ—ションã§ã™ã€‚無効ã«ã™ã‚‹ã¨ã€ãƒ—レイヤーãŒä»–ã®ãƒ—レイヤーã«ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’与ãˆã‚‰ã‚Œãªããªã‚Šã¾ã™ã€‚{*B*}{*B*} {*T2*}動物を攻撃å¯èƒ½{*ETW*}{*B*} [é«˜åº¦ãªæ“作を許å¯] を無効ã«ã—ã¦ã„ã‚‹å ´åˆã®ã¿ä½¿ãˆã‚‹ã‚ªãƒ—ションã§ã™ã€‚無効ã«ã™ã‚‹ã¨ã€ãƒ—レイヤーãŒå‹•物ã«ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’与ãˆã‚‰ã‚Œãªããªã‚Šã¾ã™ã€‚{*B*}{*B*} @@ -342,12 +363,12 @@ Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ゲーム㫠ã“ã®è¨­å®šã‚’有効ã«ã™ã‚‹ã¨ã€ãã®ãƒ—レイヤーã¯ã€Œé«˜åº¦ãªæ“作を許å¯ã€ãŒç„¡åйã®å ´åˆã«ã€ãƒ›ã‚¹ãƒˆã‚’除ãä»–ã®ãƒ—レイヤーã®ç‰¹æ¨©ã‚„ã€ãƒ—レイヤーã®è¿½æ”¾ã€ç«ã®å»¶ç„¼ã¨ TNT ã®çˆ†ç™ºã®è¨­å®šãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚{*B*}{*B*} {*T2*}プレイヤーを追放{*ETW*}{*B*} - ホストプレイヤーã¨åŒã˜ {*PLATFORM_NAME*} を使用ã—ã¦ã„ãªã„プレイヤーã«å¯¾ã—ã¦ã“ã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠžã™ã‚‹ã¨ã€ãã®ãƒ—レイヤーãŠã‚ˆã³å¯¾è±¡ãƒ—レイヤーã¨åŒã˜ {*PLATFORM_NAME*} を使用ã—ã¦ã„ã‚‹ä»–ã®ãƒ—レイヤーãŒã‚²ãƒ¼ãƒ ã‹ã‚‰è¿½æ”¾ã•れã¾ã™ã€‚追放ã•れãŸãƒ—レイヤーã¯ã€ã‚²ãƒ¼ãƒ ãŒå†èµ·å‹•ã•れるã¾ã§ã¯å†ã³å‚加ã§ãã¾ã›ã‚“。{*B*}{*B*} + {*KICK_PLAYER_DESCRIPTION*}*}{*B*}{*B*} {*T1*}ホストプレイヤー オプション{*ETW*}{*B*} [ホスト特権] ãŒæœ‰åйã®å ´åˆã€ãƒ›ã‚¹ãƒˆãƒ—レイヤーã¯è‡ªåˆ†ã«ç‰¹æ¨©ã‚’設定ã§ãã¾ã™ã€‚ホスト特権を変更ã™ã‚‹ã«ã¯ã€ãƒ—レイヤーåã‚’é¸æŠžã—㦠{*CONTROLLER_VK_A*} ã§ç‰¹æ¨©ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’é–‹ãã€æ¬¡ã®ã‚ªãƒ—ションを設定ã—ã¦ãã ã•ã„。{*B*}{*B*} - - {*T2*}飛行å¯èƒ½{*ETW*}{*B*} + + {*T2*}飛行å¯èƒ½{*ETW*}{*B*} 有効ã«ã™ã‚‹ã¨ã€é£›è¡Œã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚クリエイティブ モードã§ã¯å…¨ãƒ—レイヤーãŒé£›è¡Œã§ãã‚‹ãŸã‚ã€ã‚µãƒã‚¤ãƒãƒ« モードã«ã®ã¿é©ç”¨ã•れã¾ã™ã€‚{*B*}{*B*} {*T2*}疲労無効{*ETW*}{*B*} @@ -356,10 +377,13 @@ Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ゲーム㫠{*T2*}ä¸å¯è¦–{*ETW*}{*B*} 有効ã«ã™ã‚‹ã¨ãƒ—レイヤーã¯ä»–ã®ãƒ—レイヤーã‹ã‚‰è¦‹ãˆãªããªã‚Šã€ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚‚å—ã‘ãªããªã‚Šã¾ã™ã€‚{*B*}{*B*} - {*T2*テレãƒãƒ¼ãƒˆå¯èƒ½{*ETW*}{*B*} - 自分や他ã®ãƒ—レイヤーを世界ã«ã„ã‚‹ä»–ã®ãƒ—レイヤーã®å ´æ‰€ã«ç§»å‹•ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ + {*T2*}テレãƒãƒ¼ãƒˆå¯èƒ½{*ETW*}{*B*} + 自分や他ã®ãƒ—レイヤーを世界ã«ã„ã‚‹ä»–ã®ãƒ—レイヤーã®å ´æ‰€ã«ç§»å‹•ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + +ホストプレイヤーã¨åŒã˜ {*PLATFORM_NAME*} を使用ã—ã¦ã„ãªã„プレイヤーã«å¯¾ã—ã¦ã“ã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠžã™ã‚‹ã¨ã€ãã®ãƒ—レイヤーãŠã‚ˆã³å¯¾è±¡ãƒ—レイヤーã¨åŒã˜ {*PLATFORM_NAME*} を使用ã—ã¦ã„ã‚‹ä»–ã®ãƒ—レイヤーãŒã‚²ãƒ¼ãƒ ã‹ã‚‰è¿½æ”¾ã•れã¾ã™ã€‚追放ã•れãŸãƒ—レイヤーã¯ã€ã‚²ãƒ¼ãƒ ãŒå†èµ·å‹•ã•れるã¾ã§ã¯å†ã³å‚加ã§ãã¾ã›ã‚“ + 次㸠å‰ã¸ @@ -423,61 +447,94 @@ Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ゲーム㫠最新情報 -{*T3*}修正ã¨è¿½åŠ {*ETW*}{*B*}{*B*} -- æ–°ã—ã„アイテムを追加ã—ã¾ã—ãŸã€‚エメラルドã€ã‚¨ãƒ¡ãƒ©ãƒ«ãƒ‰é‰±çŸ³ã€ã‚¨ãƒ¡ãƒ©ãƒ«ãƒ‰ã®ãƒ–ロックã€ã‚¨ãƒ³ãƒ€ãƒ¼ ãƒã‚§ã‚¹ãƒˆã€ãƒˆãƒªãƒƒãƒ—ワイヤー フックã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã—ãŸé‡‘ã®ãƒªãƒ³ã‚´ã€é‡‘åºŠã€æ¤æœ¨é‰¢ã€ä¸¸çŸ³ã®å£ã€è‹”ã®ç”ŸãˆãŸä¸¸çŸ³ã®å£ã€ã‚¦ã‚£ã‚¶ãƒ¼ã®çµµã€ã‚¸ãƒ£ã‚¬ã‚¤ãƒ¢ã€ãƒ™ã‚¤ã‚¯ãƒ‰ ãƒãƒ†ãƒˆï½¤æœ‰æ¯’ãªã‚¸ãƒ£ã‚¬ã‚¤ãƒ¢ã€ãƒ‹ãƒ³ã‚¸ãƒ³ã€é‡‘ã®ãƒ‹ãƒ³ã‚¸ãƒ³ã€æ£’付ãã®ãƒ‹ãƒ³ã‚¸ãƒ³ -パンプキン ãƒ‘ã‚¤ã€æš—視ã®ãƒãƒ¼ã‚·ãƒ§ãƒ³ã€ä¸å¯è¦–ã®ãƒãƒ¼ã‚·ãƒ§ãƒ³ã€é—‡ã®ã‚¯ã‚©ãƒ¼ãƒ„ã€é—‡ã®ã‚¯ã‚©ãƒ¼ãƒ„鉱石ã€ã‚¯ã‚©ãƒ¼ãƒ„ã®ãƒ–ロックã€ã‚¯ã‚©ãƒ¼ãƒ„ã®åŽšæ¿ã€ã‚¯ã‚©ãƒ¼ãƒ„ã®éšŽæ®µã€æ¨¡æ§˜å…¥ã‚Šã®ã‚¯ã‚©ãƒ¼ãƒ„ã®ãƒ–ãƒ­ãƒƒã‚¯ã€æŸ±çжã®ã‚¯ã‚©ãƒ¼ãƒ„ã®ãƒ–ロックã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã—ãŸæœ¬ã€ã‚«ãƒ¼ãƒšãƒƒãƒˆã€‚{*B*} -- ãªã‚らã‹ãªç ‚å²©ã¨æ¨¡æ§˜å…¥ã‚Šã®ç ‚å²©ã®æ–°ã—ã„レシピを追加ã—ã¾ã—ãŸã€‚{*B*} -- æ–°ã—ã„ç”Ÿç‰©ã€æ‘人ゾンビを追加ã—ã¾ã—ãŸã€‚{*B*} -- æ–°ã—ã„åœ°å½¢ç”Ÿæˆæ©Ÿèƒ½ã‚’追加ã—ã¾ã—ãŸã€‚ç ‚æ¼ ã®ç¥žæ®¿ã€ç ‚æ¼ ã®æ‘ã€ã‚¸ãƒ£ãƒ³ã‚°ãƒ«ã®ç¥žæ®¿ã€‚{*B*} -- æ‘人ã¨ã®å–引を追加ã—ã¾ã—ãŸã€‚{*B*} -- 金床ã®ç”»é¢ã‚’追加ã—ã¾ã—ãŸã€‚{*B*} -- é©ã®ã‚¢ãƒ¼ãƒžãƒ¼ã‚’染色ã§ãã¾ã™ã€‚{*B*} -- オオカミã®é¦–輪を染色ã§ãã¾ã™ã€‚{*B*} -- 棒付ãã®ãƒ‹ãƒ³ã‚¸ãƒ³ã§ä¹—り物ã®è±šã‚’æ“縦ã§ãã¾ã™ã€‚{*B*} -- ボーナス ãƒã‚§ã‚¹ãƒˆ コンテンツã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’増やã—ã¾ã—ãŸã€‚{*B*} -- ãƒãƒ¼ãƒ•ブロックã¨ãƒãƒ¼ãƒ•ブロック上ã®ãã®ä»–ã®ãƒãƒ¼ãƒ•ブロックã®é…置を変更ã—ã¾ã—ãŸã€‚{*B*} -- 上下逆ã®éšŽæ®µã¨åŽšæ¿ã®é…置を変更ã—ã¾ã—ãŸã€‚{*B*} -- ç•°ãªã‚‹æ‘人ã®è·æ¥­ã‚’追加ã—ã¾ã—ãŸã€‚{*B*} -- スãƒãƒ¼ãƒ³ エッグã‹ã‚‰å‡ºç¾ã—ãŸæ‘人ã®è·æ¥­ãŒãƒ©ãƒ³ãƒ€ãƒ ã«ãªã‚Šã¾ã™ã€‚{*B*} -- 横é“ã®ä¸¸å¤ªã®é…置を追加ã—ã¾ã—ãŸã€‚{*B*} -- 木ã®é“å…·ã‚’ã‹ã¾ã©ã®ç‡ƒæ–™ã¨ã—ã¦ä½¿ç”¨ã§ãã¾ã™ã€‚{*B*} -- æ°·æ¿ã¨ã‚¬ãƒ©ã‚¹æ¿ã‚’技能ã§ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã—ãŸé“å…·ã§å›žåŽã§ãã¾ã™ã€‚{*B*} -- 木ã®ãƒœã‚¿ãƒ³ã¨æœ¨ã®ãƒ—レッシャー プレートを矢ã§èµ·å‹•ã§ãã¾ã™ã€‚{*B*} -- é—‡ã®ç”Ÿç‰©ãŒåœ°ä¸Šç•Œã®ãƒãƒ¼ã‚¿ãƒ«ã‹ã‚‰ç™ºç”Ÿã—ã¾ã™ã€‚{*B*} -- Creeperã¨ã‚¯ãƒ¢ãŒã€æœ€å¾Œã«æ”»æ’ƒã—ã¦ããŸãƒ—レイヤーã«å¯¾ã—ã¦æ”»æ’ƒçš„ã«ãªã‚Šã¾ã™ã€‚{*B*} -- クリエイティブ モードã®ç”Ÿç‰©ãŒçŸ­æ™‚é–“ã§ä¸­ç«‹ã«æˆ»ã‚Šã¾ã™ã€‚{*B*} -- 溺れã¦ã„る時ã®ãƒŽãƒƒã‚¯ãƒãƒƒã‚¯ã‚’排除ã—ã¾ã—ãŸã€‚{*B*} -- ゾンビã«å£Šã•れã¦ã„るドアã®ãƒ€ãƒ¡ãƒ¼ã‚¸ãŒè¡¨ç¤ºã•れã¾ã™ã€‚{*B*} -- 暗黒界ã§ã¯æ°·ãŒæº¶ã‘ã¾ã™ã€‚{*B*} -- 雨ãŒé™ã£ã¦ã„る時ã«å¤§é‡œã‚’外ã«å‡ºã™ã¨ä¸€æ¯ã«ãªã‚Šã¾ã™ã€‚{*B*} -- ãƒ”ã‚¹ãƒˆãƒ³ã®æ›´æ–°ã« 2 å€ã®æ™‚é–“ãŒã‹ã‹ã‚Šã¾ã™ã€‚{*B*} -- 豚を殺ã™ã¨éžã‚’è½ã¨ã—ã¾ã™ (éžã‚’ç€ã‘ã¦ã„ã‚‹å ´åˆ)。{*B*} -- æžœã¦ã®ä¸–界ã®ç©ºã®è‰²ã‚’変更ã—ã¾ã—ãŸã€‚{*B*} -- ã²ã‚‚ (トップワイヤー用) を付ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚{*B*} -- 雨ãŒè‘‰ã®é–“ã‚’ã—ãŸãŸã‚Šè½ã¡ã¾ã™ã€‚{*B*} -- ブロックã®ä¸‹ã«ãƒ¬ãƒãƒ¼ã‚’付ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚{*B*} -- 難易度設定ã«ã‚ˆã£ã¦ TNT ãŒã•ã¾ã–ã¾ãªãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’与ãˆã¾ã™ã€‚{*B*} -- 本ã®ãƒ¬ã‚·ãƒ”を変更ã—ã¾ã—ãŸã€‚{*B*} -- スイレンã®è‘‰ãŒãƒœãƒ¼ãƒˆã‚’壊ã™ä»£ã‚りã«ã€ãƒœãƒ¼ãƒˆãŒã‚¹ã‚¤ãƒ¬ãƒ³ã®è‘‰ã‚’壊ã—ã¾ã™ã€‚{*B*} -- 豚ã®è½ã¨ã™è±šè‚‰ã‚’増やã—ã¾ã—ãŸã€‚{*B*} -- スーパーフラットã§ç™ºç”Ÿã™ã‚‹ã‚¹ãƒ©ã‚¤ãƒ ã‚’減らã—ã¾ã—ãŸã€‚{*B*} -- Creeper ã®ãƒ€ãƒ¡ãƒ¼ã‚¸å¤‰æ•°ãŒé›£æ˜“度設定ã«åŸºã¥ãã€ãƒŽãƒƒã‚¯ãƒãƒƒã‚¯ã‚’増やã—ã¾ã—ãŸã€‚{*B*} -- EndermanãŒã‚¢ã‚´ã‚’é–‹ã‹ãªã„ã¨ã„ã†å•題を修正ã—ã¾ã—ãŸã€‚{*B*} -- プレイヤーã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’追加ã—ã¾ã—㟠(ゲーム内㮠BACK メニューを使用)。{*B*} -- リモート プレイヤー用ã®é£›è¡Œã€ä¸å¯è¦–ã€ä¸æ­»èº«ã®æ–°ã—ã„ホスト オプションを追加ã—ã¾ã—ãŸã€‚{*B*} -- æ–°ã—ã„ã‚¢ã‚¤ãƒ†ãƒ ã¨æ©Ÿèƒ½ã®ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã‚’追加ã—ã¾ã—ãŸã€‚{*B*} -- ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã®éŸ³æ¥½ãƒ‡ã‚£ã‚¹ã‚¯ ãƒã‚§ã‚¹ãƒˆã®ä½ç½®ã‚’変更ã—ã¾ã—ãŸ{*B*} - + +{*T3*}修正ã¨è¿½åŠ {*ETW*}{*B*}{*B*} +- æ–°ã—ã„アイテムを追加ã—ã¾ã—ãŸã€‚堅焼ã粘土ã€è‰²ä»˜ã粘土ã€çŸ³ç‚­ã®ãƒ–ロックã€å¹²ã—è‰ã®ä¿µã€ã‚¢ã‚¯ãƒ†ã‚£ãƒ™ãƒ¼ã‚¿ãƒ¼ レールã€ãƒ¬ãƒƒãƒ‰ã‚¹ãƒˆãƒ¼ãƒ³ã®ãƒ–ãƒ­ãƒƒã‚¯ã€æ—¥ç…§ã‚»ãƒ³ã‚µãƒ¼ã€ãƒ‰ãƒ­ãƒƒãƒ‘ーã€ãƒ›ãƒƒãƒ‘ーã€ãƒ›ãƒƒãƒ‘ー付ãトロッコã€TNT 付ãトロッコã€ãƒ¬ãƒƒãƒ‰ã‚¹ãƒˆãƒ¼ãƒ³ コンパレーターã€é‡é‡æ„ŸçŸ¥æ¿ã€ãƒ“ーコンã€ãƒˆãƒ©ãƒƒãƒ— ãƒã‚§ã‚¹ãƒˆã€ãƒ­ã‚±ãƒƒãƒˆèбç«ã€èбç«ã®æ˜Ÿã€ãƒã‚¶ãƒ¼ スターã€é¦–ã²ã‚‚ã€é¦¬ã‚ˆã‚ã„ã€å札ã€é¦¬ã®ã‚¹ãƒãƒ¼ãƒ³ エッグを追加ã—ã¾ã—ãŸã€‚{*B*} +- æ–°ã—ã„生ã物ã€ã‚¦ã‚£ã‚¶ãƒ¼ã€ã‚¦ã‚£ã‚¶ãƒ¼ スケルトンã€ã‚¦ã‚£ãƒƒãƒã€ã‚³ã‚¦ãƒ¢ãƒªã€é¦¬ã€ãƒ­ãƒã€ãŠã‚ˆã³ãƒ©ãƒã‚’追加ã—ã¾ã—ãŸã€‚{*B*} +- æ–°ã—ã„åœ°å½¢ç”Ÿæˆæ©Ÿèƒ½ã€ã‚¦ã‚£ãƒƒãƒã®å°å±‹ã‚’追加ã—ã¾ã—ãŸã€‚{*B*} +- ビーコンã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェイスを追加ã—ã¾ã—ãŸã€‚{*B*} +- 馬ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェイスを追加ã—ã¾ã—ãŸã€‚{*B*} +- ホッパーã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェイスを追加ã—ã¾ã—ãŸã€‚{*B*} +- 花ç«ã‚’追加ã—ã¾ã—ãŸã€‚花ç«ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェイスã«ã¯ã€èбç«ã®æ˜Ÿã¾ãŸã¯ãƒ­ã‚±ãƒƒãƒˆèбç«ã‚’作るãŸã‚ã®ææ–™ã‚’æ‰€æŒã—ã¦ã„ã‚‹å ´åˆã€ä½œæ¥­å°ã‹ã‚‰ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚{*B*} +- 「アドベンãƒãƒ£ãƒ¼ モードã€ã‚’追加ã—ã¾ã—ãŸã€‚ãƒ–ãƒ­ãƒƒã‚¯ã¯æ­£ã—ã„ツールã§ã®ã¿å£Šã™ã“ã¨ãŒã§ãã¾ã™ã€‚{*B*} +- æ–°ã—ã„サウンドを多数追加ã—ã¾ã—ãŸã€‚{*B*} +- 生ã物ã€ã‚¢ã‚¤ãƒ†ãƒ ã€ç™ºå°„物もã€ãƒãƒ¼ã‚¿ãƒ«ã‚’通れるよã†ã«ãªã‚Šã¾ã—ãŸã€‚{*B*} +- ãƒªãƒ”ãƒ¼ã‚¿ãƒ¼ã«æ¨ªã‹ã‚‰åˆ¥ã®ãƒªãƒ”ーターã§é›»æºã‚’é€ã‚‹ã“ã¨ã§ã€ãƒ­ãƒƒã‚¯ã§ãるよã†ã«ãªã‚Šã¾ã—ãŸã€‚{*B*} +- ゾンビã¨ã‚¹ã‚±ãƒ«ãƒˆãƒ³ã¯ç•°ãªã£ãŸæ­¦å™¨ã¨é˜²å…·ã‚’装備ã—ã¦å‡ºç¾ã™ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã—ãŸã€‚{*B*} +- æ–°ã—ã„ゲームオーãƒãƒ¼ メッセージ。{*B*} +- åæœ­ã‚’使ã£ã¦ç”Ÿã物ã«åå‰ã‚’付ã‘ãŸã‚Šã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’é–‹ã„ãŸçŠ¶æ…‹ã§å…¥ã‚Œç‰©ã®åå‰ã‚’変ãˆã¦ã‚¿ã‚¤ãƒˆãƒ«ã‚’変更ã—ã¾ã™ã€‚{*B*} +- 骨粉を使ã£ã¦ã‚‚ã™ã¹ã¦ãŒçž¬æ™‚ã«æˆé•·ã—ãªããªã‚Šã¾ã—ãŸã€‚æˆé•·ã¯ãƒ©ãƒ³ãƒ€ãƒ ã«æ®µéšŽçš„ã«ãªã‚Šã¾ã™ã€‚{*B*} +- ãƒã‚§ã‚¹ãƒˆã€èª¿åˆå°ã€ç™ºå°„装置ã€ã‚¸ãƒ¥ãƒ¼ã‚¯ãƒœãƒƒã‚¯ã‚¹ã®ä¸­èº«ã‚’示ã™ãƒ¬ãƒƒãƒ‰ã‚¹ãƒˆãƒ¼ãƒ³ä¿¡å·ã¯ã€ãƒ¬ãƒƒãƒ‰ã‚¹ãƒˆãƒ¼ãƒ³ コンパレーターをãã¡ã‚‰ã«å‘ã‘ã¦ç›´æŽ¥è¨­ç½®ã™ã‚Œã°æ¤œå‡ºã§ãã¾ã™ã€‚{*B*} +- 発射装置ã¯ã©ã®æ–¹å‘ã«ã‚‚å‘ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚{*B*} +- 金ã®ãƒªãƒ³ã‚´ã‚’食ã¹ã‚‹ã¨ã€ãƒ—レイヤーã¯çŸ­æ™‚é–“ã€è¿½åŠ ã®ã€Œå¸åŽã€HP ã‚’ç²å¾—ã§ãã¾ã™ã€‚{*B*} +- 一定ã®ã‚¨ãƒªã‚¢ã«é•·ãã„れã°ã„ã‚‹ã»ã©ã€ãã®ã‚¨ãƒªã‚¢ã§å‡ºç¾ã™ã‚‹ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ã®é›£æ˜“度ãŒä¸ŠãŒã‚Šã¾ã™ã€‚{*B*} {*ETB*}よã†ã“ã! ã¾ã ãŠæ°—ã¥ãã§ãªã„ã‹ã‚‚ã—れã¾ã›ã‚“ãŒã€Minecraft ãŒã‚¢ãƒƒãƒ—デートã•れã¾ã—ãŸã€‚{*B*}{*B*} ã“ã“ã§ã”紹介ã—ã¦ã„ã‚‹ã®ã¯ã€ãƒ•レンドã¨ä¸€ç·’ã«éŠã¹ã‚‹æ–°æ©Ÿèƒ½ã®ã»ã‚“ã®ä¸€éƒ¨ã§ã™ã€‚よãèª­ã‚“ã§æ¥½ã—ãéŠã‚“ã§ãã ã•ã„!{*B*}{*B*} -{*T1*}新アイテム{*ETB*} - エメラルドã€ã‚¨ãƒ¡ãƒ©ãƒ«ãƒ‰é‰±çŸ³ã€ã‚¨ãƒ¡ãƒ©ãƒ«ãƒ‰ã®ãƒ–ロックã€ã‚¨ãƒ³ãƒ€ãƒ¼ ãƒã‚§ã‚¹ãƒˆã€ãƒˆãƒªãƒƒãƒ—ワイヤー フックã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã—ãŸé‡‘ã®ãƒªãƒ³ã‚´ã€é‡‘åºŠã€æ¤æœ¨é‰¢ã€ä¸¸çŸ³ã®å£ã€è‹”ã®ç”ŸãˆãŸä¸¸çŸ³ã®å£ã€ã‚¦ã‚£ã‚¶ãƒ¼ã®çµµã€ã‚¸ãƒ£ã‚¬ã‚¤ãƒ¢ã€ãƒ™ã‚¤ã‚¯ãƒ‰ ãƒãƒ†ãƒˆï½¤æœ‰æ¯’ãªã‚¸ãƒ£ã‚¬ã‚¤ãƒ¢ã€ãƒ‹ãƒ³ã‚¸ãƒ³ã€é‡‘ã®ãƒ‹ãƒ³ã‚¸ãƒ³ã€æ£’付ãã®ãƒ‹ãƒ³ã‚¸ãƒ³ã€ -パンプキン ãƒ‘ã‚¤ã€æš—視ã®ãƒãƒ¼ã‚·ãƒ§ãƒ³ã€ä¸å¯è¦–ã®ãƒãƒ¼ã‚·ãƒ§ãƒ³ã€é—‡ã®ã‚¯ã‚©ãƒ¼ãƒ„ã€é—‡ã®ã‚¯ã‚©ãƒ¼ãƒ„鉱石ã€ã‚¯ã‚©ãƒ¼ãƒ„ã®ãƒ–ロックã€ã‚¯ã‚©ãƒ¼ãƒ„ã®åŽšæ¿ã€ã‚¯ã‚©ãƒ¼ãƒ„ã®éšŽæ®µã€æ¨¡æ§˜å…¥ã‚Šã®ã‚¯ã‚©ãƒ¼ãƒ„ã®ãƒ–ãƒ­ãƒƒã‚¯ã€æŸ±çжã®ã‚¯ã‚©ãƒ¼ãƒ„ã®ãƒ–ロックã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã—ãŸæœ¬ã€ã‚«ãƒ¼ãƒšãƒƒãƒˆã€‚{*B*}{*B*} - {*T1*}æ–°ã—ã„生物{*ETB*} - æ‘人ゾンビ。{*B*}{*B*} -{*T1*}新機能{*ETB*} - æ‘人ã¨ã®å–引ã€é‡‘床ã§ã®æ­¦å™¨ã¨é“å…·ã®ä¿®ç†ã¾ãŸã¯ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã€ã‚¨ãƒ³ãƒ€ãƒ¼ ãƒã‚§ã‚¹ãƒˆã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’ä¿ç®¡ã€æ£’付ãニンジンを使ã£ã¦ä¹—ã£ãŸè±šã®æ“縦!{*B*}{*B*} -{*T1*}æ–°ã—ã„ミニãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«{*ETB*} ? ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã®æ–°æ©Ÿèƒ½ã‚’紹介!{*B*}{*B*} -{*T1*}æ–°ã—ã„「イースター エッグã€{*ETB*} ? ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã®ç§˜å¯†ã®éŸ³æ¥½ãƒ‡ã‚£ã‚¹ã‚¯ã‚’移動ã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦è¦‹ã¤ã‘出ã—ã¦ã¿ã¾ã—ょã†!{*B*}{*B*} - +{*T1*}新アイテム{*ETB*} - 堅焼ã粘土ã€è‰²ä»˜ã粘土ã€çŸ³ç‚­ã®ãƒ–ロックã€å¹²ã—è‰ã®ä¿µã€ã‚¢ã‚¯ãƒ†ã‚£ãƒ™ãƒ¼ã‚¿ãƒ¼ レールã€ãƒ¬ãƒƒãƒ‰ã‚¹ãƒˆãƒ¼ãƒ³ã®ãƒ–ãƒ­ãƒƒã‚¯ã€æ—¥ç…§ã‚»ãƒ³ã‚µãƒ¼ã€ãƒ‰ãƒ­ãƒƒãƒ‘ーã€ãƒ›ãƒƒãƒ‘ーã€ãƒ›ãƒƒãƒ‘ー付ãトロッコã€TNT 付ãトロッコã€ãƒ¬ãƒƒãƒ‰ã‚¹ãƒˆãƒ¼ãƒ³ コンパレーターã€é‡é‡æ„ŸçŸ¥æ¿ã€ãƒ“ーコンã€ãƒˆãƒ©ãƒƒãƒ— ãƒã‚§ã‚¹ãƒˆã€ãƒ­ã‚±ãƒƒãƒˆèбç«ã€èбç«ã®æ˜Ÿã€ãƒã‚¶ãƒ¼ スターã€é¦–ã²ã‚‚ã€é¦¬ã‚ˆã‚ã„ã€å札ã€é¦¬ã®ã‚¹ãƒãƒ¼ãƒ³ エッグ{*B*}{*B*} + {*T1*}æ–°ã—ã„生ã物{*ETB*} - ウィザーã€ã‚¦ã‚£ã‚¶ãƒ¼ スケルトンã€ã‚¦ã‚£ãƒƒãƒã€ã‚³ã‚¦ãƒ¢ãƒªã€é¦¬ã€ãƒ­ãƒã€ãŠã‚ˆã³ãƒ©ãƒ{*B*}{*B*} +{*T1*}新機能{*ETB*} - é¦¬ã®æ‰‹ãªã¥ã‘ã¨é¨Žä¹—ã€èбç«ã®ä½œè£½ã¨ã‚·ãƒ§ãƒ¼ã®å‚¬ã—ã€å札ã«ã‚ˆã‚‹å‹•物ã¨ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ã®å付ã‘ã€ã•らã«é«˜åº¦ãªãƒ¬ãƒƒãƒ‰ã‚¹ãƒˆãƒ¼ãƒ³å›žè·¯ã®ä½œæˆã€ãã—ã¦æ–°ã—ã„ホスト オプションã«ã‚ˆã‚‹è‡ªä¸–界ã§ã‚²ã‚¹ãƒˆãŒã§ãã‚‹ã“ã¨ã®ç®¡ç†!{*B*}{*B*} +{*T1*}æ–°ã—ã„ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«{*ETB*} ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ã§æ–°æ—§æ©Ÿèƒ½ã®ä½¿ã„方を学ã³ã¾ã—ょã†ã€‚世界ã«éš ã•れãŸç§˜å¯†ã®éŸ³æ¥½ãƒ‡ã‚£ã‚¹ã‚¯ã‚’ã™ã¹ã¦è¦‹ã¤ã‘られるã§ã—ょã†ã‹ã€‚{*B*}{*B*} + + +馬 + +{*T3*}ä½¿ã„æ–¹: 馬{*ETW*}{*B*}{*B*} +馬ã¨ãƒ­ãƒã¯ã€ä¸»ã«è‰åŽŸã§è¦‹ã‚‰ã‚Œã¾ã™ã€‚ラãƒã¯ãƒ­ãƒã¨é¦¬ã‹ã‚‰ç”Ÿã¾ã‚Œã¾ã™ãŒã€ãれ自体ã§ã¯ç¹æ®–ã—ã¾ã›ã‚“。{*B*} +馬ã€ãƒ­ãƒã€ãƒ©ãƒã®æˆä½“ã«ã¯ä¹—ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãŸã ã—ã€ã‚ˆã‚ã„ã‚’ç€ã‘られるã®ã¯é¦¬ã®ã¿ã§ã€ã‚¢ã‚¤ãƒ†ãƒ ã‚’é‹ã¶ãŸã‚ã«éžè¢‹ã‚’ç€ã‘られるã®ã¯ãƒ­ãƒã¨ãƒ©ãƒã®ã¿ã§ã™ã€‚{*B*}{*B*} +馬ã€ãƒ­ãƒã€ãƒ©ãƒã‚’利用ã™ã‚‹ã«ã¯ã€æœ€åˆã«æ‰‹ãªãšã‘ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚騎乗ã—ã¦ã€æŒ¯ã‚Šè½ã¨ã•れãã†ã«ãªã£ã¦ã‚‚乗り続ã‘ã‚‹ã¨ã€æ‰‹ãªãšã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚{*B*} +馬ã®å‘¨ã‚Šã«ãƒãƒ¼ãƒˆãŒè¡¨ç¤ºã•ã‚Œã‚‹ã¨æ‰‹ãªãšã‘完了ã§ã€ä»¥é™ã¯ãƒ—レイヤーを振りè½ã¨ã•ãªããªã‚Šã¾ã™ã€‚ 馬をæ“縦ã™ã‚‹ã«ã¯éžã‚’ç½®ãå¿…è¦ãŒã‚りã¾ã™ã€‚{*B*}{*B*} +éžã¯æ‘人ã‹ã‚‰è³¼å…¥ã™ã‚‹ã€ã¾ãŸã¯ä¸–界ã®ä¸­ã«éš ã•れãŸãƒã‚§ã‚¹ãƒˆå†…ã«è¦‹ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚{*B*} +手ãªãšã‘ãŸãƒ­ãƒã¨ãƒ©ãƒã«ãƒã‚§ã‚¹ãƒˆã‚’装ç€ã™ã‚Œã°éžè¢‹ã‚’背負ã‚ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã®éžè¢‹ã«ã¯ã€é¨Žä¹—ã¾ãŸã¯ã—ã®ã³è¶³ã—ã¦ã„ã‚‹é–“ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™ã€‚{*B*}{*B*} +馬ã¨ãƒ­ãƒ (ラãƒã¯é™¤ã) ã¯ã€ä»–ã®å‹•物ã¨åŒæ§˜ã«é‡‘ã®ãƒªãƒ³ã‚´ã¾ãŸã¯é‡‘ã®ãƒ‹ãƒ³ã‚¸ãƒ³ã‚’使ã£ã¦ç¹æ®–ã•ã›ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚{*B*} +å­é¦¬ã‚„å­ãƒ­ãƒã¯æ™‚é–“ã®çµŒéŽã¨ã¨ã‚‚ã«æˆé•·ã—ã¾ã™ãŒã€å°éº¦ã¾ãŸã¯å¹²ã—è‰ã‚’与ãˆã‚Œã°æˆé•·ãŒæ—©ã¾ã‚Šã¾ã™ã€‚{*B*} + + +ビーコン + +{*T3*}ä½¿ã„æ–¹: ビーコン{*ETW*}{*B*}{*B*} +アクティブãªãƒ“ーコンã¯ã€æ˜Žã‚‹ã„å…‰ç·šã‚’ç©ºã¸æ”¾ã¡ã€è¿‘ãã«ã„るプレイヤーã«ãƒ‘ワーを与ãˆã¾ã™ã€‚{*B*} +作るã«ã¯ã€ã‚¬ãƒ©ã‚¹ã€é»’曜石ã€ã‚¦ã‚£ã‚¶ãƒ¼ã‚’倒ã™ã“ã¨ã§æ‰‹ã«å…¥ã‚‹ãƒã‚¶ãƒ¼ スターを使ã„ã¾ã™ã€‚{*B*}{*B*} +ビーコンã¯ã€æ—¥ä¸­ã«æ—¥å…‰ãŒå½“ãŸã‚‹å ´æ‰€ã«é…ç½®ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ã¾ãŸã€ãƒ“ーコンã¯é‰„ã€é‡‘ã€ã‚¨ãƒ¡ãƒ©ãƒ«ãƒ‰ã€ã¾ãŸã¯ãƒ€ã‚¤ãƒ¤ãƒ¢ãƒ³ãƒ‰ã®ãƒ”ラミッドã®ä¸Šã«é…ç½®ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚{*B*} +ã©ã®å»ºæä¸Šã«ãƒ“ーコンをé…ç½®ã™ã‚‹ã‹ã¯ã€ãƒ“ーコンã®ãƒ‘ワーã«å½±éŸ¿ã—ã¾ã›ã‚“。{*B*}{*B*} +ビーコン メニューã§ã€ãƒ“ーコンã®ãƒ—ライマリ パワーを 1 ã¤é¸æŠžã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ピラミッドã®éšŽå±¤ãŒå¢—ãˆã‚‹ã»ã©ã€ãƒ‘ワーã®é¸æŠžè‚¢ãŒå¢—ãˆã¾ã™ã€‚{*B*} +å°‘ãªãã¨ã‚‚ 4 段以上ã®ãƒ”ラミッド上ã«é…ç½®ã•れãŸãƒ“ーコンã§ã¯ã€ã€Œå›žå¾©ã€ã®ã‚»ã‚«ãƒ³ãƒ€ãƒª パワーã‹ã€ã•らã«å¼·åŠ›ãªãƒ—ライマリ ãƒ‘ãƒ¯ãƒ¼ã‚‚é¸æŠžå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚{*B*}{*B*} +ビーコンã®ãƒ‘ワーを設定ã™ã‚‹ã«ã¯ã€æ”¯æ‰•ã„スロットã§ã‚¨ãƒ¡ãƒ©ãƒ«ãƒ‰ã€ãƒ€ã‚¤ãƒ¤ãƒ¢ãƒ³ãƒ‰ã€é‡‘ã¾ãŸã¯é‰„ã®ã‚¤ãƒ³ã‚´ãƒƒãƒˆã®ã„ãšã‚Œã‹ã‚’消費ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。{*B*} +è¨­å®šãŒæ¸ˆã‚€ã¨ã€ãƒ“ーコンã‹ã‚‰ã®ãƒ‘ワーã¯ç„¡é™ã«ç™ºã›ã‚‰ã‚Œã¾ã™ã€‚{*B*} + + +èŠ±ç« + +{*T3*}ä½¿ã„æ–¹: 花ç«{*ETW*}{*B*}{*B*} +花ç«ã¯è£…飾アイテムã§ã€æ‰‹å‹•ã€ã¾ãŸã¯ç™ºå°„装置ã‹ã‚‰æ‰“ã¡ä¸Šã’ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚作るã«ã¯ã€ç´™ã€ç«è–¬ã€ã‚ªãƒ—ションã¨ã—ã¦æ•°ã€…ã®èбç«ã®æ˜Ÿã‚’使用ã—ã¾ã™ã€‚{*B*} +花ç«ã®æ˜Ÿã®è‰²ã€è‰²å¤‰åŒ–ã€å½¢çжã€ã‚µã‚¤ã‚ºã€åŠ¹æžœ (例: 光跡ã€ç‚¹æ»…) ã¯ã€ä½œæˆæ™‚ã«è¿½åŠ ã®ææ–™ã‚’å«ã‚ã‚‹ã“ã¨ã§ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã§ãã¾ã™ã€‚{*B*}{*B*} +花ç«ã‚’作るã«ã¯ã€ç«è–¬ã¨ç´™ã‚’æŒã¡ç‰©ã®ä¸Šã«è¡¨ç¤ºã•れる 3x3 ã®ã‚¯ãƒ©ãƒ•ト グリッドã«ç½®ãã¾ã™ã€‚{*B*} +オプションã¨ã—ã¦ã€ã‚¯ãƒ©ãƒ•ト グリッド上ã«è¤‡æ•°ã®èбç«ã®æ˜Ÿã‚’ç½®ã„ã¦ã€èбç«ã«åŠ ãˆã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚{*B*} +クラフト グリッドã®ã‚¹ãƒ­ãƒƒãƒˆã«ç½®ãç«è–¬ãŒå¤šããªã‚Œã°ã€èбç«ã®æ˜Ÿã¯ã‚ˆã‚Šé«˜ã„ä½ç½®ã§ç ´è£‚ã—ã¾ã™ã€‚{*B*}{*B*} +作ã£ãŸèбç«ã¯ã€å–り出ã—å£ã‹ã‚‰å–り出ã›ã¾ã™ã€‚{*B*}{*B*} +花ç«ã®æ˜Ÿã¯ã€ç«è–¬ã¨æŸ“料をクラフト グリッドã«ç½®ãã¨ä½œã‚Œã¾ã™ã€‚{*B*} + - 染料ã¯ã€èбç«ã®æ˜ŸãŒç ´è£‚ã™ã‚‹éš›ã®è‰²ã‚’設定ã—ã¾ã™ã€‚{*B*} + - 花ç«ã®æ˜Ÿã®å½¢çжã¯ã€ç™ºç«å‰¤ã€é‡‘塊ã€ç¾½æ ¹ã€ã¾ãŸã¯ç”Ÿã物ã®ãƒ˜ãƒƒãƒ‰ã‚’追加ã™ã‚‹ã“ã¨ã§è¨­å®šã—ã¾ã™ã€‚{*B*} + - 光跡や点滅ã¯ã€ãƒ€ã‚¤ãƒ¤ãƒ¢ãƒ³ãƒ‰ã¾ãŸã¯ã‚°ãƒ­ã‚¦ã‚¹ãƒˆãƒ¼ãƒ³ã®ç²‰ã‚’使ã†ã“ã¨ã§è¿½åŠ ã§ãã¾ã™ã€‚{*B*}{*B*} +花ç«ã®æ˜Ÿã‚’作ã£ãŸå¾Œã€ã•ã‚‰ã«æŸ“料を加ãˆã‚‹ã“ã¨ã§ã€èбç«ã®æ˜Ÿã®è‰²å¤‰åŒ–を決ã‚ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ + + +ホッパー + +{*T3*}ä½¿ã„æ–¹: ホッパー{*ETW*}{*B*}{*B*} +ホッパーã¯ã€å…¥ã‚Œç‰©ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’出ã—入れã™ã‚‹ãŸã‚ã«ã€ã¾ãŸã€ãã®ä¸Šã«æŠ•ã’られãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’è‡ªå‹•çš„ã«æ‹¾ã†ã®ã«ä½¿ã„ã¾ã™ã€‚{*B*} +ホッパーã¯èª¿åˆå°ã€ãƒã‚§ã‚¹ãƒˆã€ç™ºå°„装置ã€ãƒ‰ãƒ­ãƒƒãƒ‘ーã€ãƒã‚§ã‚¹ãƒˆä»˜ãトロッコã€ãƒ›ãƒƒãƒ‘ー付ãトロッコã€ãŠã‚ˆã³ä»–ã®ãƒ›ãƒƒãƒ‘ーã«å¯¾ã—ã¦ä½œç”¨ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚{*B*}{*B*} +ホッパーã¯ã€ãã®ä¸Šã«ä½ç½®ã™ã‚‹é©åˆ‡ãªå…¥ã‚Œç‰©ã‹ã‚‰ã‚¢ã‚¤ãƒ†ãƒ ã‚’å¸ã„出ã—ç¶šã‘ã¾ã™ã€‚ã¾ãŸã€ä¿ç®¡ã•れãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’出力先ã®å…¥ã‚Œç‰©ã«æ ¼ç´ã—よã†ã¨ã—ã¾ã™ã€‚{*B*} +レッドストーンãŒé›»æºã®å ´åˆã€ãƒ›ãƒƒãƒ‘ーã¯éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã«ãªã‚Šã€ã‚¢ã‚¤ãƒ†ãƒ ã®å¸ã„出ã—ã‚‚æ ¼ç´ã‚‚åœæ­¢ã—ã¾ã™ã€‚{*B*}{*B*} +ホッパーã¯å‘ã„ã¦ã„ã‚‹æ–¹å‘ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’出ã—ã¾ã™ã€‚ホッパーãŒç‰¹å®šã®ãƒ–ロックã«å‘ãよã†ã«ã™ã‚‹ã«ã¯ã€ãã®ãƒ–ロックã«å‘ã‘ã¦ã—ã®ã³è¶³ã§ãƒ›ãƒƒãƒ‘ーを設置ã—ã¾ã™ã€‚ {*B*} + + +ドロッパー + +{*T3*}ä½¿ã„æ–¹: ドロッパー{*ETW*}{*B*}{*B*} +レッドストーンãŒé›»æºã®å ´åˆã€ãƒ‰ãƒ­ãƒƒãƒ‘ãƒ¼ã¯æ ¼ç´ã—ã¦ã„るアイテムをランダム㫠1 ã¤ã€åœ°ä¸Šã«ãƒ‰ãƒ­ãƒƒãƒ—ã—ã¾ã™ã€‚{*CONTROLLER_ACTION_USE*} を使ã£ã¦ãƒ‰ãƒ­ãƒƒãƒ‘ーを開ãã¨ã€è‡ªåˆ†ã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ã‚¤ãƒ†ãƒ ã‚’ãƒ‰ãƒ­ãƒƒãƒ‘ãƒ¼ã«æŠ•å…¥ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚{*B*} +ドロッパーãŒãƒã‚§ã‚¹ãƒˆã¾ãŸã¯ä»–ã®ç¨®é¡žã®å…¥ã‚Œç‰©ã«é¢ã—ã¦ã„ã‚‹å ´åˆã€ã‚¢ã‚¤ãƒ†ãƒ ã¯ãƒ‰ãƒ­ãƒƒãƒ‘ーã§ã¯ãªãã€ãã¡ã‚‰ã¸æŠ•å…¥ã•れã¾ã™ã€‚ドロッパーを多数ã¤ãªã’ã¦è¨­ç½®ã™ã‚Œã°ã€é›¢ã‚ŒãŸå ´æ‰€ã¨ã®é–“ã§ã‚¢ã‚¤ãƒ†ãƒ ã‚’é‹ã¹ã¾ã™ã€‚ãã®ã‚ˆã†ã«å‹•作ã•ã›ã‚‹ã«ã¯ã€é›»æºã‚’交互ã«ã‚ªãƒ³ã¨ã‚ªãƒ•ã«ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + 手よりも攻撃力ãŒé«˜ã„ @@ -503,7 +560,7 @@ Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ゲーム㫠装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +1 -装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +3 +装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +3。 装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +2 @@ -513,7 +570,7 @@ Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ゲーム㫠装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +5 -装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +4 +装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +4。 装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +1 @@ -529,17 +586,17 @@ Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ゲーム㫠装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +5 -装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +3 +装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +3。 装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +1 -装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +3 +装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +3。 装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +8 装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +6 -装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +3 +装備ã™ã‚‹ã¨ã‚¢ãƒ¼ãƒžãƒ¼ãƒã‚¤ãƒ³ãƒˆ +3。 光沢を放ã¤å»¶ã¹æ£’ã€é“å…·ã‚’ä½œã‚‹ææ–™ã¨ã—ã¦ä½¿ã†ã€‚ã‹ã¾ã©ã§é‰±çŸ³ã‚’精錬ã—ã¦ä½œã‚‹ @@ -604,19 +661,45 @@ Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ã‚²ãƒ¼ãƒ ã« æ‰‹ã«æŒã£ã¦ã„ã‚‹ã¨ã€æŽ¢ç´¢æ¸ˆã¿ã®ã‚¨ãƒªã‚¢ã®åœ°å›³ã‚’表示ã™ã‚‹ã€‚é“を確èªã™ã‚‹ã®ã«ä½¿ã† +使用ã™ã‚‹ã¨ã€ãƒ—レイヤーã®ä¸–界内ã§ã®ç¾åœ¨ä½ç½®å‘¨è¾ºã®åœ°å›³ã«ãªã‚‹ã€‚探検ã™ã‚‹ã«ã¤ã‚Œã¦å›³é¢ãŒåŸ‹ã¾ã£ã¦ã„ã + 矢を射る攻撃ãŒã§ãã‚‹ 弓ã¨çµ„ã¿åˆã‚ã›ã¦ã€æ­¦å™¨ã¨ã—ã¦ä½¿ã† -2.5{*ICON_SHANK_01*} 回復ã™ã‚‹ +ウィザーãŒè½ã¨ã™ã€‚ビーコンを作るã®ã«ä½¿ã†ã€‚ + +作動ã™ã‚‹ã¨ã€è‰²ã¨ã‚Šã©ã‚Šã®ç«èŠ±ã‚’ä½œã‚Šå‡ºã™ã€‚ãã®è‰²ã€å½¢çжã€è‰²å¤‰åŒ–ã¯ã€èбç«ã‚’作る際ã«ä½¿ã†èбç«ã®æ˜Ÿã«ã‚ˆã£ã¦æ±ºã¾ã‚‹ã€‚ + +花ç«ã®è‰²ã€åŠ¹æžœã€å½¢çŠ¶ã‚’æ±ºã‚ã‚‹ãŸã‚ã«ä½¿ã†ã€‚ + +レッドストーン回路ã§ã€ä¿¡å·å¼·åº¦ã‚’ç¶­æŒã€æ¯”較ã€ã¾ãŸã¯æ¸›ç®—ã—ãŸã‚Šã€ç‰¹å®šã®ãƒ–ロックã®çŠ¶æ…‹ã‚’æ¸¬å®šã—ãŸã‚Šã™ã‚‹ãŸã‚ã«ä½¿ã†ã€‚ + +移動ã™ã‚‹ TNT ブロックã¨ã—ã¦æ©Ÿèƒ½ã™ã‚‹ã€ãƒˆãƒ­ãƒƒã‚³ã®ä¸€ç¨®ã€‚ + +日光 (ã¾ãŸã¯ãã®ä¸è¶³) ã«å¿œã˜ã¦ãƒ¬ãƒƒãƒ‰ã‚¹ãƒˆãƒ¼ãƒ³ä¿¡å·ã‚’出力ã™ã‚‹ãƒ–ロック。 + +ホッパーã¨åŒã˜ã‚ˆã†ã«æ©Ÿèƒ½ã™ã‚‹ç‰¹åˆ¥ãªç¨®é¡žã®ãƒˆãƒ­ãƒƒã‚³ã€‚軌é“上ã«è½ã¡ã¦ã„るアイテムやã€ä¸Šã«ä½ç½®ã™ã‚‹å…¥ã‚Œç‰©ã‹ã‚‰ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’åŽé›†ã™ã‚‹ã€‚ + +馬ã«è£…ç€ã§ãる特別ãªç¨®é¡žã®é˜²å…·ã€‚防御力 +5。 + +馬ã«è£…ç€ã§ãる特別ãªç¨®é¡žã®é˜²å…·ã€‚防御力 +7。 + +馬ã«è£…ç€ã§ãる特別ãªç¨®é¡žã®é˜²å…·ã€‚防御力 +11。 + +生ã物をプレイヤーã¾ãŸã¯ãƒ•ã‚§ãƒ³ã‚¹ã®æŸ±ã«ã¤ãªããŸã‚ã«ä½¿ã†ã€‚ + +世界内ã®ç”Ÿã物ã«åå‰ã‚’ã¤ã‘ã‚‹ã®ã«ä½¿ã†ã€‚ + +2.5{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚ -1{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚6 回ã¾ã§ä½¿ç”¨ã§ãã‚‹ +1{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚6 回ã¾ã§ä½¿ç”¨ã§ãる。 -1{*ICON_SHANK_01*} 回復ã™ã‚‹ +1{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚ -1{*ICON_SHANK_01*} 回復ã™ã‚‹ +1{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚ -3{*ICON_SHANK_01*} 回復ã™ã‚‹ +3{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚ 1{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚ã‹ã¾ã©ã§èª¿ç†ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã€‚ç—…æ°—ã«ãªã‚‹å ´åˆã‚‚ã‚ã‚‹ @@ -634,7 +717,7 @@ Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ゲーム㫠2.5{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚生魚をã‹ã¾ã©ã§èª¿ç†ã™ã‚‹ã¨ã§ãã‚‹ -2{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚金ã®ãƒªãƒ³ã‚´ã®ææ–™ã¨ãªã‚‹ +2{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚金ã®ãƒªãƒ³ã‚´ã®ææ–™ã¨ãªã‚‹ã€‚ 2{*ICON_SHANK_01*} 回復ã—ã€ã•ら㫠HP ㌠4 ç§’é–“ã€è‡ªå‹•回復ã™ã‚‹ã€‚リンゴã¨é‡‘ã®å¡Šã‹ã‚‰ä½œã‚‹ @@ -659,7 +742,7 @@ Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ゲーム㫠電æºãŒå…¥ã£ã¦ã„る時ã€ä¸Šã‚’走るトロッコを加速ã•ã›ã‚‹ã€‚é›»æºãŒå…¥ã£ã¦ã„ãªã„時ã¯ã€ä¸Šã§ãƒˆãƒ­ãƒƒã‚³ãŒæ­¢ã¾ã‚‹ -トロッコ専用ã®é‡é‡æ„ŸçŸ¥æ¿ã¨ã—ã¦æ©Ÿèƒ½ã™ã‚‹ã€‚é›»æºãŒå…¥ã£ã¦ã„る時ã«ãƒ¬ãƒƒãƒ‰ã‚¹ãƒˆãƒ¼ãƒ³ã®ä¿¡å·ã‚’é€ã‚‹ +トロッコ専用ã®é‡é‡æ„ŸçŸ¥æ¿ã¨ã—ã¦æ©Ÿèƒ½ã™ã‚‹ã€‚é›»æºãŒå…¥ã£ã¦ã„る時ã«ãƒ¬ãƒƒãƒ‰ã‚¹ãƒˆãƒ¼ãƒ³ã®ä¿¡å·ã‚’é€ã‚‹ã€‚ プレイヤーや動物ã€ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ã‚’ä¹—ã›ã¦ã€ãƒ¬ãƒ¼ãƒ«ã®ä¸Šã‚’移動ã§ãã‚‹ @@ -716,7 +799,7 @@ Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ゲーム㫠本や地図を作るã®ã«ä½¿ã† -本棚を作るã®ã«ä½¿ã£ãŸã‚Šã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã—ã¦ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã—ãŸæœ¬ã‚’作るãŸã‚ã«ä½¿ã† +本棚を作るã®ã«ä½¿ã£ãŸã‚Šã€ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã—ã¦ã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã—ãŸæœ¬ã‚’作るãŸã‚ã«ä½¿ã†ã€‚ エンãƒãƒ£ãƒ³ãƒˆãƒ†ãƒ¼ãƒ–ルã®å‘¨å›²ã«ç½®ã„ã¦ã€ã‚ˆã‚Šå¼·åŠ›ãªã‚¨ãƒ³ãƒãƒ£ãƒ³ãƒˆã‚’作る @@ -932,100 +1015,158 @@ Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ゲーム㫠ヘッド類ã¯é£¾ã‚Šä»˜ã‘ã¨ã—ã¦ä¸¦ã¹ãŸã‚Šã€ãƒ˜ãƒ«ãƒ¡ãƒƒãƒˆã®ã‚¹ãƒ­ãƒƒãƒˆã‹ã‚‰ãƒžã‚¹ã‚¯ã¨ã—ã¦ç€ç”¨ã‚‚ã§ãã‚‹ +コマンドを実行ã™ã‚‹ã®ã«ä½¿ã†ã€‚ + +空ã«å‘ã‘ã¦å…‰ç·šã‚’放ã¡ã€ä»˜è¿‘ã®ãƒ—レイヤーã«ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹åŠ¹æžœã‚’ã‚‚ãŸã‚‰ã™ã“ã¨ãŒã§ãる。 + +中ã«ãƒ–ロックã¨ã‚¢ã‚¤ãƒ†ãƒ ã‚’ä¿ç®¡ã™ã‚‹ã€‚2 ã¤ã®ãƒã‚§ã‚¹ãƒˆã‚’隣åŒå£«ã«ç½®ãã¨ã€å®¹é‡ 2 å€ã®å¤§ããªãƒã‚§ã‚¹ãƒˆã‚’作るã“ã¨ãŒã§ãる。トラップ ãƒã‚§ã‚¹ãƒˆã¯é–‹ã„ãŸæ™‚ã«ã€ãƒ¬ãƒƒãƒ‰ã‚¹ãƒˆãƒ¼ãƒ³é›»æºã‚‚供給ã™ã‚‹ã€‚ + +レッドストーンã«ã‚ˆã‚‹é›»æºã‚’供給ã™ã‚‹ã€‚æ¿ä¸Šã®ã‚¢ã‚¤ãƒ†ãƒ ãŒå¤šã„ã»ã©ã€ãƒãƒ£ãƒ¼ã‚¸ã¯å¼·åŠ›ã«ãªã‚‹ã€‚ + +レッドストーンã«ã‚ˆã‚‹é›»æºã‚’供給ã™ã‚‹ã€‚æ¿ä¸Šã®ã‚¢ã‚¤ãƒ†ãƒ ãŒå¤šã„ã»ã©ã€ãƒãƒ£ãƒ¼ã‚¸ã¯å¼·åŠ›ã«ãªã‚‹ã€‚è»½é‡æ¿ã‚ˆã‚Šã‚‚é‡ã•ã‚’å¿…è¦ã¨ã™ã‚‹ã€‚ + +レッドストーン電æºã¨ã—ã¦ä½¿ã†ã€‚レッドストーンã«ä½œã‚Šæˆ»ã™ã“ã¨ãŒã§ãる。 + +アイテムã®å—ã‘å–りã€ã¾ãŸã¯å…¥ã‚Œç‰©ã‹ã‚‰ã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‡ºã—入れã«ä½¿ã‚れる。 + +レールã®ä¸€ç¨®ã€‚ホッパー付ãトロッコを有効ã¾ãŸã¯ç„¡åйã«ã—ãŸã‚Šã€TNT 付ãトロッコを動作ã•ã›ãŸã‚Šã§ãる。 + +アイテムをä¿ç®¡ã¾ãŸã¯è½ã¨ã™ã®ã«ä½¿ã‚れる。レッドストーン電æºãŒã‚ã‚‹å ´åˆã«ã¯ã€ä»–ã®å…¥ã‚Œç‰©ã¸ã‚¢ã‚¤ãƒ†ãƒ ã‚’ç§»ã™ã®ã«ã‚‚使ãˆã‚‹ã€‚ + +カラフルãªãƒ–ロック。堅焼ã粘土を染色ã—ã¦ä½œã‚‹ã€‚ + +馬ã€ãƒ­ãƒã€ã¾ãŸã¯ãƒ©ãƒã«é¤Œã¨ã—ã¦ä¸Žãˆã‚‹ã“ã¨ãŒã§ãã€10 ãƒãƒ¼ãƒˆã¾ã§å›žå¾©ã•ã›ã‚‹ã€‚å­é¦¬ã‚„å­ãƒ­ãƒã®æˆé•·ã‚’æ—©ã‚る効果もã‚る。 + +ã‹ã¾ã©ã®ä¸­ã§ç²˜åœŸã‚’精錬ã—ã¦ä½œã‚‰ã‚Œã‚‹ã€‚ + +ã‚¬ãƒ©ã‚¹ã¨æŸ“æ–™ã‹ã‚‰ä½œã‚‰ã‚Œã‚‹ã€‚ + +ステンドグラスã‹ã‚‰ä½œã‚‰ã‚Œã‚‹ã€‚ + +木炭をä¿ç®¡ã™ã‚‹ã®ã«ä½¿ãˆã‚‹ã€‚ã‹ã¾ã©ã§ç‡ƒæ–™ã¨ã—ã¦ä½¿ç”¨ã™ã‚‹ã“ã¨ãŒã§ãã‚‹ + イカ - + 倒ã™ã¨å¢¨è¢‹ã‚’è½ã¨ã™ - + 牛 - + 倒ã™ã¨é©ã‚’è½ã¨ã™ã€‚ãƒã‚±ãƒ„ãŒã‚れã°ãƒŸãƒ«ã‚¯ã‚‚å–れる - + 羊 - + 毛を刈るã¨ãウールをè½ã¨ã™ (æ¯›ãŒæ®‹ã£ã¦ã„ã‚‹å ´åˆ)。ウールã¯ã„ã‚ã„ã‚ãªè‰²ã«æŸ“ã‚られる - + ニワトリ - + 倒ã™ã¨ç¾½æ ¹ã‚’è½ã¨ã™ã€‚タマゴをæŒã£ã¦ã„ã‚‹å ´åˆã‚‚ã‚ã‚‹ - + 豚 - + 倒ã™ã¨è±šè‚‰ã‚’è½ã¨ã™ã€‚éžãŒã‚れã°ä¹—ã‚‹ã“ã¨ã‚‚ã§ãã‚‹ - + オオカミ - + 普段ã¯ãŠã¨ãªã—ã„ãŒã€æ”»æ’ƒã™ã‚‹ã¨åæ’ƒã—ã¦ãる。骨を使ã†ã¨æ‰‹ãªãšã‘ã‚‹ã“ã¨ãŒã§ãã€ãƒ—レイヤーã«ã¤ã„ã¦å›žã£ã¦ã€ãƒ—レイヤーを攻撃ã—ã¦ãる敵を攻撃ã—ã¦ãれる - + Creeper - + è¿‘ã¥ãã™ãŽã‚‹ã¨çˆ†ç™ºã™ã‚‹! - + ガイコツ - + 矢を放ã£ã¦ãる。倒ã™ã¨çŸ¢ã‚’è½ã¨ã™ - + クモ - + è¿‘ã¥ãã¨æ”»æ’ƒã—ã¦ãる。å£ã‚’登るã“ã¨ãŒã§ãる。倒ã™ã¨ç³¸ã‚’è½ã¨ã™ - + ゾンビ - + è¿‘ã¥ãã¨æ”»æ’ƒã—ã¦ãã‚‹ - + ゾンビ Pigman - + 最åˆã¯ãŠã¨ãªã—ã„ãŒã€1 匹を攻撃ã™ã‚‹ã¨é›†å›£ã§åæ’ƒã—ã¦ãã‚‹ - + Ghast - + 当ãŸã‚‹ã¨çˆ†ç™ºã™ã‚‹ç«ã®çŽ‰ã‚’æ”¾ã£ã¦ãã‚‹ - + スライム - + ダメージを与ãˆã‚‹ã¨ã€å°ã•ãªã‚¹ãƒ©ã‚¤ãƒ ã«åˆ†è£‚ã™ã‚‹ - + Enderman - + 照準をå‘ã‘ã‚‹ã¨æ”»æ’ƒã—ã¦ãる。ブロックを移動ã§ãã‚‹ - + Silverfish - + 攻撃ã™ã‚‹ã¨ã€è¿‘ãã«éš ã‚Œã¦ã„ã‚‹ Silverfish も集ã¾ã£ã¦ãる。石ブロックã®ä¸­ã«éš ã‚Œã¦ã„ã‚‹ - + 洞窟グモ - + ç‰™ã«æ¯’ãŒã‚ã‚‹ - + Mooshroom - + 空ã®ãŠã‚んを使ã†ã¨ãã®ã“ã‚·ãƒãƒ¥ãƒ¼ãŒæŽ¡ã‚Œã‚‹ã€‚ãƒã‚µãƒŸã§æ¯›åˆˆã‚Šã‚’ã™ã‚‹ã¨ãã®ã“ã‚’è½ã¨ã™ãŒã€æ™®é€šã®ç‰›ã«ãªã£ã¦ã—ã¾ã† - + スノー ゴーレム - + 雪ブロックã¨ã‚«ãƒœãƒãƒ£ã§ä½œã‚Œã‚‹ã‚´ãƒ¼ãƒ¬ãƒ ã€‚作ã£ãŸäººã®æ•µã«å‘ã‹ã£ã¦é›ªçŽ‰ã‚’æŠ•ã’ã¤ã‘ã‚‹ - + エンダー ドラゴン - + æžœã¦ã®ä¸–界ã«å­˜åœ¨ã™ã‚‹å¤§ããªé»’竜 - + Blaze - + 暗黒界ã«å‡ºç¾ã™ã‚‹æ•µã€‚ä¸»ã«æš—黒砦内ã«ã„る。倒ã™ã¨ Blaze ロッドをè½ã¨ã™ - + マグマ キューブ - + 暗黒界ã«å‡ºç¾ã™ã‚‹ã€‚Slime åŒæ§˜ã€å€’ã™ã¨å°ã•㪠Lava Slime ã«åˆ†è£‚ã™ã‚‹ - + æ‘人 - + ヤマãƒã‚³ - + ジャングルã«ç”Ÿæ¯ã€‚生魚を与ãˆã¦é£¼ã„慣らã›ã‚‹ã€‚䏿„ãªå‹•ãã«é©šã„ã¦ã™ãã«é€ƒã’ã‚‹ãŸã‚ã€æŽ¥è¿‘ã™ã‚‹ã®ã¯ç°¡å˜ã§ã¯ãªã„ - + アイアン ゴーレム - + æ‘ã«å‡ºç¾ã—ã¦æ‘人を守ã£ã¦ãれる。鉄ã®ãƒ–ロックã¨ã‚«ãƒœãƒãƒ£ã§ä½œã‚‹ã“ã¨ã‚‚ã§ãã‚‹ - + +コウモリ + +ã“ã®ç©ºé£›ã¶ç”Ÿã物ã¯ã€æ´žçªŸã‚„ãã®ä»–ã®å¤§ããªé–‰ã˜ãŸç©ºé–“ã§è¦‹ã¤ã‹ã‚‹ã€‚ + +ウィッム+ +ã“ã®æ•µã¯æ²¼åœ°ã§è¦‹ã‚‰ã‚Œã€ãƒãƒ¼ã‚·ãƒ§ãƒ³ã‚’投ã’ã¦æ”»æ’ƒã—ã¦ãる。倒ã™ã¨ãƒãƒ¼ã‚·ãƒ§ãƒ³ã‚’è½ã¨ã™ã€‚ + +馬 + +ã“ã®å‹•ç‰©ã¯æ‰‹ãªãšã‘ã¦ã€ä¹—ã‚‹ã“ã¨ãŒã§ãる。 + +ロム+ +ã“ã®å‹•ç‰©ã¯æ‰‹ãªãšã‘ã¦ã€ä¹—ã‚‹ã“ã¨ãŒã§ãる。ãƒã‚§ã‚¹ãƒˆã‚’装ç€ã™ã‚‹ã“ã¨ã‚‚ã§ãる。 + +ラム+ +馬ã¨ãƒ­ãƒã®äº¤é…ã«ã‚ˆã£ã¦ç”Ÿã¾ã‚Œã‚‹ã€‚ã“ã®å‹•ç‰©ã¯æ‰‹ãªãšã‘ã¦ã€ä¹—ã£ãŸã‚Šã€ãƒã‚§ã‚¹ãƒˆã‚’é‹ã°ã›ãŸã‚Šã™ã‚‹ã“ã¨ãŒã§ãる。 + +馬ã®ã‚¾ãƒ³ãƒ“ + +馬ã®ã‚¹ã‚±ãƒ«ãƒˆãƒ³ + +ウィザー + +ウィザー スカルã¨ã‚½ã‚¦ãƒ« サンドã‹ã‚‰ä½œã‚‰ã‚Œã‚‹ã€‚爆発ã™ã‚‹ã‚¹ã‚«ãƒ«ã‚’æ’ƒã£ã¦ãる。 + Explosives Animator Concept Artist @@ -1372,6 +1513,8 @@ Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ゲーム㫠地図 +空ã£ã½ã®åœ°å›³ + 音楽ディスク: 13 音楽ディスク: cat @@ -1474,6 +1617,28 @@ Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ゲーム㫠Creeper ヘッド +ãƒã‚¶ãƒ¼ã‚¹ã‚¿ãƒ¼ + +ãƒ­ã‚±ãƒƒãƒˆèŠ±ç« + +花ç«ã®æ˜Ÿ + +レッドストーン コンパレーター + +TNT 付ãトロッコ + +ホッパー付ãトロッコ + +鉄ã®é¦¬ã‚ˆã‚ã„ + +金ã®é¦¬ã‚ˆã‚ã„ + +ダイヤモンドã®é¦¬ã‚ˆã‚ã„ + +首ã²ã‚‚ + +åæœ­ + 石 è‰ãƒ–ロック @@ -1490,6 +1655,8 @@ Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ã‚²ãƒ¼ãƒ ã« ã‚¸ãƒ£ãƒ³ã‚°ãƒ«ã®æœ¨ã®æ¿ + æœ¨ã®æ¿ (全種類) + 苗木 樫ã®è‹—木 @@ -1826,6 +1993,190 @@ Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ゲーム㫠スカル +コマンド ブロック + +ビーコン + +トラップ ãƒã‚§ã‚¹ãƒˆ + +é‡é‡æ„ŸçŸ¥æ¿ (軽) + +é‡é‡æ„ŸçŸ¥æ¿ (é‡) + +レッドストーン コンパレーター + +日照センサー + +レッドストーンã®ãƒ–ロック + +ホッパー + +アクティベーター レール + +ドロッパー + +色付ã粘土 + +å¹²ã—è‰ã®ä¿µ + +堅焼ã粘土 + +石炭ã®ãƒ–ロック + +é»’ã®è‰²ä»˜ã粘土 + +赤ã®è‰²ä»˜ã粘土 + +ç·‘ã®è‰²ä»˜ã粘土 + +茶色ã®è‰²ä»˜ã粘土 + +é’ã®è‰²ä»˜ã粘土 + +ç´«ã®è‰²ä»˜ã粘土 + +é’ç·‘ã®è‰²ä»˜ã粘土 + +è–„ç°è‰²ã®è‰²ä»˜ã粘土 + +ç°è‰²ã®è‰²ä»˜ã粘土 + +ピンクã®è‰²ä»˜ã粘土 + +黄緑ã®è‰²ä»˜ã粘土 + +黄色ã®è‰²ä»˜ã粘土 + +空色ã®è‰²ä»˜ã粘土 + +赤紫ã®è‰²ä»˜ã粘土 + +オレンジã®è‰²ä»˜ã粘土 + +白ã®è‰²ä»˜ã粘土 + +ステンドグラス + +é»’ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹ + +赤ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹ + +ç·‘ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹ + +茶色ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹ + +é’ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹ + +ç´«ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹ + +赤紫ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹ + +è–„ç°è‰²ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹ + +ç°è‰²ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹ + +ピンクã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹ + +黄緑ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹ + +黄色ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹ + +空色ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹ + +赤紫ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹ + +オレンジã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹ + +白ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹ + +ステンドグラス窓 + +é»’ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹çª“ + +赤ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹çª“ + +ç·‘ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹çª“ + +茶色ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹çª“ + +é’ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹çª“ + +ç´«ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹çª“ + +赤紫ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹çª“ + +è–„ç°è‰²ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹çª“ + +ç°è‰²ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹çª“ + +ピンクã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹çª“ + +黄緑ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹çª“ + +黄色ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹çª“ + +空色ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹çª“ + +赤紫ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹çª“ + +オレンジã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹çª“ + +白ã®ã‚¹ãƒ†ãƒ³ãƒ‰ã‚°ãƒ©ã‚¹çª“ + +å°çމ + +大玉 + +星形 + +Creeper å½¢ + +破裂 + +未知ã®å½¢ + +é»’ + +赤 + +ç·‘ + +茶色 + +é’ + +ç´« + +é’ç·‘ + +è–„ç°è‰² + +ç°è‰² + +ピンク + +黄緑 + +黄色 + +空色 + +赤紫 + +オレンジ + +白 + +カスタム + +変化後ã®è‰² + +点滅 + +光跡 + +滞空時間: +  ç¾åœ¨ã®æ“作方法 レイアウト @@ -2003,8 +2354,7 @@ Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ゲーム㫠ã“れãŒã‚ãªãŸã®æŒã¡ç‰©ã§ã™ã€‚æ‰‹ã§æŒã£ã¦ä½¿ç”¨ã§ãるアイテムã¨ã€æ‰€æœ‰ã—ã¦ã„るアイテムã®ãƒªã‚¹ãƒˆã€ç¾åœ¨è£…å‚™ã—ã¦ã„る防具を確èªã§ãã¾ã™ - - + {*B*} æŒã¡ç‰©ã®èª¬æ˜Žã‚’ç¶šã‘ã‚‹: {*CONTROLLER_VK_A*}{*B*} æŒã¡ç‰©ã®èª¬æ˜Žã‚’飛ã°ã™: {*CONTROLLER_VK_B*} @@ -2025,7 +2375,7 @@ Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ゲーム㫠- アイテムã®èª¬æ˜Žã‚’見ãŸã„時ã¯ã€ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’アイテムã®ä¸Šã«å‹•ã‹ã—ã¦ã‹ã‚‰ {*CONTROLLER_VK_RT*} を押ã—ã¦ãã ã•ã„ + アイテムã®èª¬æ˜Žã‚’見ãŸã„時ã¯ã€ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’アイテムã®ä¸Šã«å‹•ã‹ã—ã¦ã‹ã‚‰ {*CONTROLLER_ACTION_MENU_PAGEDOWN*} を押ã—ã¦ãã ã•ã„ @@ -2060,7 +2410,7 @@ Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ゲーム㫠- アイテムã®èª¬æ˜Žã‚’見ãŸã„時ã¯ã€ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’アイテムã®ä¸Šã«å‹•ã‹ã—ã¦ã‹ã‚‰ {*CONTROLLER_VK_RT*} を押ã—ã¾ã™ + アイテムã®èª¬æ˜Žã‚’見ãŸã„時ã¯ã€ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’アイテムã®ä¸Šã«å‹•ã‹ã—ã¦ã‹ã‚‰ {*CONTROLLER_ACTION_MENU_PAGEDOWN*} を押ã—ã¦ãã ã•ã„ @@ -2442,7 +2792,7 @@ Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ゲーム㫠- ãƒãƒ¼ã‚¿ãƒ«ã‚’èµ·å‹•ã™ã‚‹ã«ã¯ã€ç«æ‰“çŸ³ã¨æ‰“ã¡é‡‘ã§ã€ãƒ•レーム内ã®é»’曜石ã«ç«ã‚’ã¤ã‘ã¾ã—ょã†ã€‚æž ãŒå£Šã‚ŒãŸã‚Šã€è¿‘ãã§çˆ†ç™ºãŒèµ·ããŸã‚Šã€æ¶²ä½“ã‚’æµã—ãŸã‚Šã™ã‚‹ã¨ã€ãƒãƒ¼ã‚¿ãƒ«ã¯åœæ­¢ã—ã¾ã™ + ãƒãƒ¼ã‚¿ãƒ«ã‚’èµ·å‹•ã™ã‚‹ã«ã¯ã€ç«æ‰“çŸ³ã¨æ‰“ã¡é‡‘ã§ã€ãƒ•レーム内ã®é»’曜石ã«ç«ã‚’ã¤ã‘ã¾ã—ょã†ã€‚æž ãŒå£Šã‚ŒãŸã‚Šã€è¿‘ãã§çˆ†ç™ºãŒèµ·ããŸã‚Šã€æ¶²ä½“ã‚’æµã—ãŸã‚Šã™ã‚‹ã¨ã€ãƒãƒ¼ã‚¿ãƒ«ã¯åœæ­¢ã—ã¾ã™ã€‚ @@ -2607,6 +2957,211 @@ Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ゲーム㫠ã™ã§ã«å分知ã£ã¦ã„ã‚‹å ´åˆã¯ {*CONTROLLER_VK_B*} を押ã—ã¦ãã ã•ã„。 + + ã“れã¯é¦¬ã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒª インターフェイスã§ã™ã€‚ + + + + {*B*}続行ã™ã‚‹ã«ã¯ {*CONTROLLER_VK_A*} を押ã—ã¾ã™ã€‚ + {*B*}馬ã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã®ä½¿ã„方を既ã«çŸ¥ã£ã¦ã„ã‚‹å ´åˆã¯ã€{*CONTROLLER_VK_B*} を押ã—ã¾ã™ã€‚ + + + + 馬ã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã‚’使ã†ã¨ã€è‡ªåˆ†ã®é¦¬ã€ãƒ­ãƒã€ã¾ãŸã¯ãƒ©ãƒã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’ç§»ã—ãŸã‚Šã€è£…å‚™ã•ã›ãŸã‚Šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + + + + 馬ã«éžã‚’ã®ã›ã‚‹ã«ã¯ã€éžã‚¹ãƒ­ãƒƒãƒˆã«éžã‚’ç½®ãã¾ã™ã€‚防具スロットã«é¦¬ã‚ˆã‚ã„ã‚’ç½®ã‘ã°ã€é¦¬ã«é˜²å…·ã‚’装備ã•ã›ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ + + + + ã“ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã§ã¯ã€è‡ªåˆ†ã®æŒã¡ç‰©ã¨ãƒ­ãƒã¾ãŸã¯ãƒ©ãƒã«è£…ç€ã—ãŸéžè¢‹ã¨ã®é–“ã§ã€ã‚¢ã‚¤ãƒ†ãƒ ã‚’移動ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ + + +馬を見ã¤ã‘ã¾ã—ãŸã€‚ + +ロãƒã‚’見ã¤ã‘ã¾ã—ãŸã€‚ + +ラãƒã‚’見ã¤ã‘ã¾ã—ãŸã€‚ + + + {*B*}馬ã€ãƒ­ãƒã€ãƒ©ãƒã«ã¤ã„ã¦ã‚‚ã£ã¨çŸ¥ã‚‹ã«ã¯ {*CONTROLLER_VK_A*} を押ã—ã¾ã™ã€‚ + {*B*}馬ã€ãƒ­ãƒã€ãƒ©ãƒã«ã¤ã„ã¦æ—¢ã«çŸ¥ã£ã¦ã„ã‚‹å ´åˆã¯ã€{*CONTROLLER_VK_B*} を押ã—ã¾ã™ã€‚ + + + + 馬ã¨ãƒ­ãƒã¯ä¸»ã«ã²ã‚‰ã‘ãŸè‰åŽŸã§è¦‹ã¤ã‹ã‚Šã¾ã™ã€‚ラãƒã¯ãƒ­ãƒã¨é¦¬ã‹ã‚‰ç¹æ®–ã§ãã¾ã™ãŒã€ãれ自体ã§ã¯å­ã‚’産ã¿ã¾ã›ã‚“。 + + + + 馬ã€ãƒ­ãƒã€ãƒ©ãƒã®æˆä½“ã«ã¯ä¹—ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ãŸã ã—防具を装備ã§ãã‚‹ã®ã¯é¦¬ã ã‘ã§ã™ã€‚ã‚¢ã‚¤ãƒ†ãƒ ã‚’é‹æ¬ã™ã‚‹ãŸã‚ã®éžè¢‹ã‚’ç€ã‘られるã®ã¯ãƒ©ãƒã¨ãƒ­ãƒã ã‘ã§ã™ã€‚ + + + + 馬ã€ãƒ­ãƒã€ãƒ©ãƒã¯ä½¿ã†å‰ã«æ‰‹ãªãšã‘ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚騎乗ã—ã¦ã€æŒ¯ã‚Šè½ã¨ã•れãã†ã«ãªã£ã¦ã‚‚乗り続ã‘れã°ã€æ‰‹ãªãšã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + + + + 手ãªãšã‘ã‚‹ã¨å‘¨ã‚Šã«ãƒãƒ¼ãƒˆãŒè¡¨ç¤ºã•れã¦ã€äºŒåº¦ã¨ãƒ—レイヤーを振りè½ã¨ãã†ã¨ã¯ã—ã¾ã›ã‚“。 + + + + ã“ã®é¦¬ã«ä¹—ã£ã¦ã¿ã¾ã—ょã†ã€‚騎乗ã™ã‚‹ã«ã¯ã€æ‰‹ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚„ツールã¯ä½•ã‚‚æŒãŸãªã„ã§ {*CONTROLLER_ACTION_USE*} を使ã„ã¾ã™ã€‚ + + + + 馬をæ“縦ã™ã‚‹ã«ã¯éžã‚’ç½®ãå¿…è¦ãŒã‚りã¾ã™ã€‚éžã¯æ‘人ã‹ã‚‰è³¼å…¥ã™ã‚‹ã‹ã€ä¸–界ã®ã©ã“ã‹ã«éš ã•れãŸãƒã‚§ã‚¹ãƒˆã®ä¸­ã‹ã‚‰è¦‹ã¤ã‹ã‚Šã¾ã™ã€‚ + + + + 手ãªãšã‘ãŸãƒ­ãƒã¨ãƒ©ãƒã«éžè¢‹ã‚’ç€ã‘ã‚‹ã«ã¯ãƒã‚§ã‚¹ãƒˆã‚’å–り付ã‘ã¾ã™ã€‚éžè¢‹ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã‚‹ã®ã¯ã€é¨Žä¹—時ã¾ãŸã¯ã—ã®ã³è¶³ã—ã¦ã„る時ã§ã™ã€‚ + + + + 馬ã¨ãƒ­ãƒ (ラãƒã¯é™¤ã) ã¯ã€ä»–ã®å‹•物ã¨åŒæ§˜ã«é‡‘ã®ãƒªãƒ³ã‚´ã‚„金ã®ãƒ‹ãƒ³ã‚¸ãƒ³ã‚’使ã£ã¦ç¹æ®–ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚å­é¦¬ã‚„å­ãƒ­ãƒã¯æ™‚é–“ã¨ã¨ã‚‚ã«æˆä½“ã«ãªã‚Šã¾ã™ãŒã€å°éº¦ã‹å¹²ã—è‰ã‚’与ãˆã‚‹ã¨æˆé•·ãŒæ—©ã¾ã‚Šã¾ã™ã€‚ + + + + ã“ã“ã§ã¯é¦¬ã¨ãƒ­ãƒã‚’手ãªãšã‘ã¦ã¿ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã®å‘¨è¾ºã®ãƒã‚§ã‚¹ãƒˆã«ã¯éžã‚„馬よã‚ã„ãªã©ã®ä¾¿åˆ©ãªé¦¬ç”¨ã‚¢ã‚¤ãƒ†ãƒ ã‚‚ã‚りã¾ã™ã€‚ + + + + ã“れã¯ãƒ“ーコンã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェイスã§ã™ã€‚ã“れを使ã†ã¨ãƒ“ーコンã«å‰²ã‚Šå½“ã¦ã‚‹ãƒ‘ãƒ¯ãƒ¼ã‚’é¸æŠžã§ãã¾ã™ã€‚ + + + + {*B*}続行ã™ã‚‹ã«ã¯ {*CONTROLLER_VK_A*} を押ã—ã¾ã™ã€‚ + {*B*}ビーコンã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェイスã®ä½¿ã„方を既ã«çŸ¥ã£ã¦ã„ã‚‹å ´åˆã¯ã€{*CONTROLLER_VK_B*} を押ã—ã¾ã™ã€‚ + + + + ビーコン メニューã§ã¯ã€ãƒ“ーコンã«å‰²ã‚Šå½“ã¦ã‚‹ãƒ—ライマリ パワーを 1 ã¤é¸æŠžã§ãã¾ã™ã€‚ピラミッドã®éšŽå±¤ãŒå¢—ãˆã‚‹ã¨ã€ãƒ‘ワーã®é¸æŠžè‚¢ã‚‚増ãˆã¾ã™ã€‚ + + + + å°‘ãªãã¨ã‚‚ 4 層以上ã®ãƒ”ラミッドã«ç½®ã‹ã‚ŒãŸãƒ“ーコンã«ã¯ã€è¿½åŠ ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã¨ã—ã¦ã€Œå›žå¾©ã€ã®ã‚»ã‚«ãƒ³ãƒ€ãƒª パワーã‹ã€ã•らã«å¼·åŠ›ãªãƒ—ライマリ パワーãŒä»˜ä¸Žã•れã¾ã™ã€‚ + + + + ビーコンã®ãƒ‘ワーを設定ã™ã‚‹ã«ã¯ã€ã‚¨ãƒ¡ãƒ©ãƒ«ãƒ‰ã€ãƒ€ã‚¤ãƒ¤ãƒ¢ãƒ³ãƒ‰ã€é‡‘ã¾ãŸã¯é‰„ã®ã‚¤ãƒ³ã‚´ãƒƒãƒˆã‚’支払ã„ã‚¹ãƒ­ãƒƒãƒˆã§æ¶ˆè²»ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚一度設定ã™ã‚‹ã¨ã€ãƒ“ーコンã¯ãƒ‘ワーを無é™ã«ç™ºã—ã¾ã™ã€‚ + + +ã“ã®ãƒ”ラミッドã®é ‚上ã«ã¯ã€ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã§ãªã„ビーコンãŒã‚る。 + + + {*B*}ビーコンã«ã¤ã„ã¦ã‚‚ã£ã¨çŸ¥ã‚‹ã«ã¯ {*CONTROLLER_VK_A*} を押ã—ã¾ã™ã€‚ + {*B*}ビーコンã«ã¤ã„ã¦æ—¢ã«çŸ¥ã£ã¦ã„ã‚‹å ´åˆã¯ã€{*CONTROLLER_VK_B*} を押ã—ã¾ã™ã€‚ + + + + アクティブãªãƒ“ーコンã¯ç©ºã«å‘ã‘ã¦æ˜Žã‚‹ã„光線を放ã¡ã€ä»˜è¿‘ã®ãƒ—レイヤーã«ãƒ‘ワーを与ãˆã¾ã™ã€‚ビーコンã¯ã‚¬ãƒ©ã‚¹ã€é»’曜石ã€ã‚¦ã‚£ã‚¶ãƒ¼ã‚’倒ã™ã¨å…¥æ‰‹ã§ãã‚‹ãƒã‚¶ãƒ¼ã‚¹ã‚¿ãƒ¼ã‹ã‚‰ä½œã‚Šã¾ã™ã€‚ + + + + ビーコンã¯ã€æ˜¼é–“ã«æ—¥å…‰ã‚’å—ã‘る場所ã«è¨­ç½®ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ã¾ãŸã€ãƒ“ーコンã¯é‰„ã€é‡‘ã€ã‚¨ãƒ¡ãƒ©ãƒ«ãƒ‰ã€ã¾ãŸã¯ãƒ€ã‚¤ãƒ¤ãƒ¢ãƒ³ãƒ‰ã®ãƒ”ラミッド上ã«è¨­ç½®ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。ãŸã ã—建æã®é•ã„ã«ã‚ˆã‚‹ãƒ“ーコンã®ãƒ‘ワーã¸ã®å½±éŸ¿ã¯ã‚りã¾ã›ã‚“。 + + + + ビーコンを使ã£ã¦ã€ãã“ã‹ã‚‰ä¸Žãˆã‚‹ãƒ‘ワーを設定ã—ã¦ã¿ã¾ã—ょã†ã€‚å¿…è¦ãªæ”¯æ‰•ã„ã«ã¯é‰„ã®ã‚¤ãƒ³ã‚´ãƒƒãƒˆã‚’使ã†ã“ã¨ãŒã§ãã¾ã™ã€‚ + + +ã“ã®éƒ¨å±‹ã«ã¯ãƒ›ãƒƒãƒ‘ーãŒã‚ã‚‹ + + + {*B*}ホッパーã«ã¤ã„ã¦ã‚‚ã£ã¨çŸ¥ã‚‹ã«ã¯ {*CONTROLLER_VK_A*} を押ã—ã¾ã™ã€‚ + {*B*}ホッパーã«ã¤ã„ã¦æ—¢ã«çŸ¥ã£ã¦ã„ã‚‹å ´åˆã¯ã€{*CONTROLLER_VK_B*} を押ã—ã¾ã™ã€‚ + + + + ホッパーã¯å…¥ã‚Œç‰©ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’出ã—入れã™ã‚‹ãŸã‚ã«ã€ã¾ãŸã¯ãƒ›ãƒƒãƒ‘ãƒ¼ä¸Šã«æŠ•ã’られãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’è‡ªå‹•çš„ã«æ‹¾ã†ãŸã‚ã«ä½¿ã„ã¾ã™ã€‚ + + + + ホッパーã¯èª¿åˆå°ã€ãƒã‚§ã‚¹ãƒˆã€ç™ºå°„装置ã€ãƒ‰ãƒ­ãƒƒãƒ‘ーã€ãƒã‚§ã‚¹ãƒˆä»˜ãトロッコã€ãƒ›ãƒƒãƒ‘ー付ãトロッコã€ãŠã‚ˆã³ä»–ã®ãƒ›ãƒƒãƒ‘ーã«å¯¾ã—ã¦ä½œç”¨ã§ãã¾ã™ã€‚ + + + + ホッパーã¯ã€ãã®ä¸Šã«ä½ç½®ã™ã‚‹é©åˆ‡ãªå…¥ã‚Œç‰©ã‹ã‚‰ã‚¢ã‚¤ãƒ†ãƒ ã‚’å¸ã„出ã—ç¶šã‘ã¾ã™ã€‚ã¾ãŸã€ä¿ç®¡ã•れãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’出力先ã®å…¥ã‚Œç‰©ã«æ ¼ç´ã—ã¾ã™ã€‚ + + + + ã—ã‹ã—ã€ãƒ¬ãƒƒãƒ‰ã‚¹ãƒˆãƒ¼ãƒ³ãŒé›»æºã®å ´åˆã€ãƒ›ãƒƒãƒ‘ーã¯éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã«ãªã‚Šã€ã‚¢ã‚¤ãƒ†ãƒ ã®å¸ã„出ã—ã‚‚æ ¼ç´ã‚‚åœæ­¢ã—ã¾ã™ã€‚ + + + + ホッパーã®å‘ãã¯ã‚¢ã‚¤ãƒ†ãƒ ã‚’排出ã™ã‚‹æ–¹å‘を示ã—ã¾ã™ã€‚ホッパーãŒç‰¹å®šã®ãƒ–ロックã«å‘ãよã†ã«ã™ã‚‹ã«ã¯ã€ã—ã®ã³è¶³ã—ãªãŒã‚‰ãã®ãƒ–ロックã«å‘ã‘ã¦è¨­ç½®ã—ã¾ã™ã€‚ + + + + ã“ã®éƒ¨å±‹ã«ã¯æ§˜ã€…ãªå½¹ç«‹ã¤ãƒ›ãƒƒãƒ‘ーã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆãŒç”¨æ„ã—ã¦ã‚りã€ç›®ã§è¦‹ã¦è©¦ã›ã¾ã™ã€‚ + + + + ã“れã¯èбç«ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェイスã§ã™ã€‚ã“れを使ãˆã°èбç«ã¨ã€èбç«ã®æ˜Ÿã‚’作るã“ã¨ãŒã§ãã¾ã™ã€‚ + + + + {*B*}続行ã™ã‚‹ã«ã¯ {*CONTROLLER_VK_A*} を押ã—ã¾ã™ã€‚ + {*B*}花ç«ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェイスã®ä½¿ã„方を既ã«çŸ¥ã£ã¦ã„ã‚‹å ´åˆã¯ã€{*CONTROLLER_VK_B*} を押ã—ã¾ã™ã€‚ + + + + 花ç«ã‚’作るã«ã¯ã€ç«è–¬ã¨ç´™ã‚’インベントリã®ä¸Šã«è¡¨ç¤ºã•れる 3x3 ã®ã‚¯ãƒ©ãƒ•ト グリッドã«ç½®ãã¾ã™ã€‚ + + + + オプションã¨ã—ã¦ã€ã‚¯ãƒ©ãƒ•ト グリッド上ã«è¤‡æ•°ã®èбç«ã®æ˜Ÿã‚’ç½®ã„ã¦ã€èбç«ã«è¿½åŠ ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ + + + + クラフト グリッドã®ã‚¹ãƒ­ãƒƒãƒˆã«ç«è–¬ã‚’多ãç½®ãã»ã©ã€èбç«ã®æ˜Ÿã¯ã•らã«é«˜ã„ã¨ã“ã‚ã§ç ´è£‚ã—ã¾ã™ã€‚ + + + + 作ã£ãŸèбç«ã¯ã€ä½œã‚ŠãŸã„時ã«ã„ã¤ã§ã‚‚å–り出ã—å£ã‹ã‚‰å–り出ã›ã¾ã™ã€‚ + + + + 花ç«ã®æ˜Ÿã‚’作るã«ã¯ã€ç«è–¬ã¨æŸ“料をクラフト グリッドã«ç½®ãã¾ã™ã€‚ + + + + 染料を使ã£ã¦ã€èбç«ã®æ˜ŸãŒç ´è£‚ã™ã‚‹éš›ã®è‰²ã‚’決ã‚ã¾ã™ã€‚ + + + + 花ç«ã®æ˜Ÿã®å½¢çжã¯ã€ç™ºç«å‰¤ã€é‡‘塊ã€ç¾½æ ¹ã€ã¾ãŸã¯ãƒ˜ãƒƒãƒ‰ã‚’追加ã—ã¦æ±ºå®šã—ã¾ã™ã€‚ + + + + 光跡や点滅ã¯ã€ãƒ€ã‚¤ãƒ¤ãƒ¢ãƒ³ãƒ‰ã¾ãŸã¯ã‚°ãƒ­ã‚¦ã‚¹ãƒˆãƒ¼ãƒ³ã®ç²‰ã‚’使ã£ã¦è¿½åŠ ã§ãã¾ã™ã€‚ + + + + 花ç«ã®æ˜Ÿã‚’作ã£ãŸå¾Œã€ã•ã‚‰ã«æŸ“料を加ãˆã‚Œã°ã€èбç«ã®æ˜Ÿã®è‰²å¤‰åŒ–を決ã‚られã¾ã™ã€‚ + + + + ã“ã“ã«ã‚ã‚‹ãƒã‚§ã‚¹ãƒˆã®ä¸­ã«ã¯ã€èбç«ä½œã‚Šã«ä½¿ã‚れる様々ãªã‚¢ã‚¤ãƒ†ãƒ ãŒå…¥ã£ã¦ã„ã¾ã™! + + + + {*B*}花ç«ã«ã¤ã„ã¦ã‚‚ã£ã¨çŸ¥ã‚‹ã«ã¯ {*CONTROLLER_VK_A*} を押ã—ã¾ã™ã€‚ + {*B*}花ç«ã«ã¤ã„ã¦æ—¢ã«çŸ¥ã£ã¦ã„ã‚‹å ´åˆã¯ã€{*CONTROLLER_VK_B*} を押ã—ã¾ã™ã€‚ + + + + 花ç«ã¯è£…飾アイテムã§ã€æ‰‹å‹•ã€ã¾ãŸã¯ç™ºå°„装置ã‹ã‚‰æ‰“ã¡ä¸Šã’ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚作るã«ã¯ã€ç´™ã€ç«è–¬ã€ãŠã‚ˆã³ã‚ªãƒ—ションã¨ã—ã¦æ•°ã€…ã®èбç«ã®æ˜Ÿã‚’使ã„ã¾ã™ã€‚ + + + + 花ç«ã®æ˜Ÿã®è‰²ã€è‰²å¤‰åŒ–ã€å½¢çжã€ã‚µã‚¤ã‚ºã€åŠ¹æžœ (光跡ã€ç‚¹æ»…ãªã©) ã¯ã€ä½œã‚‹éš›ã«ææ–™ã‚’追加ã™ã‚Œã°ã§ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã§ãã¾ã™ã€‚ + + + + ãƒã‚§ã‚¹ãƒˆã«ã‚ã‚‹ã„ã‚ã„ã‚ãªææ–™ã‚’ä½¿ã£ã¦ã€ä½œæ¥­å°ã§èбç«ã‚’作ã£ã¦ã¿ã¾ã—ょã†ã€‚ + +  é¸æŠž 使ㆠ@@ -2829,6 +3384,22 @@ Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ゲーム㫠Xbox One 用ã«ã‚»ãƒ¼ãƒ–をアップロード +騎乗ã™ã‚‹ + +é™ã‚Šã‚‹ + +ãƒã‚§ã‚¹ãƒˆã‚’ç€ã‘ã‚‹ + +打ã¡ä¸Šã’ã‚‹ + +首ã²ã‚‚ã‚’ã¤ã‘ã‚‹ + +首ã²ã‚‚ã‚’ã¯ãšã™ + +装ç€ã™ã‚‹ + +åå‰ã‚’ã¤ã‘ã‚‹ + OK キャンセル @@ -3143,6 +3714,20 @@ Minecraft Xbox 360 版ã¯ã€åˆæœŸè¨­å®šã§ãƒžãƒ«ãƒãƒ—レイヤー ゲーム㫠発射装置 +馬 + +ドロッパー + +ホッパー + +ビーコン + +プライマリ パワー + +セカンダリ パワー + +トロッコ + ç¾åœ¨ã€ã“ã®ã‚¿ã‚¤ãƒ—ã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ コンテンツã¯ã‚りã¾ã›ã‚“ %s ãŒä¸–界ã«ã‚„ã£ã¦ãã¾ã—㟠@@ -3302,10 +3887,14 @@ OK ã‚’é¸æŠžã™ã‚‹ã¨ã€ã“ã®ä¸–界ã§ã®ãƒ—レイを終了ã—ã¾ã™ ゲームモード: クリエイティブ +ゲーム モード: アドベンãƒãƒ£ãƒ¼ + サãƒã‚¤ãƒãƒ« クリエイティブ +アドベンãƒãƒ£ãƒ¼ + サãƒã‚¤ãƒãƒ« モードã§ä½œæˆ クリエイティブ モードã§ä½œæˆ @@ -3326,6 +3915,8 @@ OK ã‚’é¸æŠžã™ã‚‹ã¨ã€ã“ã®ä¸–界ã§ã®ãƒ—レイを終了ã—ã¾ã™ スーパーフラット +åŒã˜åœ°å½¢ã‚’å†åº¦ç”Ÿæˆã™ã‚‹ã«ã¯ç¨®ã‚’入れã¾ã™ã€‚ランダムãªä¸–界ã®å ´åˆã€ç©ºæ¬„ã®ã¾ã¾ã«ã—ã¾ã™ã€‚ + 有効ã«ã™ã‚‹ã¨ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã®ã‚²ãƒ¼ãƒ ã«ãªã‚Šã¾ã™ 有効ã«ã™ã‚‹ã¨ã€æ‹›å¾…ã•れãŸãƒ—レイヤーã—ã‹å‚加ã§ãã¾ã›ã‚“ @@ -3350,6 +3941,20 @@ OK ã‚’é¸æŠžã™ã‚‹ã¨ã€ã“ã®ä¸–界ã§ã®ãƒ—レイを終了ã—ã¾ã™ 有効ã«ã™ã‚‹ã¨ã€ãƒ—レイヤーã®å¾©æ´»åœ°ç‚¹ã®è¿‘ãã«ä¾¿åˆ©ãªã‚¢ã‚¤ãƒ†ãƒ ã®å…¥ã£ãŸãƒã‚§ã‚¹ãƒˆãŒå‡ºç¾ã—ã¾ã™ +無効ã«ã™ã‚‹ã¨ã€ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ã‚„動物ãŒãƒ–ロックを変ãˆã‚‹ã“ã¨ãŒãªããªã‚Š (例: Creeper ãŒçˆ†ç™ºã—ã¦ã‚‚ブロックãŒç ´å£Šã•れãªã„ã€ç¾ŠãŒè‰ã‚’å–り除ã‹ãªã„)ã€ã‚¢ã‚¤ãƒ†ãƒ ã‚‚拾ã„ã¾ã›ã‚“。 + +有効ã«ã™ã‚‹ã¨ã€ã‚²ãƒ¼ãƒ ã‚ªãƒ¼ãƒãƒ¼æ™‚ã«ãƒ—ãƒ¬ã‚¤ãƒ¤ãƒ¼ã®æŒã¡ç‰©ãŒå¤±ã‚れã¾ã›ã‚“。 + +無効ã«ã™ã‚‹ã¨ã€ç”Ÿã物ã¯è‡ªç„¶ã«å‡ºç¾ã—ã¾ã›ã‚“。 + +無効ã«ã™ã‚‹ã¨ã€ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ã‚„å‹•ç‰©ã¯æˆ¦åˆ©å“をドロップã—ã¾ã›ã‚“ (例: Creeper ã¯ç«è–¬ã‚’ドロップã—ãªã„)。 + +無効ã«ã™ã‚‹ã¨ã€ãƒ–ロックを壊ã—ã¦ã‚‚アイテムをè½ã¨ã—ã¾ã›ã‚“ (例: 石ブロックãŒä¸¸çŸ³ã‚’è½ã¨ã•ãªã„)。 + +無効ã«ã™ã‚‹ã¨ã€ãƒ—レイヤー㮠HP を自然ã«å†ç”Ÿã•れã¾ã›ã‚“。 + +無効ã«ã™ã‚‹ã¨ã€æ™‚刻ãŒå¤‰ã‚りã¾ã›ã‚“。 + スキン パック テーマ @@ -3398,7 +4003,49 @@ OK ã‚’é¸æŠžã™ã‚‹ã¨ã€ã“ã®ä¸–界ã§ã®ãƒ—レイを終了ã—ã¾ã™ {*PLAYER*} 㯠{*SOURCE*} ã«å©ãæ½°ã•れ㟠-{*PLAYER*} 㯠{*SOURCE*} ã«å€’ã•れ㟠+{*PLAYER*} 㯠{*SOURCE*} ã®é­”法ã«ã‚ˆã£ã¦å€’ã•れ㟠+ +{*PLAYER*} ã¯ãƒã‚·ã‚´ã‹ã‚‰è½ã¡ãŸ + +{*PLAYER*} ã¯ã€ã¤ã‚‹ã‹ã‚‰è½ã¡ãŸ + +{*PLAYER*} ã¯æ°´ã‹ã‚‰è½ã¡ãŸ + +{*PLAYER*} ã¯é«˜ã„ã¨ã“ã‚ã‹ã‚‰è½ã¡ãŸ + +{*PLAYER*} 㯠{*SOURCE*} ã«ã‚ˆã£ã¦æ»…ã³ã‚‹é‹å‘½ã«ã‚ã£ãŸ + +{*PLAYER*} 㯠{*SOURCE*} ã«ã‚ˆã£ã¦æ»…ã³ã‚‹é‹å‘½ã«ã‚ã£ãŸ + +{*PLAYER*} 㯠{*SOURCE*} ã® {*ITEM*} ã«ã‚ˆã£ã¦æ»…ã³ã‚‹é‹å‘½ã«ã‚ã£ãŸ + +{*PLAYER*} ã¯ã‚ã¾ã‚Šã«é«˜ã„ã¨ã“ã‚ã‹ã‚‰è½ã¡ã€{*SOURCE*} ã«ã¨ã©ã‚を刺ã•れ㟠+ +{*PLAYER*} ã¯ã‚ã¾ã‚Šã«é«˜ã„ã¨ã“ã‚ã‹ã‚‰è½ã¡ã€{*SOURCE*} ã« {*ITEM*} ã§ã¨ã©ã‚を刺ã•れ㟠+ +{*PLAYER*} 㯠{*SOURCE*} ã¨æˆ¦ã†ã†ã¡ã«ç«ã®ä¸­ã¸ã¨é€²ã‚“ã§è¡Œã£ãŸ + +{*PLAYER*} 㯠{*SOURCE*} ã¨æˆ¦ã†ã†ã¡ã«ã‚«ãƒªã‚«ãƒªã«ç„¼ã‹ã‚ŒãŸ + +{*PLAYER*} 㯠{*SOURCE*} ã‹ã‚‰é€ƒã‚Œã‚‹ãŸã‚ã«æº¶å²©ã®ä¸­ã‚’æ³³ã”ã†ã¨ã—㟠+ +{*PLAYER*} 㯠{*SOURCE*} ã‹ã‚‰é€ƒã‚Œã‚ˆã†ã¨ã™ã‚‹ã†ã¡ã«æººã‚ŒãŸ + +{*PLAYER*} 㯠{*SOURCE*} ã‹ã‚‰é€ƒã‚Œã‚ˆã†ã¨ã™ã‚‹ã†ã¡ã«ã‚µãƒœãƒ†ãƒ³ã«è¶³ã‚’è¸ã¿å…¥ã‚ŒãŸ + +{*PLAYER*} 㯠{*SOURCE*} ã«å¹ã飛ã°ã•れ㟠+ +{*PLAYER*} ã¯å¼±ã‚Šæžœã¦ãŸ + +{*PLAYER*} 㯠{*SOURCE*} ã« {*ITEM*} ã§å€’ã•れ㟠+ +{*PLAYER*} 㯠{*SOURCE*} ã« {*ITEM*} ã§æ’ƒãŸã‚ŒãŸ + +{*PLAYER*} 㯠{*SOURCE*} ã« {*ITEM*} ã§ç«ã ã‚‹ã¾ã«ã•れ㟠+ +{*PLAYER*} 㯠{*SOURCE*} ã« {*ITEM*} ã§ç«ã ã‚‹ã¾ã«ã•れ㟠+ +{*PLAYER*} 㯠{*SOURCE*} ã« {*ITEM*} ã§å€’ã•れ㟠岩盤ã®éœ§ @@ -3552,7 +4199,7 @@ OK ã‚’é¸æŠžã™ã‚‹ã¨ã€ã“ã®ä¸–界ã§ã®ãƒ—レイを終了ã—ã¾ã™ {*C2*}「ãã—ã¦åƒ•ãŒå›ã‚’æ„›ã™ã‚‹ã®ã¯ã€å›è‡ªèº«ãŒæ„›ã§ã‚ã‚‹ã‹ã‚‰ã ã€{*EF*}{*B*}{*B*} {*C3*}ゲームã¯çµ‚ã‚りã€ãƒ—レイヤーã¯å¤¢ã‹ã‚‰ç›®è¦šã‚ã€ã¾ãŸæ–°ã—ã„夢ãŒå§‹ã¾ã‚Šã¾ã™ã€‚次ã«ãƒ—レイヤーãŒè¦‹ã‚‹å¤¢ã¯ã‚‚ã£ã¨ç´ æ™´ã‚‰ã—ã„ã‚‚ã®ã§ã—ょã†ã€‚プレイヤーã¯å®‡å®™ã§ã‚ã‚Šã€æ„›ã§ã—ãŸ{*EF*}{*B*}{*B*} {*C3*}ã•ã‚ã€ãƒ—レイヤー{*EF*}{*B*}{*B*} -{*C2*}目を覚ã¾ã—ã¦{*EF*}{*B*}{*B*} +{*C2*}目を覚ã¾ã—ã¦{*EF*} 暗黒界をリセットã™ã‚‹ @@ -3563,9 +4210,9 @@ OK ã‚’é¸æŠžã™ã‚‹ã¨ã€ã“ã®ä¸–界ã§ã®ãƒ—レイを終了ã—ã¾ã™ 暗黒界をリセットã—ãªã„ -ç¾åœ¨ã€Mooshroom ã¯æ¯›åˆˆã‚Šã§ãã¾ã›ã‚“。豚ã€ç¾Šã€ç‰›ã€ãƒã‚³ã®æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—ãŸã€‚ +ç¾åœ¨ã€Mooshroom ã¯æ¯›åˆˆã‚Šã§ãã¾ã›ã‚“。豚ã€ç¾Šã€ç‰›ã€ãƒã‚³ã€é¦¬ã®æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—ãŸã€‚ -ç¾åœ¨ã€ã‚¹ãƒãƒ¼ãƒ³ エッグを使用ã§ãã¾ã›ã‚“。 豚ã€ç¾Šã€ç‰›ã€ãƒã‚³ã®æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—㟠+ç¾åœ¨ã€ã‚¹ãƒãƒ¼ãƒ³ エッグを使用ã§ãã¾ã›ã‚“。 豚ã€ç¾Šã€ç‰›ã€ãƒã‚³ã€é¦¬ã®æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—ãŸã€‚ ç¾åœ¨ã€ã‚¹ãƒãƒ¼ãƒ³ エッグを使用ã§ãã¾ã›ã‚“。 Mooshroom ã®æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—㟠@@ -3575,6 +4222,8 @@ OK ã‚’é¸æŠžã™ã‚‹ã¨ã€ã“ã®ä¸–界ã§ã®ãƒ—レイを終了ã—ã¾ã™ ç¾åœ¨ã€ã‚¹ãƒãƒ¼ãƒ³ エッグを使用ã§ãã¾ã›ã‚“。 世界ã®ã‚¤ã‚«ã®æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—㟠+ç¾åœ¨ã€ã‚¹ãƒãƒ¼ãƒ³ エッグを使用ã§ãã¾ã›ã‚“。 ä¸–ç•Œã®æ‘äººã®æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—㟠+ ç¾åœ¨ã€ã‚¹ãƒãƒ¼ãƒ³ エッグを使用ã§ãã¾ã›ã‚“。 ä¸–ç•Œã®æ•µã®æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—㟠ç¾åœ¨ã€ã‚¹ãƒãƒ¼ãƒ³ エッグを使用ã§ãã¾ã›ã‚“。 ä¸–ç•Œã®æ‘äººã®æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—㟠@@ -3583,12 +4232,14 @@ OK ã‚’é¸æŠžã™ã‚‹ã¨ã€ã“ã®ä¸–界ã§ã®ãƒ—レイを終了ã—ã¾ã™ 難易度「ピースã€ã§ã¯æ•µã‚’出ç¾ã•ã›ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 -ã“ã®å‹•ç‰©ã¯æ±‚愛モードã«ã§ãã¾ã›ã‚“。豚ã€ç¾Šã€ç‰›ã€ãƒã‚³ã®ç¹æ®–æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—㟠+ã“ã®å‹•ç‰©ã¯æ±‚愛モードã«ã§ãã¾ã›ã‚“。豚ã€ç¾Šã€ç‰›ã€ãƒã‚³ã€é¦¬ã®ç¹æ®–æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—ãŸã€‚ ã“ã®å‹•ç‰©ã¯æ±‚愛モードã«ã§ãã¾ã›ã‚“。オオカミã®ç¹æ®–æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—㟠ã“ã®å‹•ç‰©ã¯æ±‚愛モードã«ã§ãã¾ã›ã‚“。ニワトリã®ç¹æ®–æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—㟠+ã“ã®å‹•ç‰©ã¯æ±‚愛モードã«ã§ãã¾ã›ã‚“。馬ã®ç¹æ®–æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—ãŸã€‚ + ã“ã®å‹•ç‰©ã¯æ±‚愛モードã«ã§ãã¾ã›ã‚“。Mooshroom ã®ç¹æ®–æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—㟠世界ã®ãƒœãƒ¼ãƒˆã®æ•°ãŒæœ€å¤§æ•°ã«é”ã—ã¾ã—㟠@@ -3616,27 +4267,43 @@ OK ã‚’é¸æŠžã™ã‚‹ã¨ã€ã“ã®ä¸–界ã§ã®ãƒ—レイを終了ã—ã¾ã™ クレジット コンテンツをå†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ« - + デãƒãƒƒã‚°è¨­å®š - + ç«ã®å»¶ç„¼ - + TNT ã®çˆ†ç™º - + PvP - + é«˜åº¦ãªæ“ä½œã‚’è¨±å¯ - + ホスト特権 - + 建物を生æˆã™ã‚‹ - + スーパーフラット - + ボーナス ãƒã‚§ã‚¹ãƒˆ - + 世界ã®ã‚ªãƒ—ション - + +ゲーム オプション + +生ã物ã«ã‚ˆã‚‹å¦¨å®³ + +æŒã¡ç‰©ã®ä¿æŒ + +生ã物ã®å‡ºç¾ + +生ã物ã‹ã‚‰ã®æˆ¦åˆ©å“ + +タイルã‹ã‚‰ã®ã‚¢ã‚¤ãƒ†ãƒ å…¥æ‰‹ + +自然å†ç”Ÿ + +時刻ã®å¤‰åŒ– + å»ºè¨­ã¨æŽ¡æŽ˜ã®è¨±å¯ ドアã¨ã‚¹ã‚¤ãƒƒãƒã‚’使用å¯èƒ½ @@ -3647,7 +4314,7 @@ OK ã‚’é¸æŠžã™ã‚‹ã¨ã€ã“ã®ä¸–界ã§ã®ãƒ—レイを終了ã—ã¾ã™ 動物を攻撃å¯èƒ½ -ホストオプションを変更ã§ãã‚‹ +ホストオプションを変更å¯èƒ½ プレイヤーを追放 @@ -3675,7 +4342,7 @@ OK ã‚’é¸æŠžã™ã‚‹ã¨ã€ã“ã®ä¸–界ã§ã®ãƒ—レイを終了ã—ã¾ã™ 世界ã®ç¨® -ランダムã«ç¨®ã‚’決ã‚ã‚‹å ´åˆã€ç©ºç™½ã®ã¾ã¾ã«ã—ã¦ãã ã•ã„ +空白ã®ã¾ã¾ã§ç¨®ã‚’ãƒ©ãƒ³ãƒ€ãƒ ã«æ±ºå®šã™ã‚‹ プレイヤー @@ -3697,17 +4364,17 @@ OK ã‚’é¸æŠžã™ã‚‹ã¨ã€ã“ã®ä¸–界ã§ã®ãƒ—レイを終了ã—ã¾ã™ ã‚²ãƒ¼ãƒ ã«æˆ»ã‚‹ -セーブ +ゲームをセーブ 難易度: -ゲームタイプ: +ゲーム タイプ: ゲーマータグ: 建物: -レベルタイプ: +レベル タイプ: PvP: @@ -3823,6 +4490,14 @@ OK ã‚’é¸æŠžã™ã‚‹ã¨ã€ã“ã®ä¸–界ã§ã®ãƒ—レイを終了ã—ã¾ã™ 毒 +ウィザー + +HP ブースト + +å¸åŽ + +飽和 + スピード㮠éˆåŒ–ã® @@ -3861,6 +4536,14 @@ OK ã‚’é¸æŠžã™ã‚‹ã¨ã€ã“ã®ä¸–界ã§ã®ãƒ—レイを終了ã—ã¾ã™ 毒㮠+ (è¡°å¼±) + + (HP ブースト) + + (å¸åŽ) + + (飽和) + II @@ -3957,6 +4640,22 @@ OK ã‚’é¸æŠžã™ã‚‹ã¨ã€ã“ã®ä¸–界ã§ã®ãƒ—レイを終了ã—ã¾ã™ プレイヤーã€å‹•物ã€ãƒ¢ãƒ³ã‚¹ã‚¿ãƒ¼ã® HP を時間ã¨ã¨ã‚‚ã«æ¸›å°‘ã•ã›ã¾ã™ +é©ç”¨æ™‚: + +馬ã®ã‚¸ãƒ£ãƒ³ãƒ—å¼·ã• + +ã‚¾ãƒ³ãƒ“ã®æ´è» + +最大 HP + +生ã物ã«ã‚ˆã‚‹è¿½å°¾ç¯„囲 + +ノックãƒãƒƒã‚¯è€æ€§ + +スピード + +攻撃ダメージ + é‹­ã• è–ãªã‚‹åŠ› @@ -4047,13 +4746,13 @@ OK ã‚’é¸æŠžã™ã‚‹ã¨ã€ã“ã®ä¸–界ã§ã®ãƒ—レイを終了ã—ã¾ã™ 3{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚ジャガイモをã‹ã¾ã©ã§èª¿ç†ã™ã‚‹ã¨ã§ãã‚‹ -1{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚ã‹ã¾ã©ã§èª¿ç†ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã€‚è¾²åœ°ã«æ¤ãˆã‚‹ã“ã¨ãŒã§ãる。病気ã«ãªã‚‹å ´åˆãŒã‚ã‚‹ +1{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚ç—…æ°—ã«ãªã‚‹å ´åˆãŒã‚ã‚‹ 3{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚ニンジンã¨é‡‘ã®å¡Šã‹ã‚‰ä½œã‚‹ éžã‚’ç€ã‘ãŸè±šã«ä¹—ã£ãŸæ™‚ã€æ“縦ã™ã‚‹ã®ã«ä½¿ã† -4{*ICON_SHANK_01*} 回復ã™ã‚‹ +4{*ICON_SHANK_01*} 回復ã™ã‚‹ã€‚ 武器ã€é“å…·ã€é˜²å…·ã‚’エンãƒãƒ£ãƒ³ãƒˆã™ã‚‹ã®ã«é‡‘床ã¨ä¸€ç·’ã«ä½¿ç”¨ã™ã‚‹ @@ -4445,7 +5144,7 @@ OK ã‚’é¸æŠžã™ã‚‹ã¨ã€ã“ã®ä¸–界ã§ã®ãƒ—レイを終了ã—ã¾ã™ Xbox 360 -Back +戻る ã“ã®ã‚ªãƒ—ションã§ã¯ã€å®Ÿç¸¾ãŠã‚ˆã³ãƒ©ãƒ³ã‚­ãƒ³ã‚°æ›´æ–°ã¯ç„¡åйã«ãªã‚Šã¾ã™ã€‚ diff --git a/Minecraft.Client/Common/Media/ko-KR/4J_strings.resx b/Minecraft.Client/Common/Media/ko-KR/4J_strings.resx index a084ef5d..dfa720ac 100644 --- a/Minecraft.Client/Common/Media/ko-KR/4J_strings.resx +++ b/Minecraft.Client/Common/Media/ko-KR/4J_strings.resx @@ -73,11 +73,11 @@ 게ì´ë¨¸ í”„ë¡œí•„ì´ ì˜¤í”„ë¼ì¸ ìƒíƒœìž…니다. -ì´ ê²Œìž„ 기능 중 ì¼ë¶€ëŠ” 게ì´ë¨¸ 프로필로 Xbox Liveì— ë¡œê·¸ì¸í•´ì•¼ ì´ìš©í•  수 있습니다. 현재는 오프ë¼ì¸ ìƒíƒœìž…니다. +ì´ ê²Œìž„ 기능 중 ì¼ë¶€ëŠ” 게ì´ë¨¸ 프로필로 Xbox LIVEì— ë¡œê·¸ì¸í•´ì•¼ ì´ìš©í•  수 있습니다. 현재는 오프ë¼ì¸ ìƒíƒœìž…니다. -ì´ ê¸°ëŠ¥ì„ ì´ìš©í•˜ë ¤ë©´ 게ì´ë¨¸ 프로필로 Xbox Liveì— ë¡œê·¸ì¸í•´ì•¼ 합니다. +ì´ ê¸°ëŠ¥ì„ ì´ìš©í•˜ë ¤ë©´ 게ì´ë¨¸ 프로필로 Xbox LIVEì— ë¡œê·¸ì¸í•´ì•¼ 합니다. -Xbox Live ì—°ê²° +Xbox LIVE ì—°ê²° 오프ë¼ì¸ìœ¼ë¡œ 계ì†í•˜ê¸° diff --git a/Minecraft.Client/Common/Media/ko-KR/strings.resx b/Minecraft.Client/Common/Media/ko-KR/strings.resx index 17c67711..6516a2f4 100644 --- a/Minecraft.Client/Common/Media/ko-KR/strings.resx +++ b/Minecraft.Client/Common/Media/ko-KR/strings.resx @@ -150,7 +150,7 @@ Minecraft는 블ë¡ì„ 배치하여 무엇ì´ë“  ìƒìƒí•œ 대로 만들 수 있 {*CONTROLLER_ACTION_LOOK*}으로 주위를 둘러봅니다.{*B*}{*B*} {*CONTROLLER_ACTION_MOVE*}으로 ì£¼ë³€ì„ ì´ë™í•©ë‹ˆë‹¤.{*B*}{*B*} {*CONTROLLER_ACTION_JUMP*}를 누르면 ì í”„합니다.{*B*}{*B*} -{*CONTROLLER_ACTION_MOVE*}ì„ ì•žìœ¼ë¡œ 빠르게 ë‘ ë²ˆ 누르면 질주합니다. {*CONTROLLER_ACTION_MOVE*}를 ê³„ì† ëˆ„ë¥´ê³  있으면 질주 ì‹œê°„ì´ ë‹¤ ë˜ê±°ë‚˜ ìŒì‹ 막대가 {*ICON_SHANK_03*} ì´í•˜ê°€ ë  ë•Œê¹Œì§€ ê³„ì† ì§ˆì£¼í•©ë‹ˆë‹¤. +{*CONTROLLER_ACTION_MOVE*}ì„ ì•žìœ¼ë¡œ 빠르게 ë‘ ë²ˆ 누르면 질주합니다. {*CONTROLLER_ACTION_MOVE*}를 ê³„ì† ëˆ„ë¥´ê³  있으면 질주 ì‹œê°„ì´ ë‹¤ ë˜ê±°ë‚˜ ìŒì‹ 막대가 {*ICON_SHANK_03*} ì´í•˜ê°€ ë  ë•Œê¹Œì§€ ê³„ì† ì§ˆì£¼í•©ë‹ˆë‹¤.{*B*}{*B*} {*CONTROLLER_ACTION_ACTION*}를 누르고 있으면 ì†ì´ë‚˜ ë„구를 사용해 채굴하거나 벌목합니다. 특정 블ë¡ì„ 채굴하려면 ë„구를 만들어야 í•  수 있습니다.{*B*}{*B*} ì†ì— ì•„ì´í…œì„ 들고 있다면 {*CONTROLLER_ACTION_USE*}를 눌러 사용하거나 {*CONTROLLER_ACTION_DROP*}를 눌러 버릴 수 있습니다. @@ -229,11 +229,11 @@ HUD는 ì²´ë ¥ì´ë‚˜ 산소(물ì†ì— ìžˆì„ ë•Œ), ë°°ê³ í”” 레벨(ë°°ê³ í””ì„ {*T3*}í”Œë ˆì´ ë°©ë²•: 효과부여{*ETW*}{*B*}{*B*} 괴물 ë° ë™ë¬¼ì„ 처치하거나 ë˜ëŠ” 특정 블ë¡ì„ 채굴하거나 녹여서 ì–»ì„ ìˆ˜ 있는 경험치로 ë„구, 무기 ë° ë°©ì–´êµ¬ì— íš¨ê³¼ë¥¼ 부여할 수 있습니다.{*B*} -ê²€, 활, ë„ë¼, 곡괭ì´, 삽 ë˜ëŠ” 방어구를 íš¨ê³¼ë¶€ì—¬ëŒ€ì— ë†“ì¸ ì±… ì•„ëž˜ì— ìžˆëŠ” ìŠ¬ë¡¯ì— ë„£ìœ¼ë©´ 슬롯 ì˜¤ë¥¸ìª½ì— ê°ê° 경험치 ë¹„ìš©ì´ ì“°ì¸ ë‹¨ì¶” 세 개가 나타납니다.{*B*} +ê²€, 활, ë„ë¼, 곡괭ì´, 삽 ë˜ëŠ” 방어구를 íš¨ê³¼ë¶€ì—¬ëŒ€ì— ë†“ì¸ ì±… ì•„ëž˜ì— ìžˆëŠ” ìŠ¬ë¡¯ì— ë„£ìœ¼ë©´ 슬롯 ì˜¤ë¥¸ìª½ì— ê°ê° 경험치 ë¹„ìš©ì´ ì“°ì¸ ë‹¨ì¶” 세 개가 나타납니다.{*B*} íš¨ê³¼ë¶€ì—¬ì— í•„ìš”í•œ 경험치가 모ìžëž€ í•­ëª©ì€ ë¹¨ê°„ìƒ‰ìœ¼ë¡œ 나타나며, 그렇지 않다면 ì´ˆë¡ìƒ‰ìœ¼ë¡œ 나타납니다.{*B*}{*B*} 실제 효과부여는 í‘œì‹œëœ ë¹„ìš©ì— ê¸°ë°˜ì„ ë‘ê³  무작위로 ì ìš©ë©ë‹ˆë‹¤.{*B*}{*B*} 효과부여대가 한 ë¸”ë¡ ê°„ê²©ì„ ë‘ê³  ì±…ìž¥ì— ë‘˜ëŸ¬ì‹¸ì—¬ 있으면(최대 책장 15개까지) 효과부여 ë ˆë²¨ì´ ìƒìŠ¹í•˜ë©°, íš¨ê³¼ë¶€ì—¬ëŒ€ì— ë†“ì¸ ì±…ì— ì‹ ë¹„í•œ ë¬¸ì–‘ì´ ë‚˜íƒ€ë‚©ë‹ˆë‹¤.{*B*}{*B*} -효과부여대를 만들 때 ì“°ì´ëŠ” 모든 재료는 월드 ì•ˆì˜ ë§ˆì„ì—서 찾거나 월드 안ì—서 채굴 ë° ê²½ìž‘ì„ í†µí•´ ì–»ì„ ìˆ˜ 있습니다.{*B*} +효과부여대를 만들 때 ì“°ì´ëŠ” 모든 재료는 월드 ì•ˆì˜ ë§ˆì„ì—서 찾거나 월드 안ì—서 채굴 ë° ê²½ìž‘ì„ í†µí•´ ì–»ì„ ìˆ˜ 있습니다.{*B*}{*B*} 효과부여 ì±…ì€ ëª¨ë£¨ì—서 ì•„ì´í…œì— 효과를 부여하는 ë° ì‚¬ìš©í•©ë‹ˆë‹¤. ì´ê²ƒìœ¼ë¡œ ì•„ì´í…œì— ë” íš¨ìœ¨ì ìœ¼ë¡œ 효과를 부여할 수 있습니다.{*B*} @@ -281,9 +281,9 @@ Xbox 360 본체용 Minecraft는 멀티 í”Œë ˆì´ ê²Œìž„ì´ ê¸°ë³¸ê°’ìœ¼ë¡œ ë˜ {*CONTROLLER_ACTION_DPAD_LEFT*}를 누르면 왼쪽으로 ì´ë™í•˜ê³  {*CONTROLLER_ACTION_DPAD_RIGHT*}를 누르면 오른쪽으로 ì´ë™í•©ë‹ˆë‹¤. {*T3*}í”Œë ˆì´ ë°©ë²•: 호스트 ë° í”Œë ˆì´ì–´ 옵션{*ETW*}{*B*}{*B*} - + {*T1*}게임 옵션{*ETW*}{*B*} -월드를 불러오거나 새로 만들 때 "추가 옵션" 단추를 누르면 ê²Œìž„ì˜ ì„¸ë¶€ ì‚¬í•­ì„ ì¡°ì •í•  수 있는 메뉴가 열립니다.{*B*}{*B*} +월드를 불러오거나 새로 만들 때 "추가 옵션"ì„ ëˆ„ë¥´ë©´ ê²Œìž„ì˜ ì„¸ë¶€ ì‚¬í•­ì„ ì¡°ì •í•  수 있는 메뉴가 열립니다.{*B*}{*B*} {*T2*}플레ì´ì–´ 대 플레ì´ì–´{*ETW*}{*B*} ì´ ì˜µì…˜ì„ ì¼œë©´ 플레ì´ì–´ê°€ 다른 플레ì´ì–´ë¥¼ 공격할 수 있습니다. ìƒì¡´ 모드ì—ë§Œ ì ìš©ë©ë‹ˆë‹¤.{*B*}{*B*} @@ -300,6 +300,27 @@ Xbox 360 본체용 Minecraft는 멀티 í”Œë ˆì´ ê²Œìž„ì´ ê¸°ë³¸ê°’ìœ¼ë¡œ ë˜ {*T2*}호스트 특권{*ETW*}{*B*} ì´ ì˜µì…˜ì„ ì¼œë©´ 호스트는 게임 메뉴ì—서 플레ì´ì–´ì—게 비행 ëŠ¥ë ¥ì„ ì£¼ê±°ë‚˜, 지치지 않게 하거나, 투명하게 만들 수 있습니다.{*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + {*T2*}시간대 전환{*ETW*}{*B*} + 비활성화하면 시간대가 변하지 않습니다.{*B*}{*B*} + + {*T2*}소지품 유지{*ETW*}{*B*} + 활성화하면 플레ì´ì–´ê°€ ì£½ì–´ë„ ì†Œì§€í’ˆì˜ ì•„ì´í…œì„ 잃지 않습니다.{*B*}{*B*} + + {*T2*}괴물 ìƒì„±{*ETW*}{*B*} + 비활성화하면 괴물ì´ë‚˜ ë™ë¬¼ì´ ìžì—°ì ìœ¼ë¡œ ìƒì„±ë˜ì§€ 않습니다.{*B*}{*B*} + + {*T2*}ê´´ë¬¼ì— ì˜í•œ 괴롭힘{*ETW*}{*B*} + 비활성화하면 몬스터와 ë™ë¬¼ì´ 블ë¡ì„ êµì²´í•˜ê±°ë‚˜ ì•„ì´í…œì„ ì§‘ì§€ 못하게 합니다. 예를 들어 Creeperê°€ í­ë°œí•´ë„ 블ë¡ì´ 파괴ë˜ì§€ 않으며, ì–‘ì€ í’€ì„ ì œê±°í•˜ì§€ 못합니다.{*B*}{*B*} + + {*T2*}괴물 전리품{*ETW*}{*B*} + 비활성화하면 괴물과 ë™ë¬¼ì´ ì „ë¦¬í’ˆì„ ë–¨ì–´íŠ¸ë¦¬ì§€ 않습니다. 예를 들어 Creeperê°€ í™”ì•½ì„ ë–¨ì–´íŠ¸ë¦¬ì§€ 않습니다.{*B*}{*B*} + + {*T2*}íƒ€ì¼ ì•„ì´í…œ{*ETW*}{*B*} + 비활성화하면 블ë¡ì´ 파괴ë¼ë„ ì•„ì´í…œì„ 떨어트리지 않습니다. 예를 들어 ëŒ ë¸”ë¡ì—서 조약ëŒì„ ì–»ì„ ìˆ˜ 없습니다.{*B*}{*B*} + + {*T2*}ìžì—° 재ìƒ{*ETW*}{*B*} + 비활성화하면 플레ì´ì–´ì˜ ì²´ë ¥ì´ ìžì—°ì ìœ¼ë¡œ 재ìƒë˜ì§€ 않습니다.{*B*}{*B*} + {*T1*}월드 ìƒì„± 옵션{*ETW*}{*B*} 새 월드를 ìƒì„±í•  때 ì„ íƒí•  수 있는 추가 옵션입니다.{*B*}{*B*} @@ -316,13 +337,13 @@ Xbox 360 본체용 Minecraft는 멀티 í”Œë ˆì´ ê²Œìž„ì´ ê¸°ë³¸ê°’ìœ¼ë¡œ ë˜ ì´ ì˜µì…˜ì„ ì¼œë©´ 지하가 재건ë©ë‹ˆë‹¤. ì‚¬ì „ì— ì§€í•˜ 요새가 없는 ê³³ì— ë¯¸ë¦¬ 저장하면 유용합니다.{*B*}{*B*} {*T1*}게임 메뉴 옵션{*ETW*}{*B*} - 게임 í”Œë ˆì´ ì¤‘ì— {*BACK_BUTTON*} 단추를 눌러서 게임 메뉴로 ì´ë™í•œ ë‹¤ìŒ ì‚¬ìš©í•  수 있는 옵션입니다.{*B*}{*B*} + 게임 í”Œë ˆì´ ì¤‘ì— {*BACK_BUTTON*}ì„ ëˆŒëŸ¬ 게임 메뉴로 ì´ë™í•œ ë‹¤ìŒ ì‚¬ìš©í•  수 있는 옵션입니다.{*B*}{*B*} {*T2*}호스트 옵션{*ETW*}{*B*} 호스트 플레ì´ì–´ë‚˜ 관리ìžë¡œ ì„¤ì •ëœ í”Œë ˆì´ì–´ëŠ” "호스트 옵션" ë©”ë‰´ì— ë“¤ì–´ê°ˆ 수 있습니다. ì´ ë©”ë‰´ì—서 불 확산과 TNT í­ë°œì„ 켜거나 ëŒ ìˆ˜ 있습니다.{*B*}{*B*} {*T1*}플레ì´ì–´ 옵션{*ETW*}{*B*} -플레ì´ì–´ì˜ í–‰ë™ ê¶Œí•œì„ ë³€ê²½í•˜ë ¤ë©´ 플레ì´ì–´ ì´ë¦„ì„ ì„ íƒí•˜ê³  {*CONTROLLER_VK_A*} 단추를 눌러 플레ì´ì–´ 특권 메뉴ì—서 ë‹¤ìŒ ì˜µì…˜ì„ ì¡°ì •í•˜ì‹­ì‹œì˜¤.{*B*}{*B*} +플레ì´ì–´ì˜ í–‰ë™ ê¶Œí•œì„ ë³€ê²½í•˜ë ¤ë©´ 플레ì´ì–´ ì´ë¦„ì„ ì„ íƒí•˜ê³  {*CONTROLLER_VK_A*}를 눌러 플레ì´ì–´ 특권 메뉴ì—서 ë‹¤ìŒ ì˜µì…˜ì„ ì¡°ì •í•˜ì‹­ì‹œì˜¤.{*B*}{*B*} {*T2*}건설 ë° ì±„ê´‘ 가능{*ETW*}{*B*} ì´ ì˜µì…˜ì€ "플레ì´ì–´ 신뢰"를 ê»ì„ 때만 사용할 수 있습니다. ì´ ì˜µì…˜ì„ ì¼œë©´ 플레ì´ì–´ëŠ” 월드ì—서 ì¼ë°˜ì ì¸ í–‰ë™ì„ ëª¨ë‘ í•  수 있습니다. ì´ ì˜µì…˜ì„ ë„ë©´ 플레ì´ì–´ëŠ” 블ë¡ì„ 놓거나 파괴하지 못합니다.{*B*}{*B*} @@ -340,27 +361,29 @@ Xbox 360 본체용 Minecraft는 멀티 í”Œë ˆì´ ê²Œìž„ì´ ê¸°ë³¸ê°’ìœ¼ë¡œ ë˜ ì´ ì˜µì…˜ì€ "플레ì´ì–´ 신뢰"를 ê»ì„ 때만 사용할 수 있습니다. ì´ ì˜µì…˜ì„ ë„ë©´ 플레ì´ì–´ëŠ” ë™ë¬¼ì—게 피해를 줄 수 없습니다.{*B*}{*B*} {*T2*}관리ìž{*ETW*}{*B*} - ì´ ì˜µì…˜ì„ ì¼œë©´ 플레ì´ì–´ëŠ” 다른 플레ì´ì–´ì˜ íŠ¹ê¶Œì„ ë³€ê²½í•  수 있습니다(호스트 제외). “플레ì´ì–´ 신뢰â€ë¥¼ ë„ë©´ 플레ì´ì–´ë¥¼ 추방하거나 불 확산과 TNT í­ë°œì„ 켜거나 ëŒ ìˆ˜ 있습니다.{*B*}{*B*} + ì´ ì˜µì…˜ì„ ì¼œë©´ 플레ì´ì–´ëŠ” 다른 플레ì´ì–´ì˜ íŠ¹ê¶Œì„ ë³€ê²½í•  수 있습니다(호스트 제외). “플레ì´ì–´ 신뢰â€ë¥¼ ë„ë©´ 플레ì´ì–´ë¥¼ 추방하거나 불 확산과 TNT í­ë°œì„ 켜거나 ëŒ ìˆ˜ 있습니다.{*B*}{*B*} {*T2*}플레ì´ì–´ 추방{*ETW*}{*B*} 호스트 플레ì´ì–´ì™€ ê°™ì€ {*PLATFORM_NAME*} 본체로 플레ì´í•˜ëŠ” 플레ì´ì–´ë¥¼ 제외하고, ì´ ì˜µì…˜ì„ ì„ íƒí•˜ë©´ 다른 {*PLATFORM_NAME*} 본체로 ì ‘ì†í•˜ëŠ” 플레ì´ì–´ë¥¼ 추방할 수 있습니다. 추방당한 플레ì´ì–´ëŠ” ê²Œìž„ì´ ìƒˆë¡œ 시작ë˜ê¸° 전까지 다시 참가할 수 없습니다.{*B*}{*B*} - + {*T1*}호스트 플레ì´ì–´ 옵션{*ETW*}{*B*} "호스트 특권" ì˜µì…˜ì„ ì¼  ìƒíƒœì—서 호스트 플레ì´ì–´ëŠ” 플레ì´ì–´ íŠ¹ê¶Œì„ ë³€ê²½í•  수 있습니다. 플레ì´ì–´ íŠ¹ê¶Œì„ ë³€ê²½í•˜ë ¤ë©´ 플레ì´ì–´ ì´ë¦„ì„ ì„ íƒí•˜ê³  {*CONTROLLER_VK_A*}를 눌러 플레ì´ì–´ 특권 메뉴ì—서 ë‹¤ìŒ ì˜µì…˜ì„ ì¡°ì •í•˜ì‹­ì‹œì˜¤.{*B*}{*B*} {*T2*}비행 가능{*ETW*}{*B*} ì´ ì˜µì…˜ì„ ì¼œë©´ 플레ì´ì–´ëŠ” ë‚  수 있습니다. ì´ ì˜µì…˜ì€ ìƒì¡´ 모드ì—서만 ì ìš©ë©ë‹ˆë‹¤(창작 모드ì—서는 모든 플레ì´ì–´ê°€ 비행 가능).{*B*}{*B*} - + {*T2*}지치지 않ìŒ{*ETW*}{*B*} ì´ ì˜µì…˜ì€ ìƒì¡´ 모드ì—서만 ì ìš©ë©ë‹ˆë‹¤. ì´ ì˜µì…˜ì„ ì¼œë©´ 걷기/달리기/ì í”„ ë“±ì˜ í–‰ë™ì„ í•´ë„ ìŒì‹ 막대가 줄어들지 않습니다. 하지만 플레ì´ì–´ê°€ ìƒì²˜ë¥¼ 입으면 회복ë˜ëŠ” ë™ì•ˆ ìŒì‹ 막대가 서서히 줄어듭니다.{*B*}{*B*} - + {*T2*}투명화{*ETW*}{*B*} ì´ ì˜µì…˜ì„ ì¼œë©´ 플레ì´ì–´ëŠ” 다른 플레ì´ì–´ì˜ ëˆˆì— ë³´ì´ì§€ 않게 ë˜ë©° ë¬´ì  ìƒíƒœê°€ ë©ë‹ˆë‹¤.{*B*}{*B*} - - {*T2*}순간ì´ë™ 가능{*ETW*}{*B*} - 플레ì´ì–´ê°€ 플레ì´ì–´ ìžì‹  ë˜ëŠ” 다른 플레ì´ì–´ë¥¼ 월드 ë‚´ 다른 곳으로 ì´ë™ì‹œí‚¬ 수 있습니다. + + {*T2*}순간ì´ë™ 가능{*ETW*}{*B*} + 플레ì´ì–´ê°€ 플레ì´ì–´ ìžì‹  ë˜ëŠ” 다른 플레ì´ì–´ë¥¼ 월드 ë‚´ 다른 곳으로 ì´ë™ì‹œí‚¬ 수 있습니다. +호스트 플레ì´ì–´ì™€ ê°™ì€ {*PLATFORM_NAME*} 본체로 플레ì´í•˜ëŠ” 플레ì´ì–´ë¥¼ 제외하고, ì´ ì˜µì…˜ì„ ì„ íƒí•˜ë©´ 다른 {*PLATFORM_NAME*} 본체로 ì ‘ì†í•˜ëŠ” 플레ì´ì–´ë¥¼ 추방할 수 있습니다. 추방당한 플레ì´ì–´ëŠ” ê²Œìž„ì´ ìƒˆë¡œ 시작ë˜ê¸° 전까지 다시 참가할 수 없습니다. + ë‹¤ìŒ íŽ˜ì´ì§€ ì´ì „ 페ì´ì§€ @@ -426,61 +449,95 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E {*T3*}수정 ë° ì¶”ê°€{*ETW*}{*B*}{*B*} -- 새 ì•„ì´í…œ 추가 - ì—메랄드, ì—메랄드 ê´‘ì„, ì—메랄드 블ë¡, Ender ìƒìž, 트립와ì´ì–´ 후í¬, íš¨ê³¼ë¶€ì—¬ëœ í™©ê¸ˆ 사과, 모루, 화분, ì¡°ì•½ëŒ ë²½, ì´ë¼ ë‚€ ì¡°ì•½ëŒ ë²½, ë§ë¼ë¹„틀어진 그림, ê°ìž, 구운 ê°ìž, ë…성 ê°ìž, 당근, 황금 당근, 당근 막대, -호박 파ì´, 야간 시야 물약, 투명화 물약, 지하 ì„ì˜, 지하 ì„ì˜ ê´‘ì„, ì„ì˜ ë¸”ë¡, ì„ì˜ ë°œíŒ, ì„ì˜ ê³„ë‹¨, ê¹Žì•„ë†“ì€ ì„ì˜ ë¸”ë¡, ì„ì˜ ë¸”ë¡ ê¸°ë‘¥, 효과부여 ì±…, 카펫{*B*} -- 새 조합법 추가 - 부드러운 사암 ë° ê¹Žì•„ë†“ì€ ì‚¬ì•”{*B*} -- 새로운 괴물 추가 - 좀비 ë§ˆì„ ì‚¬ëžŒ{*B*} -- 새 지역 ìƒì„± 기능 - 사막 사ì›, 사막 마ì„, 정글 사ì›{*B*} -- ë§ˆì„ ì‚¬ëžŒê³¼ 거래 가능{*B*} -- 모루 ì¸í„°íŽ˜ì´ìФ 추가{*B*} -- 가죽 방어구 염색 가능{*B*} -- 늑대 목줄 염색 가능{*B*} -- 당근 막대기로 ë¼ì§€ ë°©í–¥ 조종 가능{*B*} -- ë” ë§Žì€ ì•„ì´í…œìœ¼ë¡œ 보너스 ìƒìž 내용물 ì—…ë°ì´íЏ{*B*} -- 반쪽 ë¸”ë¡ ë°°ì¹˜ ë° ë°˜ìª½ ë¸”ë¡ ìœ„ì˜ ë‹¤ë¥¸ ë¸”ë¡ ë°°ì¹˜ 변경{*B*} -- 뒤집힌 계단과 ë°œíŒ ë°°ì¹˜ 변경{*B*} -- ë§ˆì„ ì‚¬ëžŒ ì§ì—… 추가{*B*} -- ë‚³ì€ ì•Œì—서 나온 ë§ˆì„ ì‚¬ëžŒì—게 무작위 ì§ì—… 부여{*B*} -- 통나무 옆으로 놓기 가능{*B*} -- 나무 ë„구를 용광로ì—서 연료로 사용 가능{*B*} -- 채굴 정확성 효과부여 ë„구로 ì–¼ìŒ ë° ìœ ë¦¬ íŒìž 수집 가능{*B*} -- 화살로 나무 단추와 나무 ì••ë ¥íŒ ìž‘ë™ ê°€ëŠ¥{*B*} -- ì°¨ì›ë¬¸ì„ 통해 ì§€ìƒì— 지하 괴물 ìƒì„± 가능{*B*} -- Creeper와 거미는 마지막으로 ìžì‹ ì„ 공격한 플레ì´ì–´ë¥¼ 공격함{*B*} -- 창작 ëª¨ë“œì˜ ê´´ë¬¼ë“¤ì€ ìž ì‹œ ì‹œê°„ì´ ì§€ë‚œ 후 중립 ìƒíƒœê°€ ë¨{*B*} -- ë¬¼ì— ë¹ ì¡Œì„ ë•Œ 타격 ë°˜ë™ ì œê±°{*B*} -- 좀비가 부수는 ë¬¸ì— í”¼í•´ 표시{*B*} -- 지하ì—서 ì–¼ìŒì´ ë…¹ìŒ{*B*} -- 비가 오면 ê°€ë§ˆì†¥ì´ ì±„ì›Œì§{*B*} -- 피스톤 ì—…ë°ì´íЏ 시간 2배로 ì¦ê°€{*B*} -- ì•ˆìž¥ì„ ê°€ì§„ ë¼ì§€ë¥¼ 죽ì´ë©´ ì•ˆìž¥ì„ ë–¨ì–´íŠ¸ë¦¼{*B*} -- Enderì˜ í•˜ëŠ˜ 색 변경{*B*} -- 트립와ì´ì–´ìš©ìœ¼ë¡œ 실 설치 가능{*B*} -- 비가 ë‚˜ë­‡ìžŽì„ í†µê³¼í•´ 내림{*B*} -- ë¸”ë¡ ì•„ëž˜ìª½ì— ë ˆë²„ 설치 가능{*B*} -- 난ì´ë„ ì„¤ì •ì— ë”°ë¼ TNT 위력 변화{*B*} -- ì±… 조합법 변경{*B*} -- ì—°ìžŽì´ ë°°ë¥¼ 파괴하지 않고, ë°°ê°€ ì—°ìžŽì„ íŒŒê´´í•˜ë„ë¡ ë³€ê²½{*B*} -- ë¼ì§€ê°€ ë¼ì§€ê³ ê¸°ë¥¼ ë” ë§Žì´ ë–¨ì–´íŠ¸ë¦¼{*B*} -- 완전í‰ë©´ 월드ì—서 슬ë¼ìž„ì´ ë” ì ê²Œ ìƒì„±ë¨{*B*} -- Creeper로부터 받는 피해가 난ì´ë„ì— ë”°ë¼ ë‹¬ë¼ì§€ê³  타격 ë°˜ë™ì´ ê°•í•´ì§{*B*} -- ê³ ì •ëœ Endermanì´ í„±ì„ ë²Œë¦¬ì§€ 않ìŒ{*B*} -- 플레ì´ì–´ 순간ì´ë™ 추가(게임 ì¤‘ì— {*BACK_BUTTON*} 메뉴 사용){*B*} -- ì›ê²© 플레ì´ì–´ 비행, 투명화, ë¬´ì  ê´€ë ¨ 호스트 옵션 추가{*B*} -- 튜토리얼 ì›”ë“œì— ìƒˆ ì•„ì´í…œ ë° ê¸°ëŠ¥ì„ ìœ„í•œ 새 튜토리얼 추가{*B*} -- 튜토리얼 ì›”ë“œì˜ ìŒì•… ë””ìŠ¤í¬ ìƒìž 위치 ì—…ë°ì´íЏ{*B*} +- 새로운 ì•„ì´í…œ 추가 - 단단한 ì°°í™, ìƒ‰ìƒ ì°°í™, ì„탄 블ë¡, ê±´ì´ˆ ë”미, ìž‘ë™ê¸° ë ˆì¼, 레드스톤 블ë¡, ì¼ê´‘ 센서, 드로í¼, 호í¼, 호í¼ê°€ ë¶€ì°©ëœ ê´‘ë¬¼ 수레, TNTê°€ 실린 광물 수레, 레드스톤 ë¹„êµ íšŒë¡œ, ì••ë ¥íŒ, 신호기, 함정 ìƒìž, í­ì£½ 로켓, í­ì£½ 별, ì§€ì˜¥ì˜ ë³„, ëˆ, ë§ ë°©ì–´êµ¬, ì´ë¦„ 태그, ë§ ìƒì„± 알{*B*} +- 새로운 괴물 추가 - 위ë”, ë§ë¼ë¹„틀어진 해골, 마녀, ë°•ì¥, ë§, 당나귀 ë° ë…¸ìƒˆ{*B*} +- 새로운 지역 ìƒì„± 기능 추가 - 마녀 오ë‘막{*B*} +- 신호기 ì¸í„°íŽ˜ì´ìŠ¤ê°€ 추가ë©ë‹ˆë‹¤.{*B*} +- ë§ ì¸í„°íŽ˜ì´ìŠ¤ê°€ 추가ë©ë‹ˆë‹¤.{*B*} +- í˜¸í¼ ì¸í„°íŽ˜ì´ìŠ¤ê°€ 추가ë©ë‹ˆë‹¤.{*B*} +- í­ì£½ 추가 - í­ì£½ 별ì´ë‚˜ í­ì£½ 로켓 재료를 가지고 있으면 작업대ì—서 í­ì£½ ì¸í„°íŽ˜ì´ìŠ¤ê°€ 활성화ë©ë‹ˆë‹¤.{*B*} +- '모험 모드' 추가 - 올바른 ë„구로만 블ë¡ì„ ê¹° 수 있습니다.{*B*} +- 새로운 사운드가 다수 추가ë©ë‹ˆë‹¤.{*B*} +- ì´ì œ 괴물 ë° ë™ë¬¼, ì•„ì´í…œ, 발사체가 ì°¨ì›ë¬¸ì„ 통과할 수 있습니다.{*B*} +- ì´ì œ íƒì§€ê¸° ì˜†ì— ë‹¤ë¥¸ íƒì§€ê¸°ë¡œ ë™ë ¥ì„ 공급해 잠글 수 있습니다.{*B*} +- 좀비와 í•´ê³¨ì´ ë‹¤ë¥¸ 무기와 방어구를 가지고 ìƒì„±ë  수 있습니다.{*B*} +- 새로운 ì‚¬ë§ ë©”ì‹œì§€ê°€ 추가ë©ë‹ˆë‹¤.{*B*} +- ì´ë¦„ 태그로 괴물 ë° ë™ë¬¼ì— ì´ë¦„ì„ ë¶™ì¼ ìˆ˜ 있으며, 보관함 ì´ë¦„ì„ ë³€ê²½í•˜ì—¬ 메뉴를 ì—´ì—ˆì„ ë•Œ 표시ë˜ëŠ” ì œëª©ì„ ë°”ê¿€ 수 있습니다.{*B*} +- 뼛가루는 ë” ì´ìƒ 모든 ê²ƒì„ ìµœëŒ€ í¬ê¸°ë¡œ 즉시 성장시키지 않으며, 무작위로 여러 ë‹¨ê³„ì— ê±¸ì³ ì„±ìž¥ì‹œí‚µë‹ˆë‹¤.{*B*} +- 레드스톤 ë¹„êµ íšŒë¡œë¥¼ ì§ì ‘ 부착해서 ìƒìž, 양조대, 디스펜서, 주í¬ë°•스 ë‚´ìš©ë¬¼ì„ ì•Œë ¤ì£¼ëŠ” 레드스톤 신호를 ê°ì§€í•  수 있습니다.{*B*} +- 디스펜서를 아무 방향으로나 향하게 í•  수 있습니다.{*B*} +- 황금 사과를 먹으면 플레ì´ì–´ê°€ 잠시 ë™ì•ˆ 추가로 'í¡ìˆ˜' ì²´ë ¥ì„ ì–»ìŠµë‹ˆë‹¤.{*B*} +- ì§€ì—­ì— ì˜¤ëž˜ ë¨¸ë¬¼ìˆ˜ë¡ ì§€ì—­ì—서 ìƒì„±ë˜ëŠ” ê´´ë¬¼ì´ ê°•í•´ì§‘ë‹ˆë‹¤.{*B*} {*ETB*}ëŒì•„오신 ê²ƒì„ í™˜ì˜í•©ë‹ˆë‹¤! ì•„ì§ ëˆˆì¹˜ì±„ì§€ 못했ì„ì§€ë„ ëª¨ë¥´ì§€ë§Œ, Minecraftê°€ ì—…ë°ì´íЏë˜ì—ˆìŠµë‹ˆë‹¤.{*B*}{*B*} -새로운 ê¸°ëŠ¥ì´ ë§Žì´ ì¶”ê°€ë습니다. ì¶”ê°€ëœ ì£¼ìš” 기능 ì¼ë¶€ë¥¼ 소개해 드리니 ì½ì–´ë³´ê³  ì‹  나는 ê²Œìž„ì˜ ì„¸ê³„ë¡œ ì—¬í–‰ì„ ë– ë‚˜ì‹­ì‹œì˜¤!{*B*}{*B*} -{*T1*}새로운 ì•„ì´í…œ{*ETB*} - ì—메랄드, ì—메랄드 ê´‘ì„, ì—메랄드 블ë¡, Ender ìƒìž, 트립와ì´ì–´ 후í¬, íš¨ê³¼ë¶€ì—¬ëœ í™©ê¸ˆ 사과, 모루, 화분, ì¡°ì•½ëŒ ë²½, ì´ë¼ ë‚€ ì¡°ì•½ëŒ ë²½, ë§ë¼ë¹„틀어진 그림, ê°ìž, 구운 ê°ìž, ë…성 ê°ìž, 당근, 황금 당근, 당근 막대, -호박 파ì´, 야간 시야 물약, 투명화 물약, 지하 ì„ì˜, 지하 ì„ì˜ ê´‘ì„, ì„ì˜ ë¸”ë¡, ì„ì˜ ë°œíŒ, ì„ì˜ ê³„ë‹¨, ê¹Žì•„ë†“ì€ ì„ì˜ ë¸”ë¡, ì„ì˜ ë¸”ë¡ ê¸°ë‘¥, 효과부여 ì±…, 카펫{*B*}{*B*} -{*T1*}새로운 괴물 추가{*ETB*} - 좀비 ë§ˆì„ ì‚¬ëžŒ{*B*}{*B*} -{*T1*}새 기능{*ETB*} - ë§ˆì„ ì‚¬ëžŒê³¼ 거래, 모루ì—서 무기 ë° ë„구를 수리하거나 효과 부여, Ender ìƒìžì— ì•„ì´í…œ 저장, ë¼ì§€ë¥¼ íƒ”ì„ ë•Œ 당근 스틱으로 ë°©í–¥ ì¡°ì • 가능!{*B*}{*B*} -{*T1*}새로운 미니 튜토리얼{*ETB*} – 튜토리얼 월드ì—서 새로운 ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ëŠ” ë°©ë²•ì„ ì•Œì•„ë³´ì„¸ìš”!{*B*}{*B*} -{*T1*}새로운 '부활절 알'{*ETB*} – 튜토리얼 월드ì—서 비밀 ìŒì•… 디스í¬ì˜ 위치를 ëª¨ë‘ ì˜®ê²¼ìŠµë‹ˆë‹¤. 다시 한번 찾아보세요!{*B*}{*B*} +새로운 ê¸°ëŠ¥ì´ ë§Žì´ ì¶”ê°€ë습니다. ì¶”ê°€ëœ ì£¼ìš” 기능 ì¼ë¶€ë¥¼ 소개해 드리니 ì½ì–´ë³´ê³  ì‹  나는 ê²Œìž„ì˜ ì„¸ê³„ë¡œ ì—¬í–‰ì„ ë– ë‚˜ì‹­ì‹œì˜¤!{*B*}{*B*} +{*T1*}New Items{*ETB*} - 단단한 ì°°í™, ìƒ‰ìƒ ì°°í™, ì„탄 블ë¡, ê±´ì´ˆ ë”미, ìž‘ë™ê¸° ë ˆì¼, 레드스톤 블ë¡, ì¼ê´‘ 센서, 드로í¼, 호í¼, 호í¼ê°€ ë¶€ì°©ëœ ê´‘ë¬¼ 수레, TNTê°€ 실린 광물 수레, 레드스톤 ë¹„êµ íšŒë¡œ, ì••ë ¥íŒ, 신호기, 함정 ìƒìž, í­ì£½ 로켓, í­ì£½ 별, ì§€ì˜¥ì˜ ë³„, ëˆ, ë§ ë°©ì–´êµ¬, ì´ë¦„ 태그, ë§ ìƒì„± 알{*B*}{*B*} +{*T1*} 새로운 괴물 ë° ë™ë¬¼ {*ETB*} - 위ë”, ë§ë¼ë¹„틀어진 해골, 마녀, ë°•ì¥, ë§, 당나귀 ë° ë…¸ìƒˆ{*B*}{*B*} +{*T1*} 새로운 기능 {*ETB*} - ë§ ê¸¸ë“¤ì´ê¸° ë° íƒ€ê¸°, í­ì£½ 만들어 터뜨리기, ì´ë¦„ 태그로 ë™ë¬¼ ë° ê´´ë¬¼ì— ì´ë¦„ ë¶™ì´ê¸°, 보다 ê³ ì„±ëŠ¥ì˜ ë ˆë“œìŠ¤í†¤ 회로 만들기, ì†ë‹˜ì´ ìžì‹ ì˜ 월드ì—서 í•  수 있는 í–‰ë™ì„ 제어하는 새로운 호스트 옵션 {*B*}{*B*} +{*T1*} 새로운 튜토리얼 월드 {*ETB*} – 기존 ë° ìƒˆ ê¸°ëŠ¥ì˜ ì‚¬ìš©ë²•ì„ íŠœí† ë¦¬ì–¼ 월드ì—서 배우십시오. ë˜í•œ ì›”ë“œì— ìˆ¨ê²¨ì§„ 모든 비밀 ìŒë°˜ 찾기ì—ë„ ë„ì „í•´ 보십시오!{*B*}{*B*} +ë§ + +{*T3*}í”Œë ˆì´ ë°©ë²•: ë§{*ETW*}{*B*}{*B*} +ë§ê³¼ 당나귀는 주로 íƒ íŠ¸ì¸ í‰ì›ì—서 ì°¾ì„ ìˆ˜ 있습니다. 노새는 당나귀와 ë§ì˜ 새ë¼ì´ì§€ë§Œ ë²ˆì‹ ëŠ¥ë ¥ì´ ì—†ìŠµë‹ˆë‹¤.{*B*} +다 ìžëž€ ë§ê³¼ 당나귀, 노새는 타고 ë‹¤ë‹ ìˆ˜ 있습니다. 하지만 방어구는 ë§ì—게만 ìž…íž ìˆ˜ 있으며, ì•„ì´í…œ ìš´ë°˜ì— í•„ìš”í•œ 안장 ê°€ë°©ì€ ë‹¹ë‚˜ê·€ì™€ 노새ì—게만 착용시킬 수 있습니다.{*B*}{*B*} +ë§ê³¼ 당나귀, 노새는 ê¸¸ì„ ë“¤ì—¬ì•¼ 사용할 수 있습니다. ë§ì€ 타려고 시ë„í•¨ìœ¼ë¡œì¨ ê¸¸ì„ ë“¤ì¼ ìˆ˜ 있지만, ì´ ê³¼ì •ì—서 ë§ì€ 기수를 떨어트리려고 í•  것ì´ë¯€ë¡œ ë§ë“±ì— 잘 타고 있어야 합니다.{*B*} +ê¸¸ì´ ë“¤ë©´ ì£¼ë³€ì— í•˜íŠ¸ 표시가 나타나며, ë” ì´ìƒ 기수를 떨어트리려고 하지 않습니다. ë§ì˜ ë°©í–¥ì„ ì¡°ì •í•˜ë ¤ë©´ ì•ˆìž¥ì„ ì°©ìš©ì‹œì¼œì•¼ 합니다.{*B*}{*B*} +ì•ˆìž¥ì€ ë§ˆì„ ì£¼ë¯¼ìœ¼ë¡œë¶€í„° 구매하거나 ê³³ê³³ì— ìˆ¨ê²¨ì§„ ìƒìžì— 들어 있습니다.{*B*} +ê¸¸ì´ ë“  당나귀와 ë…¸ìƒˆì— ìƒìžë¥¼ 부착하면 안장 ê°€ë°©ì„ ë‹¬ì•„ì¤„ 수 있습니다. ì´ ê°€ë°©ì€ ë‹¹ë‚˜ê·€ ë˜ëŠ” 노새를 타거나 수그린 ìƒíƒœì—서 사용 가능합니다.{*B*}{*B*} +ë§ê³¼ 당나귀(노새 제외)는 황금 사과나 황금 ë‹¹ê·¼ì„ ì‚¬ìš©í•´ 다른 ë™ë¬¼ë“¤ì²˜ëŸ¼ êµë°°í•  수 있습니다.{*B*} +ë§ì•„지는 ì‹œê°„ì´ ì§€ë‚˜ë©´ 성장하여 ë§ì´ ë˜ë©°, ë°€ì´ë‚˜ 건초를 먹ì´ë©´ 성장 ì‹œê°„ì´ ë‹¨ì¶•ë©ë‹ˆë‹¤.{*B*} + + +신호기 + +{*T3*}í”Œë ˆì´ ë°©ë²•: 신호기{*ETW*}{*B*}{*B*} +ìž‘ë™í•˜ëŠ” 신호기는 하늘로 ë°ì€ ê´‘ì„ ì„ ì˜ì•„ 올리고 주변 플레ì´ì–´ì—게 ëŠ¥ë ¥ì„ ë¶€ì—¬í•©ë‹ˆë‹¤.{*B*} +신호기는 위ë”를 잡고 ì–»ì„ ìˆ˜ 있는 유리와 í‘ìš”ì„, ì§€ì˜¥ì˜ ë³„ë¡œ 만듭니다.{*B*}{*B*} +신호기는 ë‚®ì— í–‡ë¹›ì„ ë°›ì„ ìˆ˜ ìž¥ì†Œì— ë†“ì•„ì•¼ 하며, 반드시 ì² , 황금, ì—메랄드 ë° ë‹¤ì´ì•„몬드 ë“±ì˜ í”¼ë¼ë¯¸ë“œ ìœ„ì— ì„¤ì¹˜í•´ì•¼ 합니다.{*B*} +하지만 ì–´ë–¤ 재료를 ì„ íƒí•´ë„ ì‹ í˜¸ê¸°ì˜ ëŠ¥ë ¥ì—는 ì˜í–¥ì„ 주지 않습니다.{*B*}{*B*} +신호기 메뉴ì—서 ì‹ í˜¸ê¸°ì˜ ì£¼ 능력 1개를 ì„ íƒí•  수 있습니다. 피ë¼ë¯¸ë“œì˜ 층수가 ë§Žì„ìˆ˜ë¡ ëŠ¥ë ¥ ì„ íƒì˜ í­ì´ ë” ë„“ì–´ì§‘ë‹ˆë‹¤.{*B*} +4층 ì´ìƒ ë˜ëŠ” 피ë¼ë¯¸ë“œ ìœ„ì˜ ì‹ í˜¸ê¸°ëŠ” ë³´ì¡° ëŠ¥ë ¥ì¸ '재ìƒ'ì´ë‚˜ 주 능력 ê°•í™” 중 한 가지를 추가로 ì„ íƒí•  수 있습니다.{*B*}{*B*} +ì‹ í˜¸ê¸°ì˜ ëŠ¥ë ¥ì„ ì„¤ì •í•˜ë ¤ë©´ 지불 ìŠ¬ë¡¯ì— ì—메랄드, 다ì´ì•„몬드, 황금 ë˜ëŠ” ì²  주괴를 넣어야 합니다.{*B*} +재료를 넣으면 신호기ì—서 ëŠ¥ë ¥ì´ ë¬´ê¸°í•œìœ¼ë¡œ ë°œë™ë©ë‹ˆë‹¤.{*B*} + + +í­ì£½ + +{*T3*}í”Œë ˆì´ ë°©ë²•: í­ì£½{*ETW*}{*B*}{*B*} +í­ì£½ì€ ì†ì´ë‚˜ 디스펜서로 발사할 수 있는 ìž¥ì‹ ì•„ì´í…œì´ë©°, 기본 ìž¬ë£Œì¸ ì¢…ì´ì™€ í™”ì•½ì— í­ì£½ ë³„ì„ ë¶€ê°€ì ìœ¼ë¡œ ë”í•´ 만들 수 있습니다.{*B*} +í­ì£½ ë³„ì„ ë§Œë“¤ 때 추가 재료를 넣으면 색ìƒê³¼ 사ë¼ì§€ëŠ” 형태, 모양, í¬ê¸°, 효과(궤ì ì´ë‚˜ ë°˜ì§ìž„ 등)를 ì›í•˜ëŠ” 대로 바꿀 수 있습니다.{*B*}{*B*} +í­ì£½ì„ 만들려면 소지품 위 3x3 ì œìž‘ì¹¸ì— í™”ì•½ê³¼ 종ì´ë¥¼ 넣으십시오.{*B*} +ì œìž‘ì¹¸ì— í­ì£½ 별 여러 개를 추가로 넣어 í­ì£½ì— ì¡°í•©í•  수 있습니다.{*B*} +제작칸 ìŠ¬ë¡¯ì— í™”ì•½ì„ ë” ë§Žì´ ì±„ìš°ë©´ í­ì£½ ë³„ì´ í­ë°œí•˜ëŠ” 높ì´ê°€ ì¦ê°€í•©ë‹ˆë‹¤.{*B*}{*B*} +그런 ë‹¤ìŒ ê²°ê³¼ë¬¼ 슬롯 밖으로 ì™„ì„±ëœ í­ì£½ì„ 꺼낼 수 있습니다.{*B*}{*B*} +í­ì£½ ë³„ì€ í™”ì•½ê³¼ 염료를 ì œìž‘ì¹¸ì— ë„£ì–´ 만들 수 있습니다.{*B*} + – 염료는 í­ì£½ ë³„ì´ í­ë°œí•  ë•Œì˜ ìƒ‰ìƒì„ 결정합니다.{*B*} + – í­ì£½ ë³„ì˜ ëª¨ì–‘ì€ ë¶ˆì˜ì‹œê°œ, 금ë©ì´, 깃털, 괴물 머리를 추가해 바꿀 수 있습니다.{*B*} + – 다ì´ì•„몬드나 ë°œê´‘ì„ ê°€ë£¨ë¥¼ 사용하면 궤ì ì´ë‚˜ ë°˜ì§ìž„ 효과가 추가ë©ë‹ˆë‹¤.{*B*}{*B*} +í­ì£½ ë³„ì„ ë§Œë“  후ì—는 염료와 함께 ì¡°í•©í•´, í­ë°œ 후 사ë¼ì§ˆ ë•Œì˜ ìƒ‰ìƒì„ 조절할 수 있습니다. + + +í˜¸í¼ + +{*T3*}í”Œë ˆì´ ë°©ë²•: 호í¼{*ETW*}{*B*}{*B*} +호í¼ëŠ” ë³´ê´€í•¨ì— ì•„ì´í…œì„ 넣거나 빼고, 보관함 ì•ˆì— ë“¤ì–´ê°„ ì•„ì´í…œì„ ìžë™ìœ¼ë¡œ 집습니다.{*B*} +호í¼ëŠ” 양조대, ìƒìž, 디스펜서, 드로í¼, ìƒìžê°€ ë“  광물 수레, 호í¼ê°€ ë¶€ì°©ëœ ê´‘ë¬¼ 수레, 다른 호í¼ì— ì˜í–¥ì„ 줄 수 있습니다.{*B*}{*B*} +호í¼ëŠ” ê·¸ ìœ„ì— ì„¤ì¹˜ëœ ì ì ˆí•œ 보관함으로부터 ê³„ì† ì•„ì´í…œì„ 빨아들ì´ë ¤ê³  시ë„합니다. ë˜í•œ ë³´ê´€ëœ ì•„ì´í…œì„ 배출구 쪽 ë³´ê´€í•¨ì— ë„£ìœ¼ë ¤ê³  합니다.{*B*} +호í¼ì— ë ˆë“œìŠ¤í†¤ì˜ ë™ë ¥ì´ 공급ë˜ë©´ ìž‘ë™ì„ 멈추고 ì•„ì´í…œ 빨아들ì´ê¸°ì™€ 넣기를 중지합니다.{*B*}{*B*} +호í¼ëŠ” ì•„ì´í…œì„ 내보내려는 ë°©í–¥ì„ ê°€ë¦¬í‚µë‹ˆë‹¤. 호í¼ê°€ 특정 블ë¡ì„ 가리키게 하려면 호í¼ë¥¼ 해당 블ë¡ê³¼ 대치ë˜ëŠ” ë°©í–¥ì— ì„¤ì¹˜í•˜ì‹­ì‹œì˜¤.{*B*} + + + +ë“œë¡œí¼ + +{*T3*}í”Œë ˆì´ ë°©ë²•: 드로í¼{*ETW*}{*B*}{*B*} +드로í¼ì— ë ˆë“œìŠ¤í†¤ì˜ ë™ë ¥ì´ 주입ë˜ë©´ ê·¸ ì•ˆì— ë“  ì•„ì´í…œ 하나를 무작위로 ë•…ì— ë–¨ì–´íŠ¸ë¦½ë‹ˆë‹¤. {*CONTROLLER_ACTION_USE*}ì„(를) 눌러 드로í¼ë¥¼ ì—´ë©´ ì†Œì§€í’ˆì˜ ì•„ì´í…œì„ 드로í¼ì— ë„£ì„ ìˆ˜ 있습니다.{*B*} +드로í¼ê°€ ìƒìžë‚˜ 다른 ì¢…ë¥˜ì˜ ë³´ê´€í•¨ì„ í–¥í•´ 놓였다면 ì•„ì´í…œì€ ë•…ì´ ì•„ë‹ˆë¼ í•´ë‹¹ ìƒìž ì•ˆì— ë“¤ì–´ê°‘ë‹ˆë‹¤. ë“œë¡œí¼ ì—¬ëŸ¬ 개를 길게 연결하면 먼 거리로 ì•„ì´í…œì„ 보낼 수 있으며, ì´ ê¸°ëŠ¥ì„ ìž‘ë™ì‹œí‚¤ë ¤ë©´ ê° ë“œë¡œí¼ì— 별ë„로 ë™ë ¥ì„ 공급하거나 차단해야 합니다. + + ë§¨ì† ê³µê²©ë³´ë‹¤ ìœ„ë ¥ì´ ê°•í•©ë‹ˆë‹¤. ì†ì„ 사용하는 것보다 í™, 잡초, 모래, ìžê°ˆ, ëˆˆì„ ë” ë¹¨ë¦¬ 파냅니다. 눈ë©ì´ë¥¼ 파내려면 ì‚½ì´ í•„ìš”í•©ë‹ˆë‹¤. @@ -606,10 +663,36 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E ì§€ë„를 들고 ìžˆì„ ë™ì•ˆ íƒí—˜í•œ ì§€ì—­ì˜ ì´ë¯¸ì§€ë¥¼ 만들어냅니다. ê¸¸ì„ ì°¾ëŠ” ë° ì‚¬ìš©í•  수 있습니다. +사용하면 현재 ì†í•œ ì›”ë“œì˜ ì§€ë„ ì¼ë¶€ê°€ ë˜ë©°, ì§€ì—­ì„ íƒí—˜í•˜ë©´ 나머지 ë¶€ë¶„ì´ ì±„ì›Œì§‘ë‹ˆë‹¤. + 화살과 함께 사용하여 ì›ê±°ë¦¬ ê³µê²©ì„ í•©ë‹ˆë‹¤. í™œì— ìž¥ì „í•˜ì—¬ 사용합니다. +위ë”ì—게서 ì–»ì„ ìˆ˜ 있으며 ì‹ í˜¸ê¸°ì˜ ìž¬ë£Œë¡œ 사용합니다. + +ìž‘ë™í•˜ë©´ 화려한 ìƒ‰ì˜ í­ë°œì„ ì¼ìœ¼í‚µë‹ˆë‹¤. 색ìƒê³¼ 효과, 모양과 사ë¼ì§€ëŠ” íŒ¨í„´ì€ í­ì£½ì„ 만들 때 사용한 í­ì£½ ë³„ì— ë”°ë¼ ê²°ì •ë©ë‹ˆë‹¤. + +í­ì£½ì˜ 색ìƒ, 효과, ëª¨ì–‘ì„ ê²°ì •í•˜ëŠ” 재료입니다. + +레드스톤 íšŒë¡œì— ì‚¬ìš©í•˜ì—¬ 신호 ê°•ë„를 유지, 비êµ, 낮추거나 특정 ë¸”ë¡ ìƒíƒœë¥¼ 측정합니다. + +움ì§ì´ëŠ” TNT 블ë¡ì²˜ëŸ¼ ìž‘ë™í•˜ëŠ” 광물 ìˆ˜ë ˆì˜ í•œ 종류입니다. + +í–‡ë¹›ì´ ìžˆê±°ë‚˜ ì—†ìŒì— ë”°ë¼ ë ˆë“œìŠ¤í†¤ 신호를 발산하는 블ë¡ìž…니다. + +호í¼ì™€ 비슷하게 ìž‘ë™í•˜ëŠ” 특별한 광물 수레입니다. íŠ¸ëž™ì— ìžˆëŠ” ì•„ì´í…œì„ 주워 담거나 수레 ìœ„ì— ìžˆëŠ” 보관함ì—서 ì•„ì´í…œì„ 빼냅니다. + +ë§ì— ìž…íž ìˆ˜ 있는 특별한 방어구입니다. ë°©ì–´ë ¥ì´ 5 ì¦ê°€í•©ë‹ˆë‹¤. + +ë§ì— ìž…íž ìˆ˜ 있는 특별한 방어구입니다. ë°©ì–´ë ¥ì´ 7 ì¦ê°€í•©ë‹ˆë‹¤. + +ë§ì— ìž…íž ìˆ˜ 있는 특별한 방어구입니다. ë°©ì–´ë ¥ì´ 11 ì¦ê°€í•©ë‹ˆë‹¤. + +괴물 ë° ë™ë¬¼ì„ 플레ì´ì–´ë‚˜ ìš¸íƒ€ë¦¬ì— ë§¤ì–´ë‘¡ë‹ˆë‹¤. + +괴물 ë° ë™ë¬¼ ì´ë¦„ ì§“ê¸°ì— ì‚¬ìš©ë©ë‹ˆë‹¤. + {*ICON_SHANK_01*}를 2.5ë§Œí¼ íšŒë³µí•©ë‹ˆë‹¤. {*ICON_SHANK_01*}를 1ë§Œí¼ íšŒë³µí•©ë‹ˆë‹¤. 효과가 6번까지 중복ë©ë‹ˆë‹¤. @@ -934,100 +1017,158 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E 괴물 머리는 장ì‹ìš©ìœ¼ë¡œ 놓아둘 ìˆ˜ë„ ìžˆê³ , 투구 ìŠ¬ë¡¯ì— ë†“ì•„ 마스í¬ë¡œ 쓸 ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. +ëª…ë ¹ì„ ì‹¤í–‰í•˜ëŠ” ë° ì‚¬ìš©í•©ë‹ˆë‹¤. + +하늘로 ê´‘ì„ ì„ ë°œì‚¬í•˜ê³  주변 플레ì´ì–´ì—게 ìƒíƒœ 효과를 부여합니다. + +ì•ˆì— ë¸”ë¡ê³¼ ì•„ì´í…œì„ 보관합니다. ìƒìž 2개를 나란히 ë¶™ì´ë©´ ìš©ëŸ‰ì´ 2ë°°ì¸ í° ìƒìžê°€ 만들어집니다. 함정 ìƒìžëŠ” ì—´ì—ˆì„ ë•Œ 레드스톤 ì „ê¸°ë„ ë°œìƒì‹œí‚µë‹ˆë‹¤. + +레드스톤 전기를 ë°œìƒì‹œí‚µë‹ˆë‹¤. ì•„ì´í…œì´ ë§Žì´ ì˜¬ë ¤ì ¸ 있으면 전기가 강해집니다. + +레드스톤 전기를 ë°œìƒì‹œí‚µë‹ˆë‹¤. ì•„ì´í…œì´ ë§Žì´ ì˜¬ë ¤ì ¸ 있으면 전기가 강해집니다. 가벼운 ë°œíŒë³´ë‹¤ 무거운 무게를 필요로 합니다. + +ë ˆë“œìŠ¤í†¤ì˜ ë™ë ¥ì›ìœ¼ë¡œ 사용ë©ë‹ˆë‹¤. 다시 레드스톤으로 변환할 수 있습니다. + +ì•„ì´í…œì„ 잡거나 보관함 안으로 ë˜ëŠ” 밖으로 ì•„ì´í…œì„ 옮기는 ë° ì‚¬ìš©í•©ë‹ˆë‹¤. + +호í¼ê°€ ë¶€ì°©ëœ ê´‘ë¬¼ 수레를 사용 가능 ë˜ëŠ” 불가능하게 하고 TNTê°€ 실린 광물 수레를 ìž‘ë™ì‹œí‚¬ 수 있는 ë ˆì¼ìž…니다. + +레드스톤 전기를 í˜ë¦¬ë©´ ì•„ì´í…œì„ 잡고 있거나, 떨어트리거나, 다른 보관함으로 ì•„ì´í…œì„ 밀어보냅니다. + +단단한 ì°°í™ìœ¼ë¡œ 만든 ìƒ‰ì´ í™”ë ¤í•œ 블ë¡ìž…니다. + +ë§, 당나귀, 노새ì—게 먹여 ì²´ë ¥ì„ 10 회복시킵니다. ë§ì•„지가 ë” ë¹¨ë¦¬ 성장하게 합니다. + +화로ì—서 ì°°í™ì„ 제련해서 만듭니다. + +유리와 염료로 만듭니다. + +스테ì¸ë“œê¸€ë¼ìŠ¤ë¡œë¶€í„° 만듭니다. + +ì„íƒ„ì„ ë³´ê´€í•  수 있는 편리한 방법입니다. 화로ì—서 연료로 사용할 수 있습니다. + 오징어 - + 잡으면 먹물 주머니를 ì–»ì„ ìˆ˜ 있습니다. - + 소 - + 잡으면 ê°€ì£½ì„ ì–»ì„ ìˆ˜ 있습니다. ë˜í•œ 우유를 짜서 ì–‘ë™ì´ì— ë‹´ì„ ìˆ˜ 있습니다. - + ì–‘ - + 가위를 사용하면 ì–‘í„¸ì„ ì–»ì„ ìˆ˜ 있습니다. ì´ë¯¸ í„¸ì„ ê¹Žì•˜ë‹¤ë©´ ì–‘í„¸ì´ ë‚˜ì˜¤ì§€ 않습니다. í„¸ì„ ì—¼ìƒ‰í•˜ì—¬ ìƒ‰ì„ ë°”ê¿€ 수 있습니다. - + ë‹­ - + 잡으면 ê¹ƒí„¸ì´ ë‚˜ì˜µë‹ˆë‹¤. ê°€ë” ì•Œì„ ë‚³ìŠµë‹ˆë‹¤. - + ë¼ì§€ - + 잡으면 ë¼ì§€ê³ ê¸°ë¥¼ ì–»ì„ ìˆ˜ 있습니다. ì•ˆìž¥ì„ ì‚¬ìš©í•˜ë©´ 타고 ë‹¤ë‹ ìˆ˜ 있습니다. - + 늑대 - + 공격받기 전까지는 위협ì ì´ì§€ 않으며, 공격하면 뒤를 습격합니다. 뼈를 ì´ìš©í•´ì„œ 길들ì´ë©´ ë°ë¦¬ê³  ë‹¤ë‹ ìˆ˜ 있으며, 플레ì´ì–´ë¥¼ 공격하는 대ìƒì„ 공격합니다. - + Creeper - + ê°€ê¹Œì´ ë‹¤ê°€ê°€ë©´ í­ë°œí•©ë‹ˆë‹¤! - + 해골 - + 플레ì´ì–´ì—게 í™”ì‚´ì„ ì©ë‹ˆë‹¤. 처치하면 í™”ì‚´ì„ ë–¨ì–´ëœ¨ë¦½ë‹ˆë‹¤. - + 거미 - + ê°€ê¹Œì´ ë‹¤ê°€ê°€ë©´ 공격합니다. ë²½ì„ íƒ€ê³  오를 수 있으며, 처치하면 ì‹¤ì„ ë–¨ì–´ëœ¨ë¦½ë‹ˆë‹¤. - + 좀비 - + ê°€ê¹Œì´ ë‹¤ê°€ê°€ë©´ 공격합니다. - + Pigman 좀비 - + 먼저 공격하지 않지만, ê³µê²©ì„ ë°›ìœ¼ë©´ 무리를 지어 달려듭니다. - + Ghast - + 닿으면 í­ë°œí•˜ëŠ” 불ë©ì–´ë¦¬ë¥¼ ë˜ì§‘니다. - + 슬ë¼ìž„ - + 피해를 입으면 ìž‘ì€ ìŠ¬ë¼ìž„으로 분리ë©ë‹ˆë‹¤. - + Enderman - + 플레ì´ì–´ê°€ ë°”ë¼ë³´ë©´ 공격합니다. 블ë¡ì„ 들어 옮길 ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. - + Sliverfish - + 공격하면 ê·¼ì²˜ì˜ Sliverfish를 ëŒì–´ë“¤ìž…니다. ëŒ ë¸”ë¡ì— 숨어 있습니다. - + ë™êµ´ 거미 - + ë…ì´ ìžˆìŠµë‹ˆë‹¤. - + Mooshroom - + 그릇과 함께 사용하면 ë²„ì„¯ì£½ì„ ë§Œë“¤ 수 있습니다. 가위를 사용하면 ë²„ì„¯ì„ ë–¨ì–´ëœ¨ë¦¬ê³  보통 소가 ë©ë‹ˆë‹¤. - + 눈 골렘 - + 플레ì´ì–´ëŠ” 눈 블ë¡ê³¼ í˜¸ë°•ì„ ì‚¬ìš©í•´ 눈 ê³¨ë ˜ì„ ë§Œë“¤ 수 있습니다. 눈 ê³¨ë ˜ì€ í”Œë ˆì´ì–´ì˜ ì ì—게 눈ë©ì´ë¥¼ ë˜ì§‘니다. - + Ender 드래곤 - + Enderì—서 찾아볼 수 있는 거대한 ê²€ì€ìƒ‰ 드래곤입니다. - + Blaze - + 주로 지하 요새ì—서 찾아볼 수 있는 ì ìž…니다. 죽으면 Blaze 막대를 떨어뜨립니다. - + 마그마 í브 - + 지하ì—서 찾아볼 수 있습니다. 슬ë¼ìž„처럼 죽으면 분열하여 여러 ê°œì˜ ì¡°ê·¸ë§Œ í브가 ë©ë‹ˆë‹¤. - + ë§ˆì„ ì‚¬ëžŒ - + 오셀롯 - + 정글ì—서 ì°¾ì„ ìˆ˜ 있으며 ë‚ ìƒì„ ì„ 먹여서 ì¡°ë ¨ì´ ê°€ëŠ¥í•©ë‹ˆë‹¤. ì´ë•Œ ê°‘ìžê¸° 움ì§ì´ë©´ ì˜¤ì…€ë¡¯ì´ ê²ì„ 먹고 ë„ë§ì¹˜ê¸° 때문ì—, ì˜¤ì…€ë¡¯ì´ ë‹¤ê°€ì˜¤ê²Œ 만들어야 합니다. - + ì²  골렘 - + 마ì„ì„ ë³´í˜¸í•˜ê¸° 위해 나타납니다. ì²  블ë¡ê³¼ 호박으로 만들 수 있습니다. - + +ë°•ì¥ + +ì´ ë‚ ì•„ë‹¤ë‹ˆëŠ” ë™ë¬¼ì€ ë™êµ´ì´ë‚˜ ê·¸ ì™¸ì˜ ë„“ê³  íì‡„ëœ ê³µê°„ì—서 발견ë©ë‹ˆë‹¤. + +마녀 + +늪ì—서 만날 수 있는 ì´ ì ì€ ë¬¼ì•½ì„ ë˜ì§€ë©° 공격합니다. 처치하면 ë¬¼ì•½ì„ ë–¨ì–´íŠ¸ë¦½ë‹ˆë‹¤. + +ë§ + +ì´ ë™ë¬¼ì€ 길들여서 타고 ë‹¤ë‹ ìˆ˜ 있습니다. + +당나귀 + +ì´ ë™ë¬¼ì€ 길들여서 타고 ë‹¤ë‹ ìˆ˜ 있으며, ìƒìžë¥¼ 달아줄 수 있습니다. + +노새 + +ë§ê³¼ 당나귀를 êµë°°ì‹œì¼œ 낳습니다. ì´ ë™ë¬¼ì€ 길들여서 타고 ë‹¤ë‹ ìˆ˜ 있으며 ìƒìžë¥¼ 달아줄 수 있습니다. + +좀비 ë§ + +해골 ë§ + +ìœ„ë” + +위ë”ì˜ í•´ê³¨ê³¼ ì˜í˜¼ 모래로 만듭니다. 플레ì´ì–´ë¥¼ 향해 í­ë°œí•˜ëŠ” í•´ê³¨ì„ ë°œì‚¬í•©ë‹ˆë‹¤. + Explosives Animator Concept Artist @@ -1042,7 +1183,7 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E Rest of Mojang Office -리드 게임 프로그래머 Minecraft PC +Lead Game Programmer Minecraft PC Code Ninja @@ -1374,6 +1515,8 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E ì§€ë„ +빈 ì§€ë„ + ìŒì•… ë””ìŠ¤í¬ - "13" ìŒì•… ë””ìŠ¤í¬ - "cat" @@ -1476,6 +1619,28 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E Creeper 머리 +ì§€ì˜¥ì˜ ë³„ + +í­ì£½ 로켓 + +í­ì£½ 별 + +레드스톤 ë¹„êµ íšŒë¡œ + +TNTê°€ 실린 광물 수레 + +호í¼ê°€ ë¶€ì°©ëœ ê´‘ë¬¼ 수레 + +ì² ì œ ë§ ë°©ì–´êµ¬ + +황금 ë§ ë°©ì–´êµ¬ + +다ì´ì•„몬드 ë§ ë°©ì–´êµ¬ + +ëˆ + +ì´ë¦„ 태그 + ëŒ ìž¡ì´ˆ ë¸”ë¡ @@ -1492,6 +1657,8 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E 정글 나무 íŒìž +나무 íŒìž(종류 무관) + 묘목 참나무 묘목 @@ -1828,6 +1995,190 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E ë‘개골 +명령 ë¸”ë¡ + +신호기 + +함정 ìƒìž + +가벼운 ì••ë ¥íŒ + +무거운 ì••ë ¥íŒ + +레드스톤 ë¹„êµ íšŒë¡œ + +ì¼ê´‘ 센서 + +레드스톤 ë¸”ë¡ + +í˜¸í¼ + +ìž‘ë™ê¸° ë ˆì¼ + +ë“œë¡œí¼ + +ìƒ‰ìƒ ì°°í™ + +ê±´ì´ˆ ë”미 + +단단한 ì°°í™ + +ì„탄 ë¸”ë¡ + +ê²€ì€ìƒ‰ ì°°í™ + +빨간색 ì°°í™ + +녹색 ì°°í™ + +갈색 ì°°í™ + +파란색 ì°°í™ + +ìžì£¼ìƒ‰ ì°°í™ + +ì²­ë¡ìƒ‰ ì°°í™ + +ë°ì€ 회색 ì°°í™ + +회색 ì°°í™ + +ë¶„í™ìƒ‰ ì°°í™ + +ë¼ìž„색 ì°°í™ + +노란색 ì°°í™ + +ë°ì€ 파란색 ì°°í™ + +ìží™ìƒ‰ ì°°í™ + +주황색 ì°°í™ + +í°ìƒ‰ ì°°í™ + +스테ì¸ë“œê¸€ë¼ìФ + +ê²€ì€ìƒ‰ 스테ì¸ë“œê¸€ë¼ìФ + +빨간색 스테ì¸ë“œê¸€ë¼ìФ + +녹색 스테ì¸ë“œê¸€ë¼ìФ + +갈색 스테ì¸ë“œê¸€ë¼ìФ + +파란색 스테ì¸ë“œê¸€ë¼ìФ + +ìžì£¼ìƒ‰ 스테ì¸ë“œê¸€ë¼ìФ + +ì²­ë¡ìƒ‰ 스테ì¸ë“œê¸€ë¼ìФ + +ë°ì€ 회색 스테ì¸ë“œê¸€ë¼ìФ + +회색 스테ì¸ë“œê¸€ë¼ìФ + +ë¶„í™ìƒ‰ 스테ì¸ë“œê¸€ë¼ìФ + +ë¼ìž„색 스테ì¸ë“œê¸€ë¼ìФ + +노란색 스테ì¸ë“œê¸€ë¼ìФ + +ë°ì€ 파란색 스테ì¸ë“œê¸€ë¼ìФ + +ìží™ìƒ‰ 스테ì¸ë“œê¸€ë¼ìФ + +주황색 스테ì¸ë“œê¸€ë¼ìФ + +í°ìƒ‰ 스테ì¸ë“œê¸€ë¼ìФ + +스테ì¸ë“œê¸€ë¼ìФ íŒìœ ë¦¬ + +ê²€ì€ìƒ‰ 스테ì¸ë“œê¸€ë¼ìФ íŒìœ ë¦¬ + +빨간색 스테ì¸ë“œê¸€ë¼ìФ íŒìœ ë¦¬ + +녹색 스테ì¸ë“œê¸€ë¼ìФ íŒìœ ë¦¬ + +갈색 스테ì¸ë“œê¸€ë¼ìФ íŒìœ ë¦¬ + +파란색 스테ì¸ë“œê¸€ë¼ìФ íŒìœ ë¦¬ + +ìžì£¼ìƒ‰ 스테ì¸ë“œê¸€ë¼ìФ íŒìœ ë¦¬ + +ì²­ë¡ìƒ‰ 스테ì¸ë“œê¸€ë¼ìФ íŒìœ ë¦¬ + +ë°ì€ 회색 스테ì¸ë“œê¸€ë¼ìФ íŒìœ ë¦¬ + +회색 스테ì¸ë“œê¸€ë¼ìФ íŒìœ ë¦¬ + +ë¶„í™ìƒ‰ 스테ì¸ë“œê¸€ë¼ìФ íŒìœ ë¦¬ + +ë¼ìž„색 스테ì¸ë“œê¸€ë¼ìФ íŒìœ ë¦¬ + +노란색 스테ì¸ë“œê¸€ë¼ìФ íŒìœ ë¦¬ + +ë°ì€ 파란색 스테ì¸ë“œê¸€ë¼ìФ íŒìœ ë¦¬ + +ìží™ìƒ‰ 스테ì¸ë“œê¸€ë¼ìФ íŒìœ ë¦¬ + +주황색 스테ì¸ë“œê¸€ë¼ìФ íŒìœ ë¦¬ + +í°ìƒ‰ 스테ì¸ë“œê¸€ë¼ìФ íŒìœ ë¦¬ + +ìž‘ì€ ê³µ + +í° ê³µ + +별 모양 + +Creeper 모양 + +í­ë°œ + +알 수 없는 모양 + +ê²€ì€ìƒ‰ + +빨간색 + +녹색 + +갈색 + +파란색 + +ìžì£¼ìƒ‰ + +ì²­ë¡ìƒ‰ + +ë°ì€ 회색 + +회색 + +ë¶„í™ìƒ‰ + +ë¼ìž„색 + +노란색 + +ë°ì€ 파란색 + +ìží™ìƒ‰ + +주황색 + +í°ìƒ‰ + +ì‚¬ìš©ìž ì§€ì • + +사ë¼ì§€ëŠ” 패턴: + +ë°˜ì§ìž„ + +ê¶¤ì  + +효과 시간: +  현재 컨트롤 배치 @@ -1854,9 +2205,9 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E 버리기 -살금살금 걷기 +조용히 걷기 -살금살금 걷기/아래로 비행 +조용히 걷기/아래로 비행 ì¹´ë©”ë¼ ëª¨ë“œ 변경 @@ -2005,8 +2356,7 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E ì´ê³³ì€ 소지품입니다. ì´ í™”ë©´ì—는 ì†ì— 들고 쓸 수 있는 ì•„ì´í…œê³¼ 가지고 ë‹¤ë‹ ìˆ˜ 있는 ì•„ì´í…œì´ ëª¨ë‘ í‘œì‹œë©ë‹ˆë‹¤. ë°©ì–´ë ¥ ë˜í•œ ì´ í™”ë©´ì—서 확ì¸í•  수 있습니다. - - + {*B*} 계ì†í•˜ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} 소지품 ì‚¬ìš©ë²•ì„ ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. @@ -2027,7 +2377,7 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E - ì•„ì´í…œ 정보를 ë” ë³´ë ¤ë©´ í¬ì¸í„°ë¡œ ì•„ì´í…œì„ 가리킨 ë‹¤ìŒ {*CONTROLLER_VK_RT*}를 누르십시오. + ì•„ì´í…œ 정보를 ë” ë³´ë ¤ë©´ í¬ì¸í„°ë¡œ ì•„ì´í…œì„ 가리킨 ë‹¤ìŒ {*CONTROLLER_ACTION_MENU_PAGEDOWN*}ì„ ëˆ„ë¥´ì‹­ì‹œì˜¤. @@ -2061,7 +2411,7 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E - ì•„ì´í…œ 정보를 ë” ë³´ë ¤ë©´ í¬ì¸í„°ë¡œ ì•„ì´í…œì„ 가리킨 ë‹¤ìŒ {*CONTROLLER_VK_RT*}를 누르십시오. + ì•„ì´í…œ 정보를 ë” ë³´ë ¤ë©´ í¬ì¸í„°ë¡œ ì•„ì´í…œì„ 가리킨 ë‹¤ìŒ {*CONTROLLER_ACTION_MENU_PAGEDOWN*}ì„ ëˆ„ë¥´ì‹­ì‹œì˜¤. @@ -2608,6 +2958,211 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E ìŒì‹ 막대와 ìŒì‹ 먹는 ë²•ì— ëŒ€í•´ ì´ë¯¸ 알고 있다면{*CONTROLLER_VK_B*} 단추를 누르십시오. + + 여기는 ë§ ì†Œì§€í’ˆ ì¸í„°íŽ˜ì´ìŠ¤ìž…ë‹ˆë‹¤. + + + + {*B*}계ì†í•˜ë ¤ë©´ {*CONTROLLER_VK_A*}를 누르십시오. + {*B*}ë§ ì†Œì§€í’ˆì— ëŒ€í•´ 알고 있다면 {*CONTROLLER_VK_B*}를 누르십시오. + + + + ë§ ì†Œì§€í’ˆì€ ë§, 당나귀, ë…¸ìƒˆì— ì•„ì´í…œì„ 옮기거나 착용시킬 수 있게 í•´ì¤ë‹ˆë‹¤. + + + + 안장 ìŠ¬ë¡¯ì— ì•ˆìž¥ì„ ë„£ì–´ ë§ì— ì•ˆìž¥ì„ ì±„ìš¸ 수 있습니다. 방어구 ìŠ¬ë¡¯ì— ë°©ì–´êµ¬ë¥¼ 넣으면 ë§ì´ 방어구를 착용해 ë°©ì–´ë ¥ì´ ì˜¤ë¦…ë‹ˆë‹¤. + + + + ì´ ë©”ë‰´ì—서 ìžì‹ ì˜ 소지품과, 당나귀 ë˜ëŠ” ë…¸ìƒˆì— ë‹¬ë¦° 안장 ê°€ë°©ì˜ ì•„ì´í…œì„ êµí™˜í•  수 있습니다. + + +ë§ì„ 찾았습니다. + +당나귀를 찾았습니다. + +노새를 찾았습니다. + + + {*B*}{*CONTROLLER_VK_A*}를 누르면 ë§ê³¼ 당나귀, ë…¸ìƒˆì— ëŒ€í•´ ë” ì•Œì•„ë³¼ 수 있습니다. + {*B*}ë§ê³¼ 당나귀, ë…¸ìƒˆì— ëŒ€í•´ ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*}를 누르십시오. + + + + ë§ê³¼ 당나귀는 주로 ë„“ì€ í‰ì§€ì—서 발견ë©ë‹ˆë‹¤. 노새는 ë§ê³¼ 당나귀를 êµë°°ì‹œì¼œ ì–»ì„ ìˆ˜ 있지만, 노새 ìžì²´ëŠ” êµë°° ëŠ¥ë ¥ì´ ì—†ìŠµë‹ˆë‹¤. + + + + 다 ìžëž€ ë§ê³¼ 당나귀, 노새는 타고 ë‹¤ë‹ ìˆ˜ 있습니다. 하지만 방어구는 ë§ì—게만 ìž…íž ìˆ˜ 있으며, ì•„ì´í…œ ìš´ë°˜ì— í•„ìš”í•œ 안장 ê°€ë°©ì€ ë‹¹ë‚˜ê·€ì™€ 노새ì—게만 착용시킬 수 있습니다. + + + + ë§ê³¼ 당나귀, 노새는 ê¸¸ì„ ë“¤ì—¬ì•¼ 사용할 수 있습니다. ë§ì€ 타려고 시ë„하면서, 기수를 떨어트리려는 ë§ì— 대항해 단단히 ë¶™ìž¡ì€ ì±„ 타고 있으면 ê¸¸ì„ ë“¤ì¼ ìˆ˜ 있습니다. + + + + ê¸¸ì´ ë“¤ë©´ ì£¼ë³€ì— í•˜íŠ¸ 표시가 나타나며, ë” ì´ìƒ 기수를 떨어트리려고 하지 않습니다. + + + + 지금 ë§íƒ€ê¸°ë¥¼ 시ë„í•´ 보십시오. ì†ì— ì•„ì´í…œì´ë‚˜ ë„구를 들지 ì•Šì€ ì±„ë¡œ {*CONTROLLER_ACTION_USE*}ì„ ì¡°ìž‘í•˜ë©´ 올ë¼íƒ‘니다. + + + + ë§ì˜ ë°©í–¥ì„ ì¡°ì •í•˜ë ¤ë©´ ì•ˆìž¥ì„ ì°©ìš©ì‹œì¼œì•¼ 합니다. ì•ˆìž¥ì€ ë§ˆì„ ì£¼ë¯¼ìœ¼ë¡œë¶€í„° 구매하거나 ê³³ê³³ì— ìˆ¨ê²¨ì§„ ìƒìžì— 들어 있습니다. + + + + ê¸¸ì´ ë“  당나귀와 ë…¸ìƒˆì— ìƒìžë¥¼ 부착하면 안장 ê°€ë°©ì„ ë‹¬ì•„ì¤„ 수 있습니다. ì´ ê°€ë°©ì€ ë‹¹ë‚˜ê·€ ë˜ëŠ” 노새를 타거나 ëª¸ì„ ìˆ˜ê·¸ë¦° ìƒíƒœì—서 사용 가능합니다. + + + + ë§ê³¼ 당나귀(노새 제외)는 황금 사과나 황금 ë‹¹ê·¼ì„ ì‚¬ìš©í•´ 다른 ë™ë¬¼ë“¤ì²˜ëŸ¼ êµë°°í•  수 있습니다. ë§ì•„지는 ì‹œê°„ì´ ì§€ë‚˜ë©´ 성장하여 ë§ì´ ë˜ë©°, ë°€ì´ë‚˜ 건초를 먹ì´ë©´ 성장 ì‹œê°„ì´ ë‹¨ì¶•ë©ë‹ˆë‹¤. + + + + ì´ê³³ì—서 ë§ê³¼ 당나귀 길들ì´ê¸°ë¥¼ 시ë„í•  수 있으며, ì£¼ë³€ì˜ ìƒìžì—는 안장과 ë§ ë°©ì–´êµ¬ë¥¼ 비롯해 ë§ì—게 사용할 수 있는 유용한 ì•„ì´í…œë„ 들어있습니다. + + + + ì´ê²ƒì€ 신호기 ì¸í„°íŽ˜ì´ìŠ¤ìž…ë‹ˆë‹¤. 여기서 ì‹ í˜¸ê¸°ì˜ ëŠ¥ë ¥ì„ ì„ íƒí•  수 있습니다. + + + + {*B*}계ì†í•˜ë ¤ë©´ {*CONTROLLER_VK_A*}를 누르십시오. + {*B*}신호기 ì¸í„°íŽ˜ì´ìФ 사용 ë°©ë²•ì„ ì•Œê³  있다면 {*CONTROLLER_VK_B*}를 누르십시오. + + + + 신호기 메뉴ì—서 ì‹ í˜¸ê¸°ì˜ ì£¼ 능력 1개를 ì„ íƒí•  수 있습니다. 피ë¼ë¯¸ë“œì˜ 층수가 ë§Žì„ìˆ˜ë¡ ëŠ¥ë ¥ ì„ íƒì˜ í­ì´ ë” ë„“ì–´ì§‘ë‹ˆë‹¤. + + + + 4층 ì´ìƒ ë˜ëŠ” 피ë¼ë¯¸ë“œ ìœ„ì˜ ì‹ í˜¸ê¸°ëŠ” ë³´ì¡° ëŠ¥ë ¥ì¸ '재ìƒ'ì´ë‚˜ 주 능력 ê°•í™” 중 한 가지를 추가로 ì„ íƒí•  수 있습니다. + + + + ì‹ í˜¸ê¸°ì˜ ëŠ¥ë ¥ì„ ì„¤ì •í•˜ë ¤ë©´ 지불 ìŠ¬ë¡¯ì— ì—메랄드, 다ì´ì•„몬드, 황금 ë˜ëŠ” ì²  주괴를 넣어야 합니다. 재료를 넣으면 신호기ì—서 ëŠ¥ë ¥ì´ ë¬´ê¸°í•œìœ¼ë¡œ ë°œë™ë©ë‹ˆë‹¤. + + +ì´ í”¼ë¼ë¯¸ë“œ 꼭대기ì—는 정지한 신호기가 있습니다. + + + {*B*}ì‹ í˜¸ê¸°ì— ëŒ€í•´ ë” ì•Œì•„ë³´ë ¤ë©´ {*CONTROLLER_VK_A*}를 누르십시오. + {*B*}ì‹ í˜¸ê¸°ì— ëŒ€í•´ ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*}를 누르십시오. + + + + ìž‘ë™í•˜ëŠ” 신호기는 하늘로 ë°ì€ ê´‘ì„ ì„ ì˜ì•„올리고 주변 플레ì´ì–´ì—게 ëŠ¥ë ¥ì„ ë¶€ì—¬í•©ë‹ˆë‹¤. 신호기는 위ë”를 잡고 ì–»ì„ ìˆ˜ 있는 유리와 í‘ìš”ì„, ì§€ì˜¥ì˜ ë³„ë¡œ 만듭니다. + + + + 신호기는 ë‚®ì— í–‡ë¹›ì„ ë°›ì„ ìˆ˜ ìž¥ì†Œì— ë†“ì•„ì•¼ 하며, 반드시 ì² , 황금, ì—메랄드 ë° ë‹¤ì´ì•„몬드 ë“±ì˜ í”¼ë¼ë¯¸ë“œ ìœ„ì— ì„¤ì¹˜í•´ì•¼ 합니다. 하지만 ì–´ë–¤ 재료를 ì„ íƒí•´ë„ ì‹ í˜¸ê¸°ì˜ ëŠ¥ë ¥ì—는 ì˜í–¥ì„ 주지 않습니다. + + + + 신호기를 사용해 ëŠ¥ë ¥ì„ ì„¤ì •í•´ 보십시오. 제공ë˜ëŠ” ì²  주괴를 대가로 지불할 수 있습니다. + + +여기ì—는 호í¼ê°€ 있습니다. + + + {*B*}호í¼ì— 대해 ë” ì•Œì•„ë³´ë ¤ë©´ {*CONTROLLER_VK_A*}를 누르십시오. + {*B*}호í¼ì— 대해 ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*}를 누르십시오. + + + + 호í¼ëŠ” ë³´ê´€í•¨ì— ì•„ì´í…œì„ 넣거나 빼고, 보관함 ì•ˆì— ë“¤ì–´ê°„ ì•„ì´í…œì„ ìžë™ìœ¼ë¡œ 집습니다. + + + + 호í¼ëŠ” 양조대, ìƒìž, 디스펜서, 드로í¼, ìƒìžê°€ ë“  광물 수레, 호í¼ê°€ ë¶€ì°©ëœ ê´‘ë¬¼ 수레, 다른 호í¼ì— ì˜í–¥ì„ 줄 수 있습니다. + + + + 호í¼ëŠ” ê·¸ ìœ„ì— ì„¤ì¹˜ëœ ì ì ˆí•œ 보관함으로부터 ê³„ì† ì•„ì´í…œì„ 빨아들ì´ë ¤ê³  시ë„합니다. ë˜í•œ ë³´ê´€ëœ ì•„ì´í…œì„ 배출구 쪽 ë³´ê´€í•¨ì— ë„£ìœ¼ë ¤ê³  합니다. + + + + 하지만 호í¼ì— ë ˆë“œìŠ¤í†¤ì˜ ë™ë ¥ì´ 공급ë˜ë©´ ìž‘ë™ì„ 멈추고 ì•„ì´í…œ 빨아들ì´ê¸°ì™€ 넣기를 중지합니다. + + + + 호í¼ëŠ” ì•„ì´í…œì„ 내보내려는 ë°©í–¥ì„ ê°€ë¦¬í‚µë‹ˆë‹¤. 호í¼ê°€ 특정 블ë¡ì„ 가리키게 하려면 호í¼ì— ì•„ì´í…œì´ ë“¤ì–´ìžˆì„ ë•Œ 해당 블ë¡ê³¼ 대치ë˜ëŠ” ë°©í–¥ì— ì„¤ì¹˜í•˜ì‹­ì‹œì˜¤. + + + + ì´ê³³ì—서 í˜¸í¼ ë°°ì—´ì„ í™•ì¸í•˜ê³  실험해볼 수 있습니다. + + + + ì´ê²ƒì€ í­ì£½ ì¸í„°íŽ˜ì´ìŠ¤ìž…ë‹ˆë‹¤. 여기ì—서 í­ì£½ê³¼ í­ì£½ ë³„ì„ ë§Œë“¤ 수 있습니다. + + + + {*B*}계ì†í•˜ë ¤ë©´ {*CONTROLLER_VK_A*}를 누르십시오. + {*B*} í­ì£½ ì¸í„°íŽ˜ì´ìФ 사용 ë°©ë²•ì„ ì•Œê³  있다면 {*CONTROLLER_VK_B*}를 누르십시오. + + + + í­ì£½ì„ 만들려면 소지품 위 3x3 ì œìž‘ì¹¸ì— í™”ì•½ê³¼ 종ì´ë¥¼ 넣으십시오. + + + + ì œìž‘ì¹¸ì— í­ì£½ 별 여러 개를 추가로 넣어 í­ì£½ì— ì„žì„ ìˆ˜ 있습니다. + + + + 제작칸 ìŠ¬ë¡¯ì— í™”ì•½ì„ ë” ë§Žì´ ì±„ìš°ë©´ í­ì£½ ë³„ì´ í­ë°œí•˜ëŠ” 높ì´ê°€ ì¦ê°€í•©ë‹ˆë‹¤. + + + + 그런 ë‹¤ìŒ ê²°ê³¼ë¬¼ 슬롯 밖으로 ì™„ì„±ëœ í­ì£½ì„ 꺼낼 수 있습니다. + + + + í­ì£½ ë³„ì€ í™”ì•½ê³¼ 염료를 ì œìž‘ì¹¸ì— ë„£ì–´ 만들 수 있습니다. + + + + 염료는 í­ì£½ ë³„ì´ í­ë°œí•  ë•Œì˜ ìƒ‰ìƒì„ 결정합니다. + + + + í­ì£½ ë³„ì˜ ëª¨ì–‘ì€ ë¶ˆì˜ì‹œê°œ, 금ë©ì´, 깃털, 괴물 머리를 추가해 바꿀 수 있습니다. + + + + 다ì´ì•„몬드나 ë°œê´‘ì„ ê°€ë£¨ë¥¼ 사용하면 궤ì ì´ë‚˜ ë°˜ì§ìž„ 효과가 추가ë©ë‹ˆë‹¤. + + + + í­ì£½ ë³„ì„ ë§Œë“  후ì—는 염료와 함께 ì¡°í•©í•´, í­ë°œ 후 사ë¼ì§ˆ ë•Œì˜ ìƒ‰ìƒì„ 조절할 수 있습니다. + + + + ì´ ìƒìžë“¤ì—는 í­ì£½ì„ 만드는 ë° ì“¸ 수 있는 다양한 ì•„ì´í…œì´ 들어있습니다! + + + + {*B*}í­ì£½ì— 대해 ë” ì•Œì•„ë³´ë ¤ë©´ {*CONTROLLER_VK_A*}를 누르십시오. + {*B*}í­ì£½ì— 대해 ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*}를 누르십시오. + + + + í­ì£½ì€ ì†ì´ë‚˜ 디스펜서로 발사할 수 있는 ìž¥ì‹ ì•„ì´í…œì´ë©°, 기본 ìž¬ë£Œì¸ ì¢…ì´ì™€ í™”ì•½ì— í­ì£½ ë³„ì„ ë¶€ê°€ì ìœ¼ë¡œ ë”í•´ 만들 수 있습니다. + + + + í­ì£½ ë³„ì„ ë§Œë“¤ 때 추가 재료를 넣으면 색ìƒê³¼ 사ë¼ì§€ëŠ” 형태, 모양, í¬ê¸°, 효과(궤ì ì´ë‚˜ ë°˜ì§ìž„ 등)를 ì›í•˜ëŠ” 대로 바꿀 수 있습니다. + + + + 작업대ì—서 ìƒìžì— ë“  ìž¬ë£Œë“¤ì„ ì´ìš©í•´ í­ì£½ì„ 만들어 보십시오. + +  ì„ íƒ ì‚¬ìš© @@ -2812,9 +3367,9 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E ë¸”ë¡ -페ì´ì§€ 위로 +페ì´ì§€ 올림 -페ì´ì§€ 아래로 +페ì´ì§€ 내림 사랑 모드 @@ -2830,6 +3385,22 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E Xbox One 저장 ë°ì´í„° 업로드 +타기 + +내리기 + +ìƒìž 달기 + +발사 + +줄 묶기 + +놓기 + +부착 + +ì´ë¦„ + í™•ì¸ ì·¨ì†Œ @@ -3144,6 +3715,20 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E 디스펜서 +ë§ + +ë“œë¡œí¼ + +í˜¸í¼ + +신호기 + +주 능력 + +ë³´ì¡° 능력 + +광물 수레 + 현재 ì´ ê²Œìž„ì—서 구매할 수 있는 해당 ìœ í˜•ì˜ ë‹¤ìš´ë¡œë“œ 콘í…츠가 없습니다. %së‹˜ì´ ê²Œìž„ì— ì°¸ê°€í–ˆìŠµë‹ˆë‹¤. @@ -3303,10 +3888,14 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E 게임 모드: 창작 +게임 모드: 모험 + ìƒì¡´ 창작 +모험 + ìƒì¡´ 모드ì—서 ìƒì„± 창작 모드ì—서 ìƒì„± @@ -3327,6 +3916,8 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E 완전í‰ë©´ +시드를 입력해서 ê°™ì€ ì§€ì—­ì„ ë§Œë“œì‹­ì‹œì˜¤. 공백으로 ë‘ë©´ 무작위 월드가 ìƒì„±ë©ë‹ˆë‹¤. + ì´ ì˜µì…˜ì„ ì¼œë©´ 온ë¼ì¸ 게임으로 플레ì´í•©ë‹ˆë‹¤. ì´ ì˜µì…˜ì„ ì¼œë©´ ì´ˆëŒ€ë°›ì€ í”Œë ˆì´ì–´ë§Œ ê²Œìž„ì— ì°¸ê°€í•  수 있습니다. @@ -3351,6 +3942,20 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E ì´ ì˜µì…˜ì„ ì¼œë©´ 쓸모있는 ì•„ì´í…œì´ ë“  ìƒìžê°€ 플레ì´ì–´ ìƒì„± ì§€ì  ê·¼ì²˜ì— ë‚˜íƒ€ë‚©ë‹ˆë‹¤. +비활성화하면 몬스터와 ë™ë¬¼ì´ 블ë¡ì„ êµì²´í•˜ê±°ë‚˜ ì•„ì´í…œì„ ì§‘ì§€ 못하게 합니다. 예를 들어 Creeperê°€ í­ë°œí•´ë„ 블ë¡ì´ 파괴ë˜ì§€ 않으며, ì–‘ì€ í’€ì„ ì œê±°í•˜ì§€ 못합니다. + +활성화하면 플레ì´ì–´ê°€ ì£½ì–´ë„ ì†Œì§€í’ˆì˜ ì•„ì´í…œì„ 잃지 않습니다. + +비활성화하면 괴물ì´ë‚˜ ë™ë¬¼ì´ ìžì—°ì ìœ¼ë¡œ ìƒì„±ë˜ì§€ 않습니다. + +비활성화하면 괴물과 ë™ë¬¼ì´ ì „ë¦¬í’ˆì„ ë–¨ì–´íŠ¸ë¦¬ì§€ 않습니다. 예를 들어 Creeperê°€ í™”ì•½ì„ ë–¨ì–´íŠ¸ë¦¬ì§€ 않습니다. + +비활성화하면 블ë¡ì´ 파괴ë¼ë„ ì•„ì´í…œì„ 떨어트리지 않습니다. 예를 들어 ëŒ ë¸”ë¡ì—서 조약ëŒì„ ì–»ì„ ìˆ˜ 없습니다. + +비활성화하면 플레ì´ì–´ì˜ ì²´ë ¥ì´ ìžì—°ì ìœ¼ë¡œ 재ìƒë˜ì§€ 않습니다. + +비활성화하면 시간대가 변하지 않습니다. + 스킨 팩 테마 @@ -3399,7 +4004,49 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E {*PLAYER*} {*SOURCE*}ì— íƒ€ê²©ì— ì˜í•´ ì‚¬ë§ -{*PLAYER*}ë‹˜ì´ {*SOURCE*}ì— ì˜í•´ 살해당했습니다. +{*PLAYER*} ë‹˜ì´ {*SOURCE*}ì˜ ë§ˆë²•ì— ì‚´í•´ë‹¹í–ˆìŠµë‹ˆë‹¤. + +{*PLAYER*} ë‹˜ì´ ì‚¬ë‹¤ë¦¬ì—서 떨어졌습니다. + +{*PLAYER*} ë‹˜ì´ ë©êµ´ì—서 떨어졌습니다. + +{*PLAYER*} ë‹˜ì´ ë¬¼ 밖으로 떨어졌습니다. + +{*PLAYER*} ë‹˜ì´ ë†’ì€ ê³³ì—서 떨어졌습니다. + +{*PLAYER*} ë‹˜ì´ {*SOURCE*}ì— ì˜í•´ 떨어져 사ë§í–ˆìŠµë‹ˆë‹¤. + +{*PLAYER*} ë‹˜ì´ {*SOURCE*}ì— ì˜í•´ 떨어져 사ë§í–ˆìŠµë‹ˆë‹¤. + +{*PLAYER*} ë‹˜ì´ {*SOURCE*}ì˜ {*ITEM*}ì— ì˜í•´ 떨어져 사ë§í–ˆìŠµë‹ˆë‹¤. + +{*PLAYER*} ë‹˜ì´ ë„ˆë¬´ 멀리 떨어져 {*SOURCE*}ì— ì˜í•´ 사ë§í–ˆìŠµë‹ˆë‹¤. + +{*PLAYER*} ë‹˜ì´ ë„ˆë¬´ 멀리 떨어져 {*SOURCE*}ì˜ {*ITEM*}ì— ì˜í•´ 사ë§í–ˆìŠµë‹ˆë‹¤. + +{*PLAYER*} ë‹˜ì´ {*SOURCE*}ê³¼(와) ì‹¸ìš°ë˜ ì¤‘ 불 ì†ìœ¼ë¡œ 걸어 들어갔습니다. + +{*PLAYER*} ë‹˜ì´ {*SOURCE*}ê³¼(와) ì‹¸ìš°ë˜ ì¤‘ 까맣게 타버렸습니다. + +{*PLAYER*} ë‹˜ì´ {*SOURCE*}ì„(를) 피하다 용암ì—서 수ì˜ì„ 했습니다. + +{*PLAYER*} ë‹˜ì´ {*SOURCE*}ì„(를) 피하려다 ìµì‚¬í–ˆìŠµë‹ˆë‹¤. + +{*PLAYER*} ë‹˜ì´ {*SOURCE*}ì„(를) 피하려다 ì„ ì¸ìž¥ì— 찔렸습니다. + +{*PLAYER*} ë‹˜ì´ {*SOURCE*}ì— ì˜í•´ 날아갔습니다. + +{*PLAYER*} ë‹˜ì´ ë§ë¼ 죽었습니다. + +{*PLAYER*} ë‹˜ì´ {*SOURCE*}ì˜ {*ITEM*}ì— ì˜í•´ 사ë§í–ˆìŠµë‹ˆë‹¤. + +{*PLAYER*} ë‹˜ì´ {*SOURCE*}ì˜ {*ITEM*}ì— ë§žì•„ 사ë§í–ˆìŠµë‹ˆë‹¤. + +{*PLAYER*} ë‹˜ì´ {*SOURCE*}ì˜ {*ITEM*}ì— ì˜í•´ 불ë©ì–´ë¦¬ë¥¼ 맞았습니다. + +{*PLAYER*} ë‹˜ì´ {*SOURCE*}ì˜ {*ITEM*}ì— ì˜í•´ 찌부러졌습니다. + +{*PLAYER*} ë‹˜ì´ {*SOURCE*}ì˜ {*ITEM*}ì— ì‚´í•´ë‹¹í–ˆìŠµë‹ˆë‹¤. 기반암 안개 @@ -3564,9 +4211,9 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E 지하 초기화를 하지 않습니다. -Mooshroomì˜ í„¸ì„ ìžë¥¼ 수 없습니다. ë¼ì§€, ì–‘, 소, ê³ ì–‘ì´ì˜ 수가 ìµœëŒ€ì¹˜ì— ë„달했습니다. +Mooshroomì˜ í„¸ì„ ìžë¥¼ 수 없습니다. ë¼ì§€, ì–‘, 소, ê³ ì–‘ì´, ë§ì˜ 수가 ìµœëŒ€ì¹˜ì— ë„달했습니다. -ë‚³ì€ ì•Œì„ ì‚¬ìš©í•  수 없습니다. ë¼ì§€, ì–‘, 소, ê³ ì–‘ì´ì˜ 수가 ìµœëŒ€ì¹˜ì— ë„달했습니다. +ë‚³ì€ ì•Œì„ ì‚¬ìš©í•  수 없습니다. ë¼ì§€, ì–‘, 소, ê³ ì–‘ì´, ë§ì˜ 수가 ìµœëŒ€ì¹˜ì— ë„달했습니다. ë‚³ì€ ì•Œì„ ì‚¬ìš©í•  수 없습니다. Mooshroomì˜ ìˆ˜ê°€ ìµœëŒ€ì¹˜ì— ë„달했습니다. @@ -3576,6 +4223,8 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E ë‚³ì€ ì•Œì„ ì‚¬ìš©í•  수 없습니다. ì˜¤ì§•ì–´ì˜ ìˆ˜ê°€ ìµœëŒ€ì¹˜ì— ë„달했습니다. +ë‚³ì€ ì•Œì„ ì‚¬ìš©í•  수 없습니다. ë§ˆì„ ì‚¬ëžŒì˜ ìˆ˜ê°€ ìµœëŒ€ì¹˜ì— ë„달했습니다. + ë‚³ì€ ì•Œì„ ì‚¬ìš©í•  수 없습니다. ì ì˜ 수가 ìµœëŒ€ì¹˜ì— ë„달했습니다. ë‚³ì€ ì•Œì„ ì‚¬ìš©í•  수 없습니다. ë§ˆì„ ì‚¬ëžŒì˜ ìˆ˜ê°€ ìµœëŒ€ì¹˜ì— ë„달했습니다. @@ -3584,12 +4233,14 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E ë‚™ì› ëª¨ë“œì—서는 ì ì„ ìƒì„±í•  수 없습니다. -ì´ ë™ë¬¼ì€ 사랑 모드로 만들 수 없습니다. êµë°°í•  수 있는 ë¼ì§€, ì–‘, 소, ê³ ì–‘ì´ì˜ 수가 ìµœëŒ€ì¹˜ì— ë„달했습니다. +ì´ ë™ë¬¼ì€ 사랑 모드로 만들 수 없습니다. êµë°°í•  수 있는 ë¼ì§€, ì–‘, 소, ê³ ì–‘ì´, ë§ì˜ 수가 ìµœëŒ€ì¹˜ì— ë„달했습니다. ì´ ë™ë¬¼ì€ 사랑 모드로 만들 수 없습니다. êµë°°í•  수 있는 ëŠ‘ëŒ€ì˜ ìˆ˜ê°€ ìµœëŒ€ì¹˜ì— ë„달했습니다. ì´ ë™ë¬¼ì€ 사랑 모드로 만들 수 없습니다. êµë°°í•  수 있는 ë‹­ì˜ ìˆ˜ê°€ ìµœëŒ€ì¹˜ì— ë„달했습니다. +ì´ ë™ë¬¼ì€ 사랑 모드로 만들 수 없습니다. êµë°°í•  수 있는 ë§ì˜ 수가 ìµœëŒ€ì¹˜ì— ë„달했습니다. + ì´ ë™ë¬¼ì€ 사랑 모드로 만들 수 없습니다. êµë°°í•  수 있는 Mooshroomì˜ ìˆ˜ê°€ ìµœëŒ€ì¹˜ì— ë„달했습니다. ë°°ì˜ ìˆ˜ê°€ ìµœëŒ€ì¹˜ì— ë„달했습니다. @@ -3617,27 +4268,43 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E 제작진 콘í…츠 재설치 - + 디버그 설정 - + 불 확산 - + TNT í­ë°œ - + 플레ì´ì–´ 대 플레ì´ì–´ - + 플레ì´ì–´ 신뢰 - + 호스트 특권 - + 건물 ìƒì„± - + 완전í‰ë©´ 월드 - + 보너스 ìƒìž - + 월드 옵션 - + +게임 옵션 + +ê´´ë¬¼ì— ì˜í•œ 괴롭힘 + +소지품 유지 + +괴물 ìƒì„± + +괴물 전리품 + +íƒ€ì¼ ì•„ì´í…œ + +ìžì—° ìž¬ìƒ + +시간대 전환 + 건설 ë° ì±„ê´‘ 가능 문과 스위치 사용 가능 @@ -3824,6 +4491,14 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E ë… +ìœ„ë” + +ì²´ë ¥ ê°•í™” + +í¡ìˆ˜ + +í¬ë§Œ + - ì‹ ì† - ì†ë„ 저하 @@ -3862,6 +4537,14 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E - ë… +ë§Œí¼ ë¶€íŒ¨ + +ë§Œí¼ ì²´ë ¥ ê°•í™” + +ë§Œí¼ í¡ìˆ˜ + +ë§Œí¼ í¬ë§Œ + II @@ -3958,6 +4641,22 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E 효과 ëŒ€ìƒ í”Œë ˆì´ì–´, ë™ë¬¼ ë° ê´´ë¬¼ì˜ ì²´ë ¥ì´ ì„œì„œížˆ ê°ì†Œí•©ë‹ˆë‹¤. +복용 시: + +ë§ ì í”„ ê°•í™” + +좀비 ì¦ì› + +최대 ì²´ë ¥ + +괴물 ë”°ë¼ì˜¤ê¸° 거리 + +밀치기 저항 + +ì†ë„ + +공격력 + 예리 강타 @@ -4048,7 +4747,7 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E {*ICON_SHANK_01*}를 3ë§Œí¼ íšŒë³µí•©ë‹ˆë‹¤. 화로ì—서 ê°ìžë¥¼ 조리하여 만듭니다. -먹어서 {*ICON_SHANK_01*}를 1ë§Œí¼ íšŒë³µí•˜ê±°ë‚˜ 화로ì—서 조리할 수 있습니다. ë†ì§€ì— ì‹¬ì„ ìˆ˜ 있으며 먹으면 중ë…ë  ìˆ˜ 있습니다. +먹어서 {*ICON_SHANK_01*}를 1ë§Œí¼ íšŒë³µí•©ë‹ˆë‹¤. 먹으면 중ë…ë  ìˆ˜ 있습니다. {*ICON_SHANK_01*}를 3ë§Œí¼ íšŒë³µí•©ë‹ˆë‹¤. 당근과 금ë©ì´ë¥¼ 사용해 만듭니다. @@ -4278,7 +4977,7 @@ Enderì— ë“¤ì–´ì„œë©´ 친구가 ê·¸ë“¤ì˜ ì§€ë„ì—서 요새 ë‚´ë¶€ì— ìžˆëŠ” E {*B*} - 거래 ì¸í„°íŽ˜ì´ìŠ¤ì— ëŒ€í•´ ë” ì•Œì•„ë³´ë ¤ë©´ {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} + 거래 ì¸í„°íŽ˜ì´ìŠ¤ì— ëŒ€í•´ 알아보려면 {*CONTROLLER_VK_A*} 단추를 누르십시오.{*B*} 거래 ì¸í„°íŽ˜ì´ìŠ¤ì— ëŒ€í•´ ì´ë¯¸ 알고 있다면 {*CONTROLLER_VK_B*} 단추를 누르십시오. diff --git a/Minecraft.Client/Common/Media/movies1080.txt b/Minecraft.Client/Common/Media/movies1080.txt index f72fa4cf..782dd5bc 100644 --- a/Minecraft.Client/Common/Media/movies1080.txt +++ b/Minecraft.Client/Common/Media/movies1080.txt @@ -7,6 +7,7 @@ skinHDHud.swf skinHDLabels.swf skinHDInGame.swf AnvilMenu1080.swf +BeaconMenu1080.swf BrewingStandMenu1080.swf ChestMenu1080.swf ChestLargeMenu1080.swf @@ -31,9 +32,12 @@ DispenserMenu1080.swf EnchantingMenu1080.swf EndPoem1080.swf EULA1080.swf +FireworksMenu1080.swf FullscreenProgress1080.swf FurnaceMenu1080.swf HelpAndOptionsMenu1080.swf +HopperMenu1080.swf +HorseInventoryMenu1080.swf HowToPlay1080.swf HowToPlayMenu1080.swf HUD1080.swf @@ -44,6 +48,8 @@ InGameTeleportMenu1080.swf Intro1080.swf InventoryMenu1080.swf JoinMenu1080.swf +LanguagesMenu1080.swf +LanguagesMenuSplit1080.swf LoadOrJoinMenu1080.swf LaunchMoreOptionsMenu1080.swf LeaderboardMenu1080.swf @@ -72,6 +78,7 @@ ToolTips1080.swf TradingMenu1080.swf TutorialPopup1080.swf AnvilMenuSplit1080.swf +BeaconMenuSplit1080.swf BrewingStandMenuSplit1080.swf ChestMenuSplit1080.swf ChestLargeMenuSplit1080.swf @@ -82,9 +89,12 @@ CreativeMenuSplit1080.swf DeathMenuSplit1080.swf DispenserMenuSplit1080.swf EnchantingMenuSplit1080.swf +FireworksMenuSplit1080.swf FurnaceMenuSplit1080.swf FullscreenProgressSplit1080.swf HelpAndOptionsMenuSplit1080.swf +HopperMenuSplit1080.swf +HorseInventoryMenuSplit1080.swf HowToPlaySplit1080.swf HowToPlayMenuSplit1080.swf HUDSplit1080.swf diff --git a/Minecraft.Client/Common/Media/movies480.txt b/Minecraft.Client/Common/Media/movies480.txt index a3ab2ec6..bbc4f2a5 100644 --- a/Minecraft.Client/Common/Media/movies480.txt +++ b/Minecraft.Client/Common/Media/movies480.txt @@ -1,4 +1,5 @@ AnvilMenu480.swf +BeaconMenu480.swf BrewingStandMenu480.swf ChestLargeMenu480.swf ChestMenu480.swf @@ -15,9 +16,12 @@ DLCMainMenu480.swf EnchantingMenu480.swf EndPoem480.swf EULA480.swf +FireworksMenu480.swf FullscreenProgress480.swf FurnaceMenu480.swf HelpAndOptionsMenu480.swf +HopperMenu480.swf +HorseInventoryMenu480.swf HowToPlay480.swf HowToPlayMenu480.swf HUD480.swf @@ -27,6 +31,7 @@ InGamePlayerOptions480.swf Intro480.swf InventoryMenu480.swf JoinMenu480.swf +LanguagesMenu480.swf LaunchMoreOptionsMenu480.swf LeaderboardMenu480.swf LoadMenu480.swf diff --git a/Minecraft.Client/Common/Media/movies720.txt b/Minecraft.Client/Common/Media/movies720.txt index ee89748b..524fcee0 100644 --- a/Minecraft.Client/Common/Media/movies720.txt +++ b/Minecraft.Client/Common/Media/movies720.txt @@ -7,6 +7,7 @@ skinHud.swf skinLabels.swf skinInGame.swf AnvilMenu720.swf +BeaconMenu720.swf BrewingStandMenu720.swf ChestMenu720.swf ChestLargeMenu720.swf @@ -29,9 +30,12 @@ DispenserMenu720.swf EnchantingMenu720.swf EndPoem720.swf EULA720.swf +FireworksMenu720.swf FullscreenProgress720.swf FurnaceMenu720.swf HelpAndOptionsMenu720.swf +HopperMenu720.swf +HorseInventoryMenu720.swf HowToPlay720.swf HowToPlayMenu720.swf HUD720.swf @@ -42,6 +46,8 @@ InGameTeleportMenu720.swf Intro720.swf InventoryMenu720.swf JoinMenu720.swf +LanguagesMenu720.swf +LanguagesMenuSplit720.swf LoadOrJoinMenu720.swf LaunchMoreOptionsMenu720.swf LeaderboardMenu720.swf @@ -69,6 +75,7 @@ ToolTips720.swf TradingMenu720.swf TutorialPopup720.swf AnvilMenuSplit720.swf +BeaconMenuSplit720.swf BrewingStandMenuSplit720.swf ChestMenuSplit720.swf ChestLargeMenuSplit720.swf @@ -80,10 +87,13 @@ CreativeMenuSplit720.swf DeathMenuSplit720.swf DispenserMenuSplit720.swf EnchantingMenuSplit720.swf +FireworksMenuSplit720.swf FurnaceMenuSplit720.swf FullscreenProgressSplit720.swf GamertagSplit720.swf HelpAndOptionsMenuSplit720.swf +HopperMenuSplit720.swf +HorseInventoryMenuSplit720.swf HowToPlaySplit720.swf HowToPlayMenuSplit720.swf HUDSplit720.swf diff --git a/Minecraft.Client/Common/Media/moviesVita.txt b/Minecraft.Client/Common/Media/moviesVita.txt index 7a05e006..97627ca6 100644 --- a/Minecraft.Client/Common/Media/moviesVita.txt +++ b/Minecraft.Client/Common/Media/moviesVita.txt @@ -7,6 +7,7 @@ skinHud.swf skinLabels.swf skinInGame.swf AnvilMenuVita.swf +BeaconMenuVita.swf BrewingStandMenuVita.swf ChestLargeMenuVita.swf ChestMenuVita.swf @@ -24,9 +25,12 @@ DLCMainMenuVita.swf EnchantingMenuVita.swf EndPoemVita.swf EULAVita.swf +FireworksMenuVita.swf FullscreenProgressVita.swf FurnaceMenuVita.swf HelpAndOptionsMenuVita.swf +HopperMenuVita.swf +HorseInventoryMenuVita.swf HowToPlayMenuVita.swf HowToPlayVita.swf HUDVita.swf @@ -37,6 +41,7 @@ InGameTeleportMenuVita.swf IntroVita.swf InventoryMenuVita.swf JoinMenuVita.swf +LanguagesMenuVita.swf LaunchMoreOptionsMenuVita.swf LeaderboardMenuVita.swf LoadMenuVita.swf diff --git a/Minecraft.Client/Common/Media/pt-BR/strings.resx b/Minecraft.Client/Common/Media/pt-BR/strings.resx index 0fd411ec..67369181 100644 --- a/Minecraft.Client/Common/Media/pt-BR/strings.resx +++ b/Minecraft.Client/Common/Media/pt-BR/strings.resx @@ -147,29 +147,29 @@ {*T3*}COMO JOGAR: NOÇÕES BÃSICAS{*ETW*}{*B*}{*B*} Minecraft é um jogo que consiste em colocar blocos para construir qualquer coisa que imaginar. À noite os monstros aparecem; então, construa um abrigo antes que isso aconteça.{*B*}{*B*} -Use {*CONTROLLER_ACTION_LOOK*}para olhar à sua volta.{*B*}{*B*} -Use {*CONTROLLER_ACTION_MOVE*}para se mover.{*B*}{*B*} -Pressione {*CONTROLLER_ACTION_JUMP*}para pular.{*B*}{*B*} -Pressione {*CONTROLLER_ACTION_MOVE*}duas vezes para frente rapidamente para correr. Enquanto mantiver {*CONTROLLER_ACTION_MOVE*}pressionado para a frente, o personagem continuará correndo, a não ser que o tempo de corrida acabe ou que a Barra de Alimentos tenha menos de {*ICON_SHANK_03*}.{*B*}{*B*} -Mantenha {*CONTROLLER_ACTION_ACTION*}pressionado para extrair e cortar usando a mão ou o que estiver segurando. Talvez seja necessário fabricar uma ferramenta para extrair alguns blocos.{*B*}{*B*} -Se estiver segurando um item na mão, use {*CONTROLLER_ACTION_USE*}para utilizá-lo ou pressione {*CONTROLLER_ACTION_DROP*}para soltá-lo. +Use {*CONTROLLER_ACTION_LOOK*} para olhar à sua volta.{*B*}{*B*} +Use {*CONTROLLER_ACTION_MOVE*} para se mover.{*B*}{*B*} +Pressione {*CONTROLLER_ACTION_JUMP*} para pular.{*B*}{*B*} +Pressione {*CONTROLLER_ACTION_MOVE*} duas vezes para frente rapidamente para correr. Enquanto mantiver {*CONTROLLER_ACTION_MOVE*} pressionado para a frente, o personagem continuará correndo, a não ser que o tempo de corrida acabe ou que a Barra de Alimentos tenha menos de {*ICON_SHANK_03*}.{*B*}{*B*} +Mantenha {*CONTROLLER_ACTION_ACTION*} pressionado para extrair e cortar usando a mão ou o que estiver segurando. Talvez seja necessário fabricar uma ferramenta para extrair alguns blocos.{*B*}{*B*} +Se estiver segurando um item na mão, use {*CONTROLLER_ACTION_USE*} para utilizá-lo ou pressione {*CONTROLLER_ACTION_DROP*} para soltá-lo. {*T3*}COMO JOGAR: HUD{*ETW*}{*B*}{*B*} O HUD mostra informações sobre seu status; sua energia, o oxigênio restante quando está debaixo da água, seu nível de fome (é preciso comer para reabastecer) e sua armadura, se estiver usando uma. Se você perder energia, mas tiver uma barrra de alimentos com 9 ou mais {*ICON_SHANK_01*}, sua energia será reabastecida automaticamente. Comer reabastece sua barra de alimentos. {*B*} A Barra de Experiência também é mostrada aqui, com um valor numérico que mostra seu Nível de Experiência e a barra que indica quantos Pontos de Experiência são necessários para aumentar seu Nível de Experiência. Você ganha Pontos de Experiência coletando as Esferas de Experiência liberadas por multidões quando elas morrem, ao minerar alguns tipos de blocos, ao criar animais, pescar e fundir minérios na fornalha.{*B*}{*B*} -Também mostra os itens disponíveis para uso. Use {*CONTROLLER_ACTION_LEFT_SCROLL*}e {*CONTROLLER_ACTION_RIGHT_SCROLL*}para trocar o item em sua mão. +Também mostra os itens disponíveis para uso. Use {*CONTROLLER_ACTION_LEFT_SCROLL*} e {*CONTROLLER_ACTION_RIGHT_SCROLL*} para trocar o item em sua mão. {*T3*}COMO JOGAR: INVENTÃRIO{*ETW*}{*B*}{*B*} -Use {*CONTROLLER_ACTION_INVENTORY*}para ver seu inventário.{*B*}{*B*} +Use {*CONTROLLER_ACTION_INVENTORY*} para ver seu inventário.{*B*}{*B*} Essa tela mostra os itens disponíveis para uso em sua mão e todos os outros itens que está carregando. Sua armadura também é mostrada aqui.{*B*}{*B*} -Use{*CONTROLLER_MENU_NAVIGATE*}para mover o ponteiro. Use {*CONTROLLER_VK_A*}para pegar um item sob o ponteiro. Se houver mais de um item aqui, ele pegará todos ou você pode usar {*CONTROLLER_VK_X*}para pegar apenas metade deles.{*B*}{*B*} -Mova o item com o ponteiro sobre outro espaço no inventário e coloque-o lá usando {*CONTROLLER_VK_A*}. Se tiver vários itens no ponteiro, use {*CONTROLLER_VK_A*}para colocar todos ou {*CONTROLLER_VK_X*}para colocar apenas um.{*B*}{*B*} -Se o item sobre o qual você estiver for uma armadura, aparecerá uma dica de ferramenta para permitir a movimentação rápida para o espaço da armadura à direita no inventário. -É possível mudar a cor da sua Armadura de Couro, tingindo-a. Faça isso no menu do estoque, segurando a tinta com o cursor, e em seguida apertando{*CONTROLLER_VK_X*} enquanto o cursor estiver sobre a peça que deseja tingir. - +Use{*CONTROLLER_MENU_NAVIGATE*} para mover o ponteiro. Use {*CONTROLLER_VK_A*} para pegar um item sob o ponteiro. Se houver mais de um item aqui, ele pegará todos ou você pode usar {*CONTROLLER_VK_X*} para pegar apenas metade deles.{*B*}{*B*} +Mova o item com o ponteiro sobre outro espaço no inventário e coloque-o lá usando {*CONTROLLER_VK_A*}. Se tiver vários itens no ponteiro, use {*CONTROLLER_VK_A*} para colocar todos ou {*CONTROLLER_VK_X*} para colocar apenas um.{*B*}{*B*} +Se o item sobre o qual você estiver for uma armadura, aparecerá uma dica de ferramenta para permitir a movimentação rápida para o espaço da armadura à direita no inventário.{*B*}{*B*} +É possível mudar a cor da sua Armadura de Couro, tingindo-a. Faça isso no menu do estoque, segurando a tinta com o cursor, e em seguida apertando {*CONTROLLER_VK_X*} enquanto o cursor estiver sobre a peça que deseja tingir. + {*T3*}COMO JOGAR: BAÚ{*ETW*}{*B*}{*B*} -Depois de criar um baú, poderá colocá-lo no mundo e usá-lo com{*CONTROLLER_ACTION_USE*} para guardar itens do seu inventário.{*B*}{*B*} +Depois de criar um baú, poderá colocá-lo no mundo e usá-lo com {*CONTROLLER_ACTION_USE*} para guardar itens do seu inventário.{*B*}{*B*} Use o ponteiro para mover itens entre o inventário e o baú.{*B*}{*B*} Os itens no baú ficarão guardados lá para você até devolvê-los ao inventário mais tarde. @@ -180,20 +180,20 @@ Dois baús colocados lado a lado serão combinados para formar um Baú Grande. E {*T3*}COMO JOGAR: FABRICAÇÃO{*ETW*}{*B*}{*B*} -Na interface de fabricação, você pode combinar itens do seu inventário para criar novos tipos de itens. Use{*CONTROLLER_ACTION_CRAFTING*}para abrir a interface de fabricação.{*B*}{*B*} -Role pelas guias na parte superior usando{*CONTROLLER_VK_LB*}e{*CONTROLLER_VK_RB*}para selecionar o tipo de item que deseja criar e, em seguida, use {*CONTROLLER_MENU_NAVIGATE*}para selecionar o item a ser criado.{*B*}{*B*} -A área de fabricação mostra os itens necessários para criar o novo item. Pressione {*CONTROLLER_VK_A*}para criar o item e colocá-lo no inventário. +Na interface de fabricação, você pode combinar itens do seu inventário para criar novos tipos de itens. Use {*CONTROLLER_ACTION_CRAFTING*} para abrir a interface de fabricação.{*B*}{*B*} +Role pelas guias na parte superior usando {*CONTROLLER_VK_LB*} e {*CONTROLLER_VK_RB*} para selecionar o tipo de item que deseja criar e, em seguida, use {*CONTROLLER_MENU_NAVIGATE*} para selecionar o item a ser criado.{*B*}{*B*} +A área de fabricação mostra os itens necessários para criar o novo item. Pressione {*CONTROLLER_VK_A*} para criar o item e colocá-lo no inventário. {*T3*}COMO JOGAR: BANCADA{*ETW*}{*B*}{*B*} Você pode criar itens maiores usando uma bancada.{*B*}{*B*} -Coloque a bancada no mundo e pressione{*CONTROLLER_ACTION_USE*} para usá-la.{*B*}{*B*} +Coloque a bancada no mundo e pressione {*CONTROLLER_ACTION_USE*} para usá-la.{*B*}{*B*} A fabricação de itens na bancada funciona da mesma maneira que a fabricação básica, mas você terá uma área maior para trabalhar e uma variedade maior de itens para criar. {*T3*}COMO JOGAR: FORNALHA{*ETW*}{*B*}{*B*} Com a fornalha você pode alterar os itens queimando-os. Por exemplo, você pode transformar minério de ferro em barras de ferro na fornalha.{*B*}{*B*} -Coloque a fornalha no mundo e pressione{*CONTROLLER_ACTION_USE*} para usá-la.{*B*}{*B*} +Coloque a fornalha no mundo e pressione {*CONTROLLER_ACTION_USE*} para usá-la.{*B*}{*B*} Você deve colocar combustível sob a fornalha e o item a ser queimado na parte superior. A fornalha acenderá e começará a funcionar.{*B*}{*B*} Quando os itens estiverem queimados, você poderá movê-los da área de saída para seu inventário.{*B*}{*B*} Se o item que você estiver examinando for um ingrediente ou combustível para a fornalha, aparecerão dicas de ferramenta para permitir a movimentação rápida para a fornalha. @@ -201,7 +201,7 @@ Se o item que você estiver examinando for um ingrediente ou combustível para a {*T3*}COMO JOGAR: DISTRIBUIDOR{*ETW*}{*B*}{*B*} O distribuidor é usado para projetar itens. Você deve colocar um acionador, como uma alavanca, ao lado do distribuidor para acioná-lo.{*B*}{*B*} -Para encher o distribuidor com itens, pressione{*CONTROLLER_ACTION_USE*} e mova os itens desejados do inventário para ele.{*B*}{*B*} +Para encher o distribuidor com itens, pressione {*CONTROLLER_ACTION_USE*} e mova os itens desejados do inventário para ele.{*B*}{*B*} Então, quando usar o acionador, o distribuidor projetará um item. @@ -229,11 +229,11 @@ Você deve experimentar todas as combinações de ingredientes para descobrir to {*T3*}INSTRUÇÕES DE JOGO: FEITIÇOS{*ETW*}{*B*}{*B*} Os Pontos de Experiência recolhidos quando um habitante morre ou quando certos blocos são extraídos ou fundidos numa fornalha podem ser usados para enfeitiçar algumas ferramentas, armaduras e livros.{*B*} -Quando é colocada uma Espada, Arco, Machado, Picareta, Pá, Armadura ou Livro no orifício por baixo do livro na Mesa de Feitiços, os três botões à direita do orifício apresentam alguns feitiços e os respectivos custos em Níveis de Experiência.{*B*} +Quando é colocada uma Espada, Arco, Machado, Picareta, Pá, Armadura ou Livro no orifício por baixo do livro na Mesa de Feitiços, os três botões à direita do orifício apresentam alguns feitiços e os respectivos custos em Níveis de Experiência.{*B*} Se você não tem Níveis de Experiência suficientes para usar, o custo aparecerá em vermelho, caso contrário, verde.{*B*}{*B*} O feitiço aplicado é selecionado aleatoriamente com base no custo apresentado.{*B*}{*B*} Se a Mesa de Feitiços estiver rodeada de Estantes (até um máximo de 15 Estantes), com um bloco de intervalo entre a Estante e a Mesa de Feitiços, o poder dos feitiços irá aumentar e serão vistos glifos misteriosos saindo do livro na Mesa de Feitiços.{*B*}{*B*} -Todos os ingredientes para uma Mesa de Feitiços podem ser encontrados nas aldeias, extraindo nas minas ou cultivando no mundo.{*B*}{*B} +Todos os ingredientes para uma Mesa de Feitiços podem ser encontrados nas aldeias, extraindo nas minas ou cultivando no mundo.{*B*}{*B*} Os Livros Encantados são usados na Bigorna para aplicar feitiços aos itens. Desta forma você tem maior controle sobre os feitiços que deseja em seus itens.{*B*} @@ -257,28 +257,28 @@ Exemplos de construção de portais são mostrados na figura à direita. {*T3*}COMO JOGAR: MULTIJOGADOR{*ETW*}{*B*}{*B*} O Minecraft no console Xbox 360 é um jogo multijogador por padrão. Se você estiver jogando em um modo de Alta Definição, poderá incluir outros jogadores conectando os controles e pressionando START em qualquer ponto durante o jogo.{*B*}{*B*} -Ao iniciar ou participar de um jogo online, ele estará visível para as pessoas de sua lista de amigos (a não ser que você tenha selecionado Só Convidados como host do jogo) e, se eles entrarem no jogo, também estará visível para as pessoas da lista de amigos deles (se você tiver selecionado a opção Permitir Amigos dos Amigos). +Ao iniciar ou participar de um jogo online, ele estará visível para as pessoas de sua lista de amigos (a não ser que você tenha selecionado Só Convidados como host do jogo) e, se eles entrarem no jogo, também estará visível para as pessoas da lista de amigos deles (se você tiver selecionado a opção Permitir Amigos dos Amigos).{*B*} Quando estiver em um jogo, você poderá pressionar o botão BACK para ver a lista de todos os outros jogadores, ver os Cartões de Jogador deles, expulsar jogadores do jogo e convidar outras pessoas. {*T3*}COMO JOGAR: COMPARTILHANDO CAPTURAS DE TELA{*ETW*}{*B*}{*B*} -Você pode capturar uma tela de seu jogo abrindo o menu Pausar e pressionando{*CONTROLLER_VK_Y*} para compartilhar no Facebook. Você verá uma versão em miniatura da captura de tela e poderá editar o texto associado à postagem no Facebook.{*B*}{*B*} -Há um modo de câmera especial para essas capturas de tela, para que você possa ver a frente do seu personagem na captura: pressione {*CONTROLLER_ACTION_CAMERA*}até ter uma visão frontal do personagem antes de pressionar {*CONTROLLER_VK_Y*}para compartilhar.{*B*}{*B*} +Você pode capturar uma tela de seu jogo abrindo o menu Pausar e pressionando {*CONTROLLER_VK_Y*} para compartilhar no Facebook. Você verá uma versão em miniatura da captura de tela e poderá editar o texto associado à postagem no Facebook.{*B*}{*B*} +Há um modo de câmera especial para essas capturas de tela, para que você possa ver a frente do seu personagem na captura: pressione {*CONTROLLER_ACTION_CAMERA*} até ter uma visão frontal do personagem antes de pressionar {*CONTROLLER_VK_Y*} para compartilhar.{*B*}{*B*} Gamertags não serão exibidas na captura de tela. {*T3*}COMO JOGAR: BANINDO NÃVEIS{*ETW*}{*B*}{*B*} Se você encontrar conteúdo ofensivo em um nível em que estiver jogando, poderá optar por adicioná-lo à sua lista de Níveis Banidos. -Para isso, abra o menu Pausar e pressione {*CONTROLLER_VK_RB*}para selecionar a dica de ferramenta de Banir Nível. +Para isso, abra o menu Pausar e pressione {*CONTROLLER_VK_RB*} para selecionar a dica de ferramenta de Banir Nível. Se você tentar entrar nesse nível no futuro, será notificado de que ele está em sua lista de Níveis Banidos e poderá removê-lo da lista e continuar no nível ou sair. {*T3*}COMO JOGAR: MODO CRIATIVO{*ETW*}{*B*}{*B*} A interface do modo criativo permite que qualquer item do jogo seja movido para o inventário do jogador sem precisar minerar ou fabricar aquele item. Os itens no inventário do jogador não serão removidos quando forem colocados ou usados no mundo, e desta forma o jogador pode se concentrar na construção, em vez de coletar recursos.{*B*} Se você criar, carregar ou salvar um mundo no Modo Criativo, as atualizações de conquistas e de placar de líderes estarão desabilitadas nesse mundo, mesmo que ele seja carregado depois no Modo Sobrevivência.{*B*} -Para voar quando estiver no Modo Criativo, pressione {*CONTROLLER_ACTION_JUMP*}duas vezes rapidamente. Para parar de voar, repita a ação. Para voar mais rápido, pressione {*CONTROLLER_ACTION_MOVE*}rapidamente duas vezes para frente enquanto estiver voando. -No modo de voo, você pode manter pressionado {*CONTROLLER_ACTION_JUMP*}para se mover para cima e {*CONTROLLER_ACTION_SNEAK*}para se mover para baixo ou usar {*CONTROLLER_ACTION_DPAD_UP*}para se mover para cima, {*CONTROLLER_ACTION_DPAD_DOWN*}para se mover para baixo, -{*CONTROLLER_ACTION_DPAD_LEFT*}para se mover para a esquerda e {*CONTROLLER_ACTION_DPAD_RIGHT*}para se mover para a direita. +Para voar quando estiver no Modo Criativo, pressione {*CONTROLLER_ACTION_JUMP*} duas vezes rapidamente. Para parar de voar, repita a ação. Para voar mais rápido, pressione {*CONTROLLER_ACTION_MOVE*} rapidamente duas vezes para frente enquanto estiver voando. +No modo de voo, você pode manter pressionado {*CONTROLLER_ACTION_JUMP*} para se mover para cima e {*CONTROLLER_ACTION_SNEAK*} para se mover para baixo ou usar {*CONTROLLER_ACTION_DPAD_UP*} para se mover para cima, {*CONTROLLER_ACTION_DPAD_DOWN*} para se mover para baixo, +{*CONTROLLER_ACTION_DPAD_LEFT*} para se mover para a esquerda e {*CONTROLLER_ACTION_DPAD_RIGHT*} para se mover para a direita. {*T3*}COMO JOGAR: OPÇÕES DE HOST E JOGADOR{*ETW*}{*B*}{*B*} @@ -300,6 +300,27 @@ Ao carregar ou criar um mundo, você pode pressionar o botão "Mais Opções" pa {*T2*}Privilégios do Host{*ETW*}{*B*} Quando habilitado, o host pode ativar ou desativar no menu do jogo sua habilidade de voar, desativar a exaustão e ficar invisível. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + {*T2*}Ciclo do dia{*ETW*}{*B*} + Quando desativado, a hora do dia não muda.{*B*}{*B*} + + {*T2*}Manter inventário{*ETW*}{*B*} + Quando ativada, jogadores vão manter o inventário ao morrer.{*B*}{*B*} + + {*T2*}Surgimento de criaturas{*ETW*}{*B*} + Quando desativado, criaturas não aparecerão naturalmente.{*B*}{*B*} + + {*T2*}Assédio por criaturas{*ETW*}{*B*} + Quando desativado,impede monstros e animais de mudar blocos (por exemplo, explosões de Creepers não destróem blocos e ovelhas não removem grama) ou pegar itens.{*B*}{*B*} + + {*T2*}Itens de criaturas{*ETW*}{*B*} + Quando desativado, monstros e animais não derrubam itens (por exemplo, Creepers não derrubam pólvora).{*B*}{*B*} + + {*T2*}Itens de blocos{*ETW*}{*B*} + Quando desativado, blocos não derrubam itens ao serem destruídos (por exemplo, blocos de pedra não derrubam paralelepípedos).{*B*}{*B*} + + {*T2*}Regeneração natural{*ETW*}{*B*} + Quando desativada, jogadores não regeneram vida naturalmente.{*B*}{*B*} + {*T1*}Opções de Geração de Mundo{*ETW*}{*B*} Ao criar um novo mundo, há algumas opções adicionais.{*B*}{*B*} @@ -316,7 +337,7 @@ Ao criar um novo mundo, há algumas opções adicionais.{*B*}{*B*} Quando ativado, o Submundo é recriado. É útil quando se tem um jogo salvo mais antigo em que as Fortalezas do Submundo não estavam presentes.{*B*}{*B*} {*T1*}Opções no Jogo{*ETW*}{*B*} - Durante o jogo, várias opções podem ser acessadas pressionando BACK para abrir o menu do jogo.{*B*}{*B*} + Durante o jogo, várias opções podem ser acessadas pressionando {*BACK_BUTTON*} para abrir o menu do jogo.{*B*}{*B*} {*T2*}Opções do Host{*ETW*}{*B*} O jogador host e os jogadores definidos como moderadores podem acessar o menu "Opção do Host". Neste menu, eles podem habilitar e desabilitar as opções Fogo Espalha e TNT Explode.{*B*}{*B*} @@ -325,13 +346,13 @@ Ao criar um novo mundo, há algumas opções adicionais.{*B*}{*B*} Para modificar os privilégios de um jogador, selecione o nome dele e pressione {*CONTROLLER_VK_A*} para abrir o menu privilégios do jogador, onde você poderá usar as opções a seguir.{*B*}{*B*} {*T2*}Pode Construir e Minerar{*ETW*}{*B*} - Esta opção só está disponível quando "Confiar nos Jogadores" está ativado. Quando esta opção está habilitada, o jogador pode interagir com o mundo normalmente. Quando está desativada, o jogador não pode colocar nem destruir blocos, nem interagir com muitos itens e blocos.{*B*}{*B*} + Esta opção só está disponível quando "Confiar nos Jogadores" está desativada. Quando esta opção está habilitada, o jogador pode interagir com o mundo normalmente. Quando está desativada, o jogador não pode colocar nem destruir blocos, nem interagir com muitos itens e blocos.{*B*}{*B*} {*T2*}Pode utilizar portas e interruptores{*ETW*}{*B*} Esta opção só está disponível quando “Confiar nos Jogadores†está desativada. Quando esta opção estiver desabilitada, o jogador não poderá utilizar portas e interruptores.{*B*}{*B*} - {*T2*}Pode abrir containers{*ETW*}{*B*} - Esta opção só está disponível quando “Confiar nos Jogadores†está desativada. Quando esta opção estiver desabilitada, o jogador não poderá abrir containers, tais como baús.{*B*}{*B*} + {*T2*}Pode abrir recipientes{*ETW*}{*B*} + Esta opção só está disponível quando “Confiar nos Jogadores†está desativada. Quando esta opção estiver desabilitada, o jogador não poderá abrir recipientes, tais como baús.{*B*}{*B*} {*T2*}Pode Atacar Jogadores{*ETW*}{*B*} Esta opção só está disponível quando "Confiar nos Jogadores" está desativado. Quando esta opção estiver desabilitada o jogador não poderá causar danos a outros jogadores.{*B*}{*B*} @@ -343,7 +364,7 @@ Para modificar os privilégios de um jogador, selecione o nome dele e pressione Quando esta opção está habilitada, o jogador pode usar algumas das opções do menu do jogo para mudar privilégios de outros jogadores e algumas opções de mundo.{*B*}{*B*} {*T2*}Expulsar Jogador{*ETW*}{*B*} - Para os jogadores que não estão no mesmo console {*PLATFORM_NAME*} que o jogador host, selecionar esta opção faz o jogador e todos os jogadores que estiverem no console {*PLATFORM_NAME*} dele serem expulsos do jogo. Este jogador não poderá voltar ao jogo até que ele seja reiniciado.{*B*}{*B*} + {*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} {*T1*}Opções do Jogador Host{*ETW*}{*B*} Se "Privilégios do Host" estiver habilitado, o jogador host poderá modificar alguns privilégios para si mesmo. Para modificar os privilégios de um jogador, selecione o nome dele e pressione {*CONTROLLER_VK_A*} para abrir o menu privilégios do jogador, onde você pode usar as opções a seguir.{*B*}{*B*} @@ -353,14 +374,16 @@ Se "Privilégios do Host" estiver habilitado, o jogador host poderá modificar a {*T2*}Desabilitar Exaustão{*ETW*}{*B*} Esta opção só afeta o modo de Sobrevivência. Quando habilitado, as atividades físicas (voar/correr/pular etc.) não diminuem a barra de alimentos. Entretanto, se o jogador estiver ferido, a barra de alimentos diminuirá lentamente enquanto ele estiver se curando.{*B*}{*B*} - + {*T2*}Invisível{*ETW*}{*B*} Quando esta opção está habilitada, o jogador não está visível para outros jogadores e é invulnerável.{*B*}{*B*} - - {*T2*}É possível Teleportar{*ETW*}{*B*} + + {*T2*}É possível Teleportar{*ETW*}{*B*} Isto permite que o jogador mova a si mesmo ou outros jogadores para outros jogadores no mundo. +Para jogadores que não estão no mesmo console {*PLATFORM_NAME*} que o host, selecionar esta opção vai expulsá-los junto com qualquer jogador conectado em seu console {*PLATFORM_NAME*}. Este jogador não poderá se juntar novamente ao jogo até que seja reiniciado. + Próxima Página Página Anterior @@ -424,56 +447,93 @@ portanto, poderão facilmente se juntar a você. O Que Há de Novo - -{*T3*}Alterações e adições {*ETW*}{*B*}{*B*} -- Novos itens adicionados -Esmeralda, Minério de Esmeralda, Bloco de Esmeralda, Baú Ender, Gancho Disparador, Maçã Dourada Encantada, Bigorna, Vaso de Flor, Parede de Paralelepípedos, Paredes de Parelelepípedos com Musgo, Pintura Podre, Batata, Batata Cozida, Batata Venenosa, Cenoura, Cenoura Dourada, Cenoura na Vareta, Torta de Abóbora, Poção de Visão Noturna, Poção da Invisibilidade, Quartzo, Minério de Quartzo, Bloco de Quartzo, Laje de Quartzo, Escada de Quartzo, Bloco de Quartzo Cinzelado, Coluna de Bloco de Quartzo, Livro Encantado, Tapete.{*B*} -- Novos recipientes adicionados para arenito macio e arenito cinzelado.{*B*} -- Nova multidão adicionada - Aldeões zumbis.{*B*} -- Adicionados novos recursos de geração de terreno - Templos do Deserto, Aldeias Desertas, Templos de Selva.{*B*} -- Adicionado o comércio com aldeões.{*B*} -- Adicionada interface de bigorna.{*B*} -- Armadura de couro tingido.{*B*} -- Colar de lobo tingido.{*B*} -- Montaria no porco com uma cenoura na vareta.{*B*} -- Bônus de baú melhorado contendo mais itens.{*B*} -- Alteradas as posições de meio blocos e outros blocos em meio blocos.{*B*} -- Alteradas as posições de escadas invertidas e lajes.{*B*} -- Adicionadas profissões de cidadões.{*B*} -- Cidadãos vindos de ovos terão uma profissão aleatória.{*B*} -- Adicionado log unilateral.{*B*} -- Fornos podem usar ferramentas de madeira como combustível.{*B*} -- Painéis de gelo e vidro podem ser coletados com pequenos toques de ferramentas encantadas.{*B*} -- Botões de madeira e pratos de pressão de madeira podem ser ativados com flechas.{*B*} -- Pequenas multidões podem aparecer em portais no submundo.{*B*} -- Rastejantes e aranhas são agressivos com o último jogador que acertá-los.{*B*} -- Multidões no modo criativo ficam neutras novamente depois de um curto período.{*B*} -- Contra-ataque removido quando afogar.{*B*} -- Portas sendo quebradas por zumbis mostram danos.{*B*} -- Gelo derrete no submundo.{*B*} -- Calderões enchem quando estiver sem chuva.{*B*} -- Pistões levam o dobro de tempo para melhorar.{*B*} -- O Porco derruba a cela ao ser morto (se tiver uma).{*B*} -- Cor do céu No Fim alterada.{*B*} -- Barbante pode ser substituído (por corda).{*B*} -- Chuva pinga das folhas.{*B*} -- Alavancas podem ser colocadas em baixo dos blocos.{*B*} -- TNT causa dano variável dependendo da configuração de dificuldade.{*B*} -- Livro de receitas alterado.{*B*} -- Barcos quebram lírios, ao invés de lírios quebrarem barcos.{*B*} -- Porcos oferecem mais costeletas.{*B*} -- Lodos aparecem menos em mundos retos.{*B*} -- Rastejadores têm danos variáveis baseado na configuração de dificuldade, mais contra-ataque.{*B*} -- Endermen consertados para não abrir suas mandíbulas.{*B*} -- Adicionado teleporte de jogadores (usando o menu {*BACK_BUTTON*} no jogo).{*B*} --Adicionados novas opções de vôo, invisibilidade e invulnerabilidade para jogadores remotos.{*B*} -- Adicionados novos tutoriais para o Mundo do Tutorial para novos itens e recursos.{*B*} -- Melhorada a posição para o baú de discos musicais no Mundo do Tutorial.{*B*} +{*T3*}Alterações e adições{*ETW*}{*B*}{*B*} +- Novos itens adicionados - Argila endurecida, Argila colorida, Bloco de carvão, fardo de feno, trilho ativador, bloco de redstone, sensor de luz solar, monólito, tremonha, carrinho com tremonha, carrinho com TNT, comparador Redstone, placa de pressão ponderada, farol, baú preso, foguete de artifício, estrela de artifício, estrela do submundo, chumbo, armadura para cavalo, crachá, ovo de surgimento de cavalos{*B*} +- Novas criaturas adicionadas - Wither, esqueletos murchos, bruxas, morcegos, cavalos, burros e mulas{*B*} +- Adicionados novos recursos de geração de terreno - cabanas de bruxas.{*B*} +- Adicionada interface de farol.{*B*} +- Adicionada interface de cavalo.{*B*} +- Adicionada interface de tremonha.{*B*} +- Adicionados fogos de artifício - A interface dos fogos de artifício pode ser acessada na bancada quando tem os ingredientes para fazer uma estrela ou foguete de artifício.{*B*} +- Adicionado 'modo de aventura' - Você só pode quebrar blocos com as ferramentas corretas.{*B*} +- Adicionados muitos sons novos.{*B*} +- Criaturas, itens e projéteis agora podem passar pelos portais.{*B*} +- Repetidores agora podem ser trancados alimentando suas laterais com outro repetidor.{*B*} +- Agora zumbis e esqueletos podem surgir com armas e armaduras diferentes.{*B*} +- Novas mensagens de morte.{*B*} +- Nomeie criaturas com um crachá, e renomeie recipientes para mudar o título quando o menu está aberto.{*B*} +- Farelo de osso não mais faz tudo crescer imediatamente, agora cresce aleatoriamente em estágios.{*B*} +- Um sinal de redstone descrevendo o conteúdo de baús, barracas de poções, distribuidores e jukeboxes podem ser detectados colocando um comparador redstone diretamente contra eles.{*B*} +- Distribuidores podem ser colocados em qualquer direção.{*B*} +- Comer uma maçã dourada dá ao jogador vida "de absorção" extra por um curto período.{*B*} +- Quanto mais você fica em uma área, mais difíceis são as criaturas que surgem naquela área.{*B*} + +{*ETB*}Bem-vindo(a) de volta! Talvez você não tenha notado que o seu Minecraft foi atualizado.{*B*}{*B*} +Há muitos recursos novos para você e seus amigos experimentarem, aqui estão apenas alguns destaques. Dê uma lida e divirta-se!{*B*}{*B*} +\{*T1*}Novos itens{*ETB*} - Argila endurecida, argila colorida, bloco de carvão, fardo de feno, trilho ativador, bloco de redstone, sensor de luz do dia, distribuidor, tremonha, carrinho com tremonha, carrinho com TNT, comparador redstone, placa de pressão ponderada, farol, baú preso, estrela e foguete de artifício, estrela do Submundo, chumbo, armadura de cavalos, crachá, ovo de surgimento de cavalos{*B*}{*B*} +{*T1*}Novas criaturas{*ETB*} - Wither, esqueletos murchos, bruxas, morcegos, cavalos, burros e mulas{*B*}{*B*} +{*T1*}Novos recursos{*ETB*} - Dome e cavalgue um cavalo, faça fogos de artifício e dê um show, nomeie animais e monstros com um crachá, crie circuitos redstone mais avançados, e novas opções de anfitrião para ajudar a controlar o que os convidados podem fazer no seu mundo!{*B*}{*B*} +{*T1*}Novo mundo tutorial{*ETB*} – Aprenda a usar os recursos novos e velhos no mundo tutorial. Veja se consegue encontrar todos os discos de música secretos escondidos no mundo!{*B*}{*B*} -{*ETB*}Bem-vindo de volta! Talvez você não tenha notado que o seu Minecraft foi atualizado.{*B*}{*B*} -Há muitos recursos novos para você e seus amigos experimentarem, aqui estão apenas alguns destaques. Dê uma lida e divirta-se!{*B*}{*B*} -{*T1*}Novos itens{*ETB*} - Esmeralda, Minério de Esmeralda, Bloco de Esmeralda, Baú Ender, Gancho Disparador, Maçã Dourada Encantada, Bigorna, Vaso de Flor, Parede de Paralelepípedos, Paredes de Parelelepípedos com Musgo, Pintura Podre, Batata, Batata Cozida, Batata Venenosa, Cenoura, Cenoura Dourada, Cenoura na Vareta, Torta de Abóbora, Poção de Visão Noturna, Poção da Invisibilidade, Quartzo, Minério de Quartzo, Bloco de Quartzo, Laje de Quartzo, Escada de Quartzo, Bloco de Quartzo Cinzelado, Coluna de Bloco de Quartzo, Livro Encantado, Tapete{*B*}{*B*} -{*T1*}Novas multidões{*ETB*} - Aldeões zumbis.{*B*}{*B*}\r\n{*T1*}Novos recursos{*ETB*} - Comércio com aldeões, consertar ou encantar armas e ferramentas com uma Bigorna, armazenar itens em um Baú Ender, controle de um porco enquanto o monta usando uma cenoura na vareta!{*B*}{*B*}\r\n{*T1*}Novos Mini-tutoriais{*ETB*} – Saiba como usar os novos recursos no Tutorial do Mundo!{*B*}{*B*}\r\n{*T1*}Novos "Ovos de Páscoa"{*ETB*} – Movemos todos os Discos de música secretos no Mundo do Tutorial. Veja se consegue encontrá-los novamente!{*B*}{*B*}\r\n +Cavalos + +{*T3*}COMO JOGAR: CAVALOS{*ETW*}{*B*}{*B*} +Cavalos e burros são encontrados principalmente em planícies. Mulas são o fruto de um burro e um cavalo, mas são estéreis.{*B*} +Todos os cavalos, burros e mulas adultos são animais de montaria. No entanto, apenas os cavalos podem usar armadura, ao passo que só as mulas e os burros podem portar alforjes para transportar itens.{*B*}{*B*} +Cavalos, burros e mulas devem ser domesticados antes que possam ser usados. Para domesticar um cavalo, basta tentar montá-lo e permanecer montado enquanto ele tenta arremessar o montador.{*B*} +Quando aparecem coraçõezinhos em volta do cavalo, ele terá sido domesticado e não tentará mais se livrar do(a) jogador(a). Para guiar um cavalo, o jogador deve equipar uma sela sobre o animal.{*B*}{*B*} +As selas podem ser compradas de aldeões ou encontradas dentro de Baús no mundo.{*B*} +Você pode equipar alforjes em burros e mulas domesticados ao amarrar um Baú. Esses alforjes podem, então, ser acessados enquanto você monta ou se esgueira.{*B*}{*B*} +Cavalos e burros (mas não mulas) podem ser criados como os outros animais utilizando-se Maçãs Douradas ou Cenouras Douradas.{*B*} +Potros se tornarão cavalos adultos com o tempo, embora alimentá-los com Trigo ou Feno acelere o processo.{*B*} + + +Faróis + +{*T3*}COMO JOGAR: FARÓIS{*ETW*}{*B*}{*B*} +Faróis ativos projetam um feixe de luz clara no céu e concedem poderes aos jogadores próximos.{*B*} +Eles podem ser produzidos com Vidro, Obsidiana e Estrelas do Submundo, obtidas ao derrotar-se o Wither.{*B*}{*B*} +Os faróis devem ser posicionados de forma a receberem luz solar durante o dia. Eles devem ser colocados em pirâmides de ferro, ouro, esmeralda ou diamante.{*B*} +O material sobre o qual é posicionado não afeta o poder do farol.{*B*}{*B*} +No menu do Farol, você pode selecionar o poder principal deste farol. Quanto mais níveis sua pirâmide tiver, maior será o número de opções de poderes disponível para escolha.{*B*} +Um farol em uma pirâmide com pelo menos quatro níveis também concede a opção de Regenerar o segundo poder ou aumentar o poder do primeiro.{*B*}{*B*} +Para definir os poderes do seu farol, sacrifique uma esmeralda, um diamante, um ouro ou um lingote de ferro no espaço de pagamento.{*B*} +Quando tudo estiver montado, os poderes emanarão do farol indefinidamente.{*B*} + + +Fogos de artifício + +{*T3*}COMO JOGAR : FOGOS DE ARTIFÃCIO{*ETW*}{*B*}{*B*} +Fogos de artifício são itens decorativos que podem ser lançaodos à mão ou de distribuidores. Eles são criados usando papel, pólvora e opcionalmente um número de estrelas de artifício.{*B*} +As cores, desvanecimento, forma, tamanho e efeitos (como trilhas e brilho) das estrelas de artifício podem ser customizados incluindo ingredientes adicionais na criação.{*B*}{*B*} +Para criar um fogo de artifício coloque pólvora e papel na grade de criação 3x3 que é mostrada acima do seu inventário.{*B*} +Opcionalmente, você pode colocar várias estrelas de artifício na grade de criação para adicioná-los ao fogo de artifício.{*B*} +Encher mais vagas na grade de criação com pólvora aumenta a altura na qual as estrelas de artifício explodem.{*B*}{*B*} +Depois você pode tirar o fogo de artifício do espaço de resultado.{*B*}{*B*} +Estrelas de artifício podem ser criadas colocando pólvora e corante na grade de criação.{*B*} + - O corante ajusta a cor da explosão da estrela de artifício.{*B*} + - A forma da estrela de artifício é configurada adicionando uma carga de fogo, barra de ouro, pena ou cabeça de criatura.{*B*} + - Uma trilha ou um brilho podem ser adicionados usando diamantes ou pó de glowstone.{*B*}{*B*} +Depois que uma estrela de fogos de artifício foi criada, você pode ajustar a cor de desvanecimento da estrela de artifício combinando-a com um corante. + + +Tremonhas + +{*T3*}COMO JOGAR: TREMONHAS{*ETW*}{*B*}{*B*} +Tremonhas são usadas para inserir ou remover itens de recipientes e para pegar automaticamente os itens lançados dentro delas.{*B*} +Elas afetam Barraca de Poções, Baús, Distribuidor, Monólitos, Carrinhos com Baús, Carrinhos com Tremonhas, assim como outras Tremonhas.{*B*}{*B*} +Tremonhas farão tentativas contínuas de sugar os itens de recipientes convenientes que estejam acima delas. Além disso, também tentarão inserir itens depositados em um recipiente de saída.{*B*} +Se uma Tremonha for movida a Redstone, ela se tornará inativa e deixará de sugar e inserir itens.{*B*}{*B*} +Uma Tremonha aponta na direção que tenta retirar os itens. Para fazer uma Tremonha apontar para um bloco específico, coloque-a em frente a este bloco enquanto se esgueira.{*B*} + + +Monólitos + +{*T3*}COMO JOGAR : MONÓLITOS{*ETW*}{*B*}{*B*} +Quando alimentado com um sinal de Redstone, monólitos derrubam aleatoriamente um dos itens armazenados. Use {*CONTROLLER_ACTION_USE*} para abrir o monólito e então carregá-lo com itens do seu inventário.{*B*} +Se o monólito estiver de frente para um baú ou outro tipo de recipiente, o item será colocado ali ao invés de cair no chão. Longas correntes de monólitos podem ser construídos para carregar itens. Para que isso funcione, eles devem ser ativados e desativados alternadamente. + Causa mais danos que à mão. @@ -600,10 +660,36 @@ As cores da cama são sempre as mesmas, independentemente da cor da lã usada. Cria uma imagem da área explorada enquanto você o segura. Pode ser usado para encontrar caminhos. +Quando usado, vira um mapa da parte do mundo onde você está, sendo preenchido conforme você explora. + Permite ataques à distância usando flechas. Usada como munição para arcos. +Derrubados pelo Wither, utilizado na produção de Faróis. + +Quando ativado, cria explosões coloridas. Determina-se a cor, o efeito, o formato e o desvanecimento pela Estrela de Artifício usada na criação do Fogo de Artifício. + +Usado para determinar a cor, efeito e formato do Fogo de Artifício. + +Usados em circuito de Redstone para manter, comparar e subtrair a força do sinal ou para medir os estados de determinados blocos. + +Um tipo de Carrinho de Minas que funciona como um bloco de TNT móvel. + +É um bloco que produz um sinal Redstone derivado de luz do sol (ou a falta dela). + +Tipo especial de Carrinho de Minas que funciona de forma similar a uma Tremonha. Ele coletará os itens deixados nos trilhos e nos recipientes acima dele. + +Tipo especial de armadura que pode ser equipada em um cavalo. Oferece 5 de Armadura. + +Tipo especial de armadura que pode ser equipada em um cavalo. Oferece 7 de Armadura. + +Tipo especial de armadura que pode ser equipada em um cavalo. Oferece 11 de Armadura. + +Usado para amarrar criaturas ao jogador ou postes de cercas + +Usado para nomear criaturas no mundo. + Restaura 2,5{*ICON_SHANK_01*}. Restaura 1{*ICON_SHANK_01*}. Pode ser usado 6 vezes. @@ -655,7 +741,7 @@ Também pode ser usado para pouca iluminação. Quando ativado, acelera os carrinhos de minas que passam sobre ele. Quando desativado, faz os carrinhos pararem nele. -Funciona como uma chapa de pressão (envia um sinal Redstone quando ativado), mas só pode ser ativado por um carrinho de minas. +Funciona como uma chapa de pressão (envia um sinal Redstone quando ativado), mas só pode ser ativado por um Carrinho de Minas. Usado para transportar você, um animal ou um monstro sobre trilhos. @@ -928,100 +1014,158 @@ Também pode ser usado para pouca iluminação. As Cabeças de multidão podem ser colocadas como decoração, ou usadas como máscara na abertura do capacete. +Usado para executar comandos. + +Projeta um feixe de luz no céu e pode oferecer efeitos de status para os jogadores próximos. + +Armazena blocos e itens dentro. Coloque dois baús, lado a lado, para criar um baú maior com o dobro de capacidade. Além disso, o baú preso cria uma carga Redstone quando aberto. + +Oferece uma carga Redstone. A carga será mais forte se houver mais itens na chapa. + +Oferece uma carga Redstone. A carga será mais forte se houver mais itens na chapa. Exige mais peso que uma chapa leve. + +Usado como fonte de energia redstone. Redstones podem ser criadas a partir dele. + +Usado para capturar itens, transferi-los ou retirá-los de recipientes. + +Um tipo de corrimão que habilita ou desabilita Carrinhos de Minas com Tremonhas e aciona Carrinhos de Minas com TNT. + +Usado para segurar e derrubar itens ou empurrá-los em outros recipientes quando recebem carga Redstone. + +Blocos coloridos produzidos ao tingir-se a argila endurecida. + +Pode alimentar Cavalos, Burros e Mulas para curar até 10 Corações. Acelera o crescimento de potros. + +Criado ao cozinhar a argila no forno. + +Criado a partir de vidro e um corante. + +Criado a partir de um vitral + +Uma forma compacta de armazenar carvão. Pode ser usado como combustível em fornalhas. + Lula - + Solta sacos de tinta quando morta. - + Vaca - + Solta couro quando morta. Pode ser ordenhada com um balde. - + Ovelha - + Solta lã quando tosquiada (se já não tiver sido tosquiada). Pode ser tingida para produzir lã de cores diferentes. - + Galinha - + Solta penas quando morta e põe ovos aleatoriamente. - + Porco - + Solta costeletas quando morto. Pode ser montado usando uma sela. - + Lobo - + Dócil até ser atacado, quando atacará de volta. Pode ser domado usando ossos, o que faz o lobo segui-lo e atacar qualquer coisa que ataque você. - + Creeper - + Explode se você chegar muito perto! - + Esqueleto - + Dispara flechas em você. Solta flechas quando morto. - + Aranha - + Ataca quando você chega perto. Escala paredes. Solta fio quando morta. - + Zumbi - + Ataca quando você chega perto. - + Homem-porco zumbi - + Inicialmente dócil, mas ataca em grupos se você ataca um deles. - + Ghast - + Atira bolas de fogo em você, que explodem ao contato. - + Slime - + Divide-se em slimes menores quando atingido. - + Enderman - + Atacará se você olhar para ele. Também pode mover blocos. - + Traça - + Atrai as Traças próximas quando atacada. Esconde-se em blocos de pedra. - + Aranha de Caverna - + Tem uma mordida venenosa. - + Vacogumelo - + Faz sopa de cogumelo quando usada com uma vasilha. Derruba cogumelos e torna-se uma vaca normal depois de tosquiada. - + Golem de Neve - + O Golem de Neve pode ser criado pelos jogadores usando blocos de neve e uma abóbora. Ele atira bolas de neve nos inimigos dos seus criadores. - + Dragão Ender - + Este é um grande dragão negro encontrado no Final. - + Chama - + Estes são inimigos encontrados no Submundo, geralmente dentro das Fortalezas do Submundo. Derrubam Varas de Chamas quando são mortos. - + Cubo de Magma - + Eles são encontrados no Submundo. Similares aos Slimes, dividem-se em versões menores quando são mortos. - + Aldeão - + Ocelote - + Estes podem ser encontrados nas florestas. Eles podem ser domesticados, alimentando-os com Peixe Cru. Mas você deve deixar o Ocelote se aproximar, pois quaisquer movimentos bruscos podem assustá-lo e fazê-lo fugir. - + Golem de Ferro - + Aparece em vilas para protegê-las e podem ser criados usando blocos de ferro e abóboras. - + +Morcego + +Estas criaturas voadoras são encontradas nas cavernas ou em outros espaços fechados. + +Bruxa + +Estas inimigas podem ser encontradas em pântanos e atacam atirando Poções. Derrubam Poções quando mortas. + +Cavalo + +Estes animais podem ser domesticados e então montados. + +Burro + +Estes animais podem ser domesticados e então montados. Podem portar baús amarrados. + +Mula + +Fruto do cruzamento entre um cavalo e um burro. Estes animais podem ser domesticados e então montados, e podem carregar baús. + +Cavalo Zumbi + +Cavalo Esqueleto + +Wither + +Estes são criados a partir de Caveiras Murchas ou Areia Movediça. Atiram caveiras explosivas em você. + Explosives Animator Concept Artist @@ -1368,6 +1512,8 @@ Também pode ser usado para pouca iluminação. Mapa +Mapa vazio + Disco - "13" Disco de Música - "cat" @@ -1470,6 +1616,28 @@ Também pode ser usado para pouca iluminação. Cabeça de creeper +Estrela do Submundo + +Foguete de Artifício + +Estrela de Artifício + +Comparador Redstone + +Carrinho com TNT + +Carrinho com Tremonha + +Armadura de Ferro para Cavalo + +Armadura de Ouro para Cavalo + +Armadura de Diamante para Cavalo + +Chumbo + +Crachá + Pedra Bloco de Grama @@ -1486,6 +1654,8 @@ Também pode ser usado para pouca iluminação. Tábua de madeira de floresta +Tábuas (qualquer tipo) + Muda Muda de Carvalho @@ -1822,6 +1992,190 @@ Também pode ser usado para pouca iluminação. Caveira +Bloco de Comando + +Farol + +Baú Preso + +Chapa de Pressão Ponderada (Leve) + +Chapa de Pressão Ponderada (Pesada) + +Comparador Redstone + +Sensor de Luz Solar + +Bloco de Redstone + +Tremonha + +Trilho Ativador + +Monólito + +Argila colorida + +Fardo de Feno + +Argila endurecida + +Bloco de carvão + +Argila colorida preta + +Argila colorida vermelha + +Argila colorida verde + +Argila colorida marrom + +Argila colorida azul + +Argila colorida roxa + +Argila colorida ciano + +Argila colorida cinza claro + +Argila colorida cinza + +Argila colorida rosa + +Argila colorida verde-limão + +Argila colorida amarela + +Argila colorida azul claro + +Argila colorida magenta + +Argila colorida laranja + +Argila colorida branca + +Vitral + +Vitral preto + +Vitral vermelho + +Vitral verde + +Vitral marrom + +Vitral azul + +Vitral roxo + +Vitral ciano + +Vitral cinza claro + +Vitral cinza escuro + +Vitral rosa + +Vitral verde-limão + +Vitral amarelo + +Vitral azul claro + +Vitral magenta + +Vitral laranja + +Vitral branco + +Painel de vitral + +Painel de vitral preto + +Painel de vitral vermelho + +Painel de vitral verde + +Painel de vitral marrom + +Painel de vitral azul + +Painel de vitral roxo + +Painel de vitral ciano + +Painel de vitral cinza claro + +Painel de vitral cinza + +Painel de vitral rosa + +Painel de vitral verde-limão + +Painel de vitral amarelo + +Painel de vitral azul claro + +Painel de vitral magenta + +Painel de vitral laranja + +Painel de vitral branco + +Bola pequena + +Bola grande + +Forma Estelar + +Forma de Creeper + +Explosão + +Formato desconhecido + +Preto + +Vermelho + +Verde + +Marrom + +Azul + +Roxo + +Ciano + +Cinza claro + +Cinza + +Rosa + +Verde-limão + +Amarelo + +Azul claro + +Magenta + +Laranja + +Branco + +Personalizado + +Desbotado + +Brilho + +Trilho + +Duração do voo: +  Controles Atuais Estilo @@ -1999,8 +2353,7 @@ Também pode ser usado para pouca iluminação. Este é seu inventário. Ele mostra os itens disponíveis para uso em sua mão e todos os outros itens que está carregando. Sua armadura também é mostrada aqui. - - + {*B*} Pressione{*CONTROLLER_VK_A*} para continuar.{*B*} Pressione {*CONTROLLER_VK_B*} se já souber usar o inventário. @@ -2021,7 +2374,7 @@ Também pode ser usado para pouca iluminação. - Para obter mais informações sobre um item, passe o ponteiro do mouse sobre ele e pressione {*CONTROLLER_VK_RT*}. + Para obter mais informações sobre um item, passe o ponteiro do mouse sobre ele e pressione {*CONTROLLER_ACTION_MENU_PAGEDOWN*} . @@ -2055,7 +2408,7 @@ Também pode ser usado para pouca iluminação. - Para obter mais informações sobre um item, passe o ponteiro do mouse sobre ele e pressione {*CONTROLLER_VK_RT*}. + Para obter mais informações sobre um item, passe o ponteiro do mouse sobre ele e pressione {*CONTROLLER_ACTION_MENU_PAGEDOWN*} . @@ -2602,6 +2955,211 @@ No modo de voo, mantenha pressionado {*CONTROLLER_ACTION_JUMP*}para se mover par Pressione {*CONTROLLER_VK_B*}se já souber usar a barra de alimentos e como comer. + + Esta é a interface do inventário do cavalo. + + + + {*B*}Pressione{*CONTROLLER_VK_A*} para continuar. + {*B*}Pressione{*CONTROLLER_VK_B*} se você já sabe usar o inventário do cavalo. + + + + O inventário do cavalo permite a você transferir ou equipar itens no seu Cavalo, Burro ou Mula. + + + + Sele o cavalo posicionando a sela em seu respectivo espaço. Cavalos podem receber armadura ao se posicionar a Armadura de Cavalo em seu respectivo espaço. + + + + Você também pode transferir os itens entre o seu inventário e os alforjes amarrados aos burros e mulas neste menu. + + +Você encontrou um Cavalo. + +Você encontrou um Burro. + +Você encontrou uma Mula. + + + {*B*}Pressione{*CONTROLLER_VK_A*} para saber mais sobre Cavalos, Burros e Mulas. + {*B*}Pressione{*CONTROLLER_VK_B*} se você já sabe sobre Cavalos, Burros e Mulas. + + + + Cavalos e burros são encontradas principalmente em planícies abertas. Mulas são o fruto de um burro e um cavalo, mas são estéreis. + + + + Todos os cavalos, burros e mulas adultos são animais de montaria. No entanto, apenas os cavalos podem usar armadura, ao passo que só as mulas e os burros podem portar alforjes para transportar itens. + + + + Cavalos, burros e mulas devem ser domesticados antes que possam ser usados. Para domesticar um cavalo, basta tentar montá-lo e permanecer montado enquanto ele tenta tenta arremessar quem o monta. + + + + \Quando aparecem coraçõezinhos em volta do cavalo, ele terá sido domesticado e não tentará mais se livrar do(a) jogador(a). + + + + Tente montar agora neste cavalo. Use {*CONTROLLER_ACTION_USE*} sem itens ou ferramentas na mão para montar. + + + + Para guiar um cavalo, o jogador deve equipar uma sela sobre o animal, que pode ser comprada de aldeões, pescada ou encontrada dentro de baús no mundo. + + + + Você pode equipar alforjes em burros e mulas domesticados ao amarrar um Baú. Estes alforjes podem então ser acessados enquanto você monta ou se esgueira. + + + + Cavalos e burros (mas não mulas) podem ser criados como outros animais utilizando-se Maçãs Douradas ou Cenouras Douradas. Potros se tornarão cavalos adultos com o tempo, embora alimentá-los com Trigo ou Feno acelere o processo. + + + + Você pode tentar domesticar cavalos e burros aqui; além disso, há selas, armaduras de cavalos e outros itens úteis para cavalos nos baús pelas redondezas. + + + + Esta é a interface do Farol, que você pode usar para escolher os poderes que o seu farol vai conceder. + + + + {*B*}Pressione{*CONTROLLER_VK_A*} para continuar. + {*B*}Pressione{*CONTROLLER_VK_B*} se você já sabe usar a interface do Farol. + + + + No menu do Farol, você pode selecionar o poder principal deste farol. Quanto mais níveis sua pirâmide tiver, maior será o número de opções de poderes disponível para escolha. + + + + Um farol em uma pirâmide com pelo menos 4 níveis também concede a opção de Regenerar o segundo poder ou aumentar o poder do primeiro. + + + + Para definir os poderes do seu farol, sacrifique uma Esmeralda, Diamante, Ouro ou Lingote de Ferro no espaço de pagamento. Quando tudo estiver montado, os poderes emanarão do farol indefinidamente. + + +Há um farol inativo no topo desta pirâmide. + + + {*B*}Pressione{*CONTROLLER_VK_A*} para saber mais sobre os Faróis. + {*B*}Pressione{*CONTROLLER_VK_B*} se você já sabe sobre os Faróis. + + + + Faróis ativos projetam um feixe de luz clara no céu e concedem poderes aos jogadores próximos. Eles podem ser produzidos com vidro, obsidiana e estrelas do Submundo, obtidas ao derrotar o Wither. + + + + Os faróis devem ser posicionados de forma a receberem luz solar durante o dia. Eles devem ser colocados em pirâmides de ferro, ouro, esmeralda ou diamante. No entanto, o material sobre o qual um farol é posicionado não afeta o poder do farol. + + + + Tente usar o Farol para definir os poderes que ele concede. Você pode usar lingotes de ferro concedidos como o pagamento necessário. + + +Esta sala contém Tremonhas + + + {*B*}Pressione{*CONTROLLER_VK_A*} para saber mais sobre as Tremonhas. + {*B*}Press{*CONTROLLER_VK_B*} se você já sabe sobre as Tremonhas. + + + + Tremonhas são usadas para inserir ou remover itens de recipientes e para pegar itens lançados dentro delas automaticamente. + + + + Elas afetam as Barraca de Poções, Baús, Distribuidor, Monólitos, Carrinhos com Baús, Carrinhos com Tremonhas, assim como outras Tremonhas. + + + + Tremonhas farão tentativas contínuas de sugar os itens de recipientes apropriados acima delas. Além disso, também tentarão inserir itens depositados em um recipiente de saída. + + + + Se uma Tremonha for movida a Redstone, ela se tornará inativa e deixará de sugar e inserir itens. + + + + Uma Tremonha aponta na direção que tenta retirar os itens. Para fazer uma Tremonha apontar para um bloco específico, coloque-a em frente a este bloco enquanto se esgueira. + + + + Há diversos modelos de Tremonhas para você ver e experimentar nesta sala. + + + + Essa é a interface de fogos de artifício, que você pode usar para fazer fogos de artifício e estrelas de fogos de artifício. + + + + {*B*}Pressione{*CONTROLLER_VK_A*} para continuar. + {*B*}Pressione{*CONTROLLER_VK_B*} se você já sabe usar a interface do Farol. + + + + Para fazer fogos de artifício coloque pólvora e papel na grade de fabricação 3x3 acima do seu inventário. + + + + Opcionalmente, você pode colotar múltiplas estrelas de fogos de artifício na grade de fabricação, para adicioná-las ao fogo de artifício sendo fabricado. + + + + Encher mais espaços na grade de fabricação com pólvora aumenta a altura na qual as estrelas de fogos de artifício explodem. + + + + Depois você pode remover o fogo de artifício do espaço de resultado, quando quiser criá-lo. + + + + Estrelas de fogo de artifício podem ser feitas colocando pólvora e corante na grade de fabricação. + + + + O corante define a cor da explosão na estrela de fogos de artifício. + + + + A forma da estrela de fogos de artifício é definida ao adicionar uma carga de fogo, barra de ouro, pena or cabeça. + + + + Uma trilha ou brilho pode ser adicionado usando diamantes e pó de glowstone. + + + + Depois da criação de uma estrela de fogos de artifício, você pode ajustar a cor de desvanecimento combinando-a com um corante. + + + + Contido nos baús aqui estão vários itens usados na criação de FOGOS DE ARTIFÃCIO! + + + + {*B*}Pressione{*CONTROLLER_VK_A*} para aprender mais sobre fogos de artifício. + {*B*}Pressione{*CONTROLLER_VK_B*} se você já sabe sobre fogos de artifício. + + + + Fogos de artifício são itens decorativos que podem ser lançados à mão ou de distribuidores. Eles podem ser criados com papel, pólvora e opcionalmente um punhado de estrelas de fogos de artifício. + + + + As cores, desvanecimento, forma, tamanho e efeitos (como trilhas e brilhos) das estrelas de fogos de artifício podem ser customizados usando ingredientes extras na criação. + + + + Tente criar um fogo de artifício na bancada usando um sortimento de ingredientes dos baús. + +  Selecionar Usar @@ -2824,6 +3382,22 @@ No modo de voo, mantenha pressionado {*CONTROLLER_ACTION_JUMP*}para se mover par Carregar jogo salvo para o Xbox One +Montar + +Desmontar + +Baú amarrado + +Lançar + +Rédea + +Soltar + +Amarrar + +Nomear + OK Cancelar @@ -3134,6 +3708,20 @@ Deseja desbloquear a versão integral do jogo? Distribuidor +Cavalo + +Monólito + +Tremonha + +Farol + +Poder Principal + +Poder Secundário + +Carrinho de Minas + Não há ofertas de conteúdo para baixar desse tipo disponíveis para este título no momento. %s entrou no jogo. @@ -3293,10 +3881,14 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Modo Jogo Criativo +Modo de Jogo: Aventura + Sobrevivência Criativo +Aventura + Criado em Sobrevivência Criado em Criativo @@ -3317,6 +3909,8 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Superplano +Insira uma semente para gerar novamente o mesmo terreno. Deixe vazio para um mundo aleatório. + Quando habilitado, o jogo será um jogo online. Quando habilitado, apenas jogadores convidados poderão entrar. @@ -3333,7 +3927,7 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Quando habilitado, o host pode alternar o vôo, desabilitar exaustão e ficar invisível pelo menu do jogo. Desabilita atualizações de conquistas e de placar de líderes. -Quando ativado, o Submundo é recriado. É útil quando se tem um jogo salvo mais antigo em que as Fortalezas do Submundo não estavam presentes. +Ao ativar, recria o Submundo. Útil para mundos criados quando Fortalezas do Submundo ainda não existiam. Quando habilitado, estruturas como Vilas e Fortalezas serão geradas no mundo. @@ -3341,6 +3935,20 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Quando habilitado, um baú contendo alguns itens úteis será criado perto do ponto de criação do jogador. +Quando desativada, impede que monstros e animais alterem os bloco (por exemplo, as explosões dos Creepers não destroem os blocos e as Ovelhas não removem a Grama) ou peguem itens. + +Quando ativada, os jogadores manterão o inventário ao morrer. + +Quando desativada, as criaturas não aparecerão naturalmente. + +Quando desativada, monstros e animais não deixarão itens (por exemplo, os Creepers não vão deixar cair pólvora). + +Quando desativada, os blocos vão parar de derrubar itens ao serem destruídos (por exemplo, blocos de pedra não derrubarão mais paralelepípedos). + +Quando desativada, os jogadores não regenerarão a saúde naturalmente. + +Quando desativada, a hora do dia não sofrerá alteração. + Pacotes de Capas Temas @@ -3389,7 +3997,49 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? {*PLAYER*} foi esmurrado por {*SOURCE*} -{*PLAYER*} foi morto por {*SOURCE*} +{*PLAYER*} foi morto por {*SOURCE*} usando magia + +{*PLAYER*} caiu da escada + +{*PLAYER*} caiu de algumas videiras + +{*PLAYER*} caiu para fora da água + +{*PLAYER*} caiu de um lugar alto + +{*PLAYER*} foi condenado(a) a cair por {*SOURCE*} + +{*PLAYER*} foi condenado(a) a cair por {*SOURCE*} + +{*PLAYER*} foi condenado(a) a cair por {*SOURCE*} usando {*ITEM*} + +{*PLAYER*} caiu muito longe e foi eliminado(a) por {*SOURCE*} + +{*PLAYER*} caiu muito longe e foi eliminado(a) por {*SOURCE*} usando {*ITEM*} + +{*PLAYER*} andou sobre as chamas enquanto lutava {*SOURCE*} + +{*PLAYER*} virou cinzas enquanto lutava {*SOURCE*} + +{*PLAYER*} tentou nadar na lava para escapar{*SOURCE*} + +{*PLAYER*} afogou-se enquanto tentava escapar{*SOURCE*} + +{*PLAYER*} pisou no cacto enquanto tentava escapar {*SOURCE*} + +{*PLAYER*} foi explodido(a) por {*SOURCE*} + +{*PLAYER*} secou até morrer + +{*PLAYER*} foi assassinado por {*SOURCE*} usando {*ITEM*} + +{*PLAYER*} foi baleado(a) {*SOURCE*} usando {*ITEM*} + +{*PLAYER*} levou uma bola de fogo de {*SOURCE*} usando {*ITEM*} + +{*PLAYER*} foi socado(a) por {*SOURCE*} usando {*ITEM*} + +{*PLAYER*} foi morto(a) por {*SOURCE*} usando {*ITEM*} Neblina Base @@ -3566,6 +4216,8 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Não é possível usar o ovo spawn no momento. O número máximo de lulas em um mundo foi alcançado. +Não pode usar um Ovo de Criação no momento. O número máximo de Morcegos em um mundo foi alcançado. + Não é possível usar o Ovo de Criação no momento. O número máximo de inimigos no mundo já foi alcançado. Não é possível usar o Ovo de Criação no momento. O número máximo de aldeões no mundo já foi alcançado. @@ -3574,12 +4226,14 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Você não pode gerar inimigos no Modo Paz. -Este animal não pode entrar no Modo Amor. O número máximo de Porcos, Ovelhas, Vacas e Gatos de criação foi alcançado. +Este animal não pode entrar no Modo do Amor. O número máximo de Porcos, Ovelhas, Vacas e Gatos de criação foi alcançado. Este animal não pode entrar em Modo Amor. O número máximo de lobos foi alcançado. Este animal não pode entrar em Modo Amor. O número máximo de frangos foi alcançado. +Este animal não pode entrar no Modo do Amor. O número máximo de cavalos reprodutores foi alcançado. + Este animal não pode entrar em Modo Amor. O número máximo de vacogumelos foi alcançado. O número máximo de barcos em um mundo foi alcançado. @@ -3607,27 +4261,43 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Créditos Reinstalar Conteúdo - + Configurações de Depuração - + Fogo Espalha - + TNT Explode - + Jogador x Jogador - + Confiar nos Jogadores - + Privilégios do Host - + Gerar Estruturas - + Mundo Superplano - + Baú de Bônus - + Opções de Mundo - + +Opções de Jogo + +Assédio por criatura + +Manter inventário + +Surgimento de criaturas + +Itens de criaturas + +Itens de Espaços + +Regeneração Natural + +Ciclo da Luz do Dia + Pode Construir e Minerar Pode Usar Portas e Acionadores @@ -3666,7 +4336,7 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Semente para Criação de Mundo -Deixar em branco para semente aleatória +Deixar livre p/ uma semente aleatória Jogadores @@ -3700,7 +4370,7 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Tipo de Nível: -JxJ: +JvJ: Confiar Jogadores: @@ -3732,7 +4402,7 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Restaurar Padrões -Exibir Oscilação +Oscilação da visão Dicas @@ -3754,7 +4424,7 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Editar mensagem da placa: -Vejam o que fiz no Minecraft: Xbox 360 Edition! +Olha o que eu fiz no Minecraft: Xbox 360 Edition! Texturas, ícones e interface do usuário clássicos do Minecraft! @@ -3814,6 +4484,14 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Veneno +Wither + +Reforço de Saúde + +Absorção + +Saturação + de Rapidez de Lentidão @@ -3852,6 +4530,14 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? de Veneno +da Decadência + +do Reforço de Saúde + +da Absorção + +da Saturação + II @@ -3948,6 +4634,22 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Reduz a saúde dos jogadores, animais e monstros afetados com o tempo. +Quando aplicado: + +Força de pulo para o cavalo + +Reforços Zumbis + +Saúde Máxima + +Limite de acomp. pelas criaturas + +Resistência a empurrão + +Velocidade + +Dano de ataque + Nitidez Atacar @@ -4038,7 +4740,7 @@ Deseja instalar o pacote de combinações ou o pacote de texturas agora? Restaura 3{*ICON_SHANK_01*}. Criado ao cozinhar uma batata na fornalha. -Restaura 1{*ICON_SHANK_01*}, ou pode ser cozinhado em uma fornalha. Pode ser plantado na fazenda. Comer isso pode te envenenar. +Restaura 1{*ICON_SHANK_01*} Comer isso pode te envenenar. Restaura 3{*ICON_SHANK_01*}. Criado com uma cenoura e barras de ouro. diff --git a/Minecraft.Client/Common/Media/pt-PT/4J_strings.resx b/Minecraft.Client/Common/Media/pt-PT/4J_strings.resx index a612c335..ab38c1c5 100644 --- a/Minecraft.Client/Common/Media/pt-PT/4J_strings.resx +++ b/Minecraft.Client/Common/Media/pt-PT/4J_strings.resx @@ -73,11 +73,11 @@ Perfil de jogador offline -O jogo tem algumas funcionalidades que requerem um perfil de jogador ativo no Xbox Live, mas de momento estás offline. +O jogo tem algumas funcionalidades que requerem um perfil de jogador ativo no Xbox LIVE, mas de momento estás offline. -Esta funcionalidade requer um perfil de jogador ligado ao Xbox Live. +Esta funcionalidade requer um perfil de jogador ligado ao Xbox LIVE. -Ligar ao Xbox Live +Ligar ao Xbox LIVE Continuar a jogar offline @@ -100,7 +100,7 @@ Desbloquear Jogo Completo Esta é a versão de avaliação do Minecraft. Se tivesses o jogo completo, terias acabado de ganhar um feito! -Desbloqueia o jogo completo para experimentares a diversão do Minecraft e para jogares com os teus amigos em todo o mundo através do Xbox Live. +Desbloqueia o jogo completo para experimentares a diversão do Minecraft e para jogares com os teus amigos em todo o mundo através do Xbox LIVE. Queres desbloquear o jogo completo? Estás a ser reencaminhado para o menu principal devido a um problema de leitura do teu perfil. diff --git a/Minecraft.Client/Common/Media/pt-PT/strings.resx b/Minecraft.Client/Common/Media/pt-PT/strings.resx index 132c30f2..6fee7199 100644 --- a/Minecraft.Client/Common/Media/pt-PT/strings.resx +++ b/Minecraft.Client/Common/Media/pt-PT/strings.resx @@ -156,7 +156,7 @@ Se estiveres a segurar um objeto, usa{*CONTROLLER_ACTION_USE*} para o utilizares {*T3*}INSTRUÇÕES DE JOGO : MOSTRADOR SUPERIOR{*ETW*}{*B*}{*B*} O MOSTRADOR SUPERIOR apresenta informação sobre o teu estado; a tua saúde, o oxigénio que te resta quando estás debaixo de água, o teu nível de fome (tens de comer para reabasteceres) e a armadura, caso estejas a usar alguma. Se perderes saúde, mas tiveres uma barra de comida com 9 ou mais{*ICON_SHANK_01*}, a tua saúde será imediatamente reabastecida. Ao comeres, reabasteces a barra de comida.{*B*} -Aqui também é mostrada a Barra de Experiência, com um valor numérico que mostra o nível de Experiência, e a barra que indica quantos Pontos de Experiência te faltam para subires de nível. Ganhas Pontos de Experiência recolhendo os Orbes de Experiência que os habitantes deixam cair quando morrem, ao escavar certos tipos de blocos, ao criar animais, ao pescar e ao fundir minério na fornalha.{*B*} +Aqui também é mostrada a Barra de Experiência, com um valor numérico que mostra o nível de Experiência, e a barra que indica quantos Pontos de Experiência te faltam para subires de nível. Ganhas Pontos de Experiência recolhendo os Orbes de Experiência que os habitantes deixam cair quando morrem, ao escavar certos tipos de blocos, ao criar animais, ao pescar e ao fundir minério na fornalha.{*B*}{*B*} Também apresenta os objetos disponíveis para usares. Usa{*CONTROLLER_ACTION_LEFT_SCROLL*} e{*CONTROLLER_ACTION_RIGHT_SCROLL*} para mudares o objeto que estás a segurar. {*T3*}INSTRUÇÕES DE JOGO : INVENTÃRIO{*ETW*}{*B*}{*B*} @@ -233,7 +233,7 @@ Quando é colocada uma Espada, Arco, Machado, Picareta, Pá, Armadura ou Livro n Se não tiveres Níveis de Experiência suficientes para usar alguns destes, o custo surgirá a vermelho, caso contrário surgirá a verde.{*B*}{*B*} O feitiço aplicado é selecionado aleatoriamente com base no custo apresentado.{*B*}{*B*} Se a Mesa de Feitiços estiver rodeada de Estantes (até um máximo de 15 Estantes), com um bloco de intervalo entre a Estante e a Mesa de Feitiços, o poder dos feitiços irá aumentar e ver-se-ão glifos misteriosos a sair do livro na Mesa de Feitiços.{*B*}{*B*} -Todos os ingredientes para uma Mesa de Feitiços podem ser encontrados nas aldeias de um mundo, ou escavando ou cultivando no mundo.{*B*} +Todos os ingredientes para uma Mesa de Feitiços podem ser encontrados nas aldeias de um mundo, ou escavando ou cultivando no mundo.{*B*}{*B*} Os Livros de Feitiços são usados na Bigorna para aplicar feitiços a itens. Isto dá-te maior controlo sobre os feitiços que gostarias de ter nos teus itens.{*B*} @@ -282,7 +282,7 @@ No modo de voo, podes manter premido{*CONTROLLER_ACTION_JUMP*} para subires e{*C {*T3*}INSTRUÇÕES DE JOGO : OPÇÕES DE ANFITRIÃO E JOGADOR{*ETW*}{*B*}{*B*} -{*T1*}Opções de jogo{*ETW*}{*B*} +{*T1*}Opções de Jogo{*ETW*}{*B*} Ao carregar ou criar um mundo, prime o botão "Mais Opções" para abrir um menu que te dá maior controlo sobre o teu jogo.{*B*}{*B*} {*T2*}Jogador vs. Jogador{*ETW*}{*B*} @@ -300,6 +300,27 @@ Ao carregar ou criar um mundo, prime o botão "Mais Opções" para abrir um menu {*T2*}Privilégios de Anfitrião{*ETW*}{*B*} Quando ativada, o anfitrião pode ativar a sua capacidade de voar, desativar a exaustão e tornar-se invisível a partir do menu do jogo. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + {*T2*}Ciclo da Luz do Dia{*ETW*}{*B*} + Quando desativada, a hora do dia não muda.{*B*}{*B*} + + {*T2*}Manter Inventário{*ETW*}{*B*} + Quando ativada, os jogadores mantêm o inventário quando morrem.{*B*}{*B*} + + {*T2*}Geração de Criaturas{*ETW*}{*B*} + Quando desativada, as criaturas não se geram naturalmente.{*B*}{*B*} + + {*T2*}Perturbação de Criaturas{*ETW*}{*B*} + Quando desativada, impede que monstros e animais mudem blocos (por exemplo, explosões de Creeper não destroem blocos e as Ovelhas não comem Erva) ou apanhem objetos.{*B*}{*B*} + + {*T2*}Saques de Criaturas{*ETW*}{*B*} + Quando desativada, os monstros e os animais não deixam cair saques (por exemplo, os Creepers não deixam cair pólvora).{*B*}{*B*} + + {*T2*}Queda de Peças{*ETW*}{*B*} + Quando desativada, os blocos não deixam cair objetos quando são destruídos (por exemplo, os blocos de Pedra não deixam cair Pedra Arredondada).{*B*}{*B*} + + {*T2*}Regeneração Natural{*ETW*}{*B*} + Quando desativada, os jogadores não regeneram naturalmente a sua saúde.{*B*}{*B*} + {*T1*}Opções de Criação de Mundos{*ETW*}{*B*} Ao criar um novo mundo, existem opções adicionais.{*B*}{*B*} @@ -343,24 +364,26 @@ Para modificar os privilégios de um jogador, seleciona o nome e prime{*CONTROLL Quando esta opção está ativada, o jogador pode alterar os privilégios dos outros jogadores (exceto o anfitrião) se "Confiar Jogadores" estiver desativada, expulsar jogadores e ativar ou desativar a propagação de fogo e as explosões de TNT.{*B*}{*B*} {*T2*}Expulsar Jogador{*ETW*}{*B*} - Selecionar esta opção faz com que jogadores que não estejam na mesma consola {*PLATFORM_NAME*} que o anfitrião sejam eliminados do jogo. Os jogadores expulsos não poderão voltar a participar no jogo até que este seja reiniciado.{*B*}{*B*} + {*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} {*T1*}Opções de Jogador Anfitrião{*ETW*}{*B*} Se "Privilégios de Anfitrião" estiver ativada, o jogador anfitrião pode modificar alguns dos seus privilégios. Para modificar os privilégios de um jogador, seleciona o nome e prime{*CONTROLLER_VK_A*} para abrir o menu de privilégios do jogador, onde podes usar as seguintes opções.{*B*}{*B*} {*T2*}Pode Voar{*ETW*}{*B*} Quando esta opção está ativada, o jogador pode voar. Esta opção só é relevante no modo Sobrevivência, uma vez que todos os jogadores podem voar no modo Criativo.{*B*}{*B*} - + {*T2*}Desativar Exaustão{*ETW*}{*B*} Esta opção afeta apenas o modo Sobrevivência. Quando ativada, as atividades físicas (caminhar/correr/saltar, etc.) não diminuem a barra de comida. No entanto, se o jogador for ferido, a barra de comida irá diminuir lentamente enquanto o jogador estiver a recuperar.{*B*}{*B*} - + {*T2*}Invisível{*ETW*}{*B*} Quando esta opção está ativada, o jogador não pode ser visto pelos outros jogadores e é invulnerável.{*B*}{*B*} - - {*T2*}Pode Teletransportar{*ETW*}{*B*} + + {*T2*}Pode Teletransportar{*ETW*}{*B*} Permite que o jogador se transporte ou transporte outros jogadores até si ou até outros jogadores no mundo. +Selecionar esta opção fará com que os jogadores que não estão na mesma consola {*PLATFORM_NAME*} que o anfitrião sejam expulsos do jogo, juntamente com outros jogadores na sua consola {*PLATFORM_NAME*}. Este jogador não poderá voltar ao jogo até este ser reiniciado. + Página Seguinte Página Anterior @@ -383,7 +406,7 @@ Se "Privilégios de Anfitrião" estiver ativada, o jogador anfitrião pode modif Animais de Criação -Preparação de Poções +Poções Feitiço @@ -426,60 +449,92 @@ pelo que facilmente se juntarão a ti. {*T3*}Alterações e Adições{*ETW*}{*B*}{*B*} -- Novos objetos - Esmeralda, Minério de Esmeralda, Bloco de Esmeralda, Baú Ender, Gancho de Armadilha, Maçã Dourada Enfeitiçada, Bigorna, Vaso de Flores, Muros de Pedra Arredondada, Muros de Pedra Arredondada com Musgo, Pintura de Wither, Batata, Batata Cozida, Batata Venenosa, Cenoura, Cenoura Dourada, Cenoura num Pau, -Tarte de Abóbora, Poção de Visão Nocturna, Poção de Invisibilidade, Quartzo do Submundo, Minério de Quartzo do Submundo, Bloco de Quartzo, Placa de Quartzo, Escada de Quartzo, Bloco de Quartzo Esculpido, Bloco Pilar de Quartzo, Livro de Feitiços, Alcatifa.{*B*} -- Novas receitas para Grés Suave e Grés Esculpido.{*B*} -- Novos Habitantes - Aldeões Mortos-Vivos.{*B*} -- Novas funcionalidades de geração de terreno - Templos do Deserto, Aldeias do Deserto, Templos da Selva.{*B*} -- Trocas com aldeões.{*B*} -- Interface Bigorna.{*B*} -- Pode tingir armadura de cabedal.{*B*} -- Pode tingir coleiras de lobo.{*B*} -- Pode montar um porco e controlá-lo com uma Cenoura num Pau.{*B*} -- Conteúdo de Baú Bónus atualizado com mais objetos.{*B*} -- Alterada colocação de meios blocos e outros blocos em meios blocos.{*B*} -- Alterada colocação de placas e escadas invertidas.{*B*} -- Adicionadas profissões de aldeões diferentes.{*B*} -- Aldeões gerados a partir de ovo de geração terão uma profissão aleatória.{*B*} -- Adicionada colocação lateral de tronco.{*B*} -- Fornalhas podem usar ferramentas de madeira como combustível.{*B*} -- Painéis de Gelo e Vidro podem ser recolhidos com ferramentas enfeitiçadas com toque de seda.{*B*} -- Botões de Madeira e Placas de Pressão de Madeira podem ser ativados com Flechas.{*B*} -- Habitantes do Submundo podem ser gerados no Mundo Superior a partir de Portais.{*B*} -- Creepers e Aranhas são agressivos para com o último jogador que os tenha atingido.{*B*} -- Os habitantes no modo Criativo tornam-se novamente neutros após um curto período.{*B*} -- Remover ricochete aquando de afogamento.{*B*} -- As portas partidas por mortos-vivos apresentam danos.{*B*} -- Gelo derrete no Submundo.{*B*} -- Caldeirões enchem-se quando ficam à chuva.{*B*} -- Pistões demoram o dobro do tempo a atualizar.{*B*} -- Porco larga Sela quando é morto (se tiver sela).{*B*} -- Cor do céu alterada no Fim.{*B*} -- Corda pode ser colocada (para Armadilhas).{*B*} -- Chuva escorre das folhas.{*B*} -- Alavancas podem ser colocadas no fundo dos blocos.{*B*} -- TNT causa danos variáveis consoante a definição de dificuldade.{*B*} -- Receita de livro alterada.{*B*} -- Barcos partem Nenúfares, em vez de Nenúfares partirem Barcos.{*B*} -- Porcos largam mais Costeletas.{*B*} -- Slimes reproduzem-se menos em mundos Superplanos.{*B*} -- Dano de Creeper variável consoante a definição de dificuldade, mais ricochete.{*B*} -- Corrigida a não abertura dos maxilares dos Endermen.{*B*} -- Adicionado teletransporte de jogadores (usando o menu BACK do jogo).{*B*} -- Novas Opções Anfitrião para voar, invisibilidade e invulnerabilidade para jogadores remotos.{*B*} -- Novos tutoriais do Mundo Tutorial para novos itens e funcionalidades.{*B*} -- Posições dos Baús de Discos de Música atualizadas no Mundo Tutorial.{*B*} +- Novos objetos adicionados - Barro Endurecido, Barro Manchado, Bloco de Carvão, Fardo de Palha, Carril Ativador, Bloco de Redstone, Sensor de Luz do Dia, Soltador, Funil, Vagoneta com Funil, Vagoneta com TNT, Comparador de Redstone, Placa de Pressão Ponderada, Farol, Baú Preso, Foguete de Fogo de Artifício, Estrela de Fogo de Artifício, Estrela do Submundo, Corda de Conduzir, Armadura de Cavalo, Etiqueta, Ovo de Geração de Cavalo{*B*} +- Novas Criaturas adicionadas - Cérbero, Esqueletos de Cérbero, Bruxas, Morcegos, Cavalos, Burros e Mulas{*B*} +- Novas funcionalidades de geração de terreno - Cabanas de Bruxa.{*B*} +- Adicionada interface de Farol.{*B*} +- Adicionada interface de Cavalo.{*B*} +- Adicionada interface de Funil.{*B*} +- Adicionado Fogo de Artifício - a interface de Fogo de Artifício pode ser acedida a partir da Mesa de Criação quando tens os ingredientes para criar uma Estrela de Fogo de Artifício ou um Foguete de Fogo de Artifício.{*B*} +- Adicionado 'Modo Aventura' - Só podes quebrar blocos com as ferramentas corretas.{*B*} +- Adicionados imensos sons novos.{*B*} +- Habitantes, objetos e projéteis agora passam através de portais.{*B*} +- Os Repetidores podem agora ser trancados alimentando a sua lateral com outro Repetidor.{*B*} +- Mortos-vivos e Esqueletos podem agora gerar-se com diferentes armas e armaduras.{*B*} +- Novas mensagens de morte.{*B*} +- Nomeia as criaturas com uma Etiqueta, e dá novos nomes a contentores para mudar o título quando se abre o menu.{*B*} +- O Pó de Ossos já não faz tudo crescer instantaneamente até ao tamanho máximo, e passa a fazê-lo por fases de forma aleatória.{*B*} +- Um sinal de Redstone que descreve os conteúdos dos Baús, dos Postos de Poções, dos Distribuidores e das Jukeboxes pode ser detetado colocando um Comparador de Redstone diretamente contra eles.{*B*} +- Os Distribuidores podem ficar virados em qualquer direção.{*B*} +- Comer uma Maçã Dourada dá ao jogador uma saúde de "absorção" adicional durante um curto período.{*B*} +- Quanto mais tempo permaneceres numa zona, mais difíceis serão os monstros que se geram nessa zona.{*B*} + +{*ETB*}Bem-vindo de volta! Podes não ter reparado, mas o Minecraft foi atualizado.{*B*}{*B*} +Há muitas funcionalidades novas para explorares com os teus amigos. Aqui ficam algumas. Lê e depois diverte-te!{*B*}{*B*} +{*T1*}Novos Objetos{*ETB*} - Barro Endurecido, Barro Manchado, Bloco de Carvão, Fardo de Palha, Carril Ativador, Bloco de Redstone, Sensor de Luz do Dia, Soltador, Funil, Vagoneta com Funil, Vagoneta com TNT, Comparador de Redstone, Placa de Pressão Ponderada, Farol, Baú Preso, Foguete de Fogo de Artifício, Estrela de Fogo de Artifício, Estrela do Submundo, Corda de Conduzir, Armadura de Cavalo, Etiqueta, Ovo de Geração de Cavalo{*B*}{*B*} +{*T1*}Novas Criaturas{*ETB*} - Cérbero, Esqueletos de Cérbero, Bruxas, Morcegos, Cavalos, Burros e Mulas{*B*}{*B*} +{*T1*}Novas Funcionalidades{*ETB*} - Domestica e cavalga um cavalo, cria fogo de artifício e dá espetáculo, nomeia animais e monstros com uma Etiqueta, cria circuitos de Redstone mais avançados, e novas Opções de Anfitrião para ajudar a controlar aquilo que os convidados podem fazer no teu mundo!{*B*}{*B*} +{*T1*}Novo Mundo Tutorial{*ETB*} – Aprende a usar as funcionalidades antigas e recentes no Mundo Tutorial. Vê se consegues descobrir todos os Discos de Música secretos escondidos no mundo!{*B*}{*B*} -{*ETB*}Bem-vindo de volta! Podes não ter reparado, mas o Minecraft sofreu alterações.{*B*}{*B*} -Há muitas novas funcionalidades para jogares com os teus amigos. Aqui ficam algumas. Lê e depois diverte-te!{*B*}{*B*} -{*T1*}Novos objetos{*ETB*} - Esmeralda, Minério de Esmeralda, Bloco de Esmeralda, Baú Ender, Gancho de Armadilha, Maçã Dourada Enfeitiçada, Bigorna, Vaso de Flores, Muros de Pedra Arredondada, Muros de Pedra Arredondada com Musgo, Pintura de Wither, Batata, Batata Cozida, Batata Venenosa, Cenoura, Cenoura Dourada, Cenoura num Pau, -Tarte de Abóbora, Poção de Visão Nocturna, Poção de Invisibilidade, Quartzo do Submundo, Minério de Quartzo do Submundo, Bloco de Quartzo, Placa de Quartzo, Escada de Quartzo, Bloco de Quartzo Esculpido, Bloco Pilar de Quartzo, Livro de Feitiços, Alcatifa.{*B*}{*B*} - {*T1*}Novos Habitantes{*ETB*} - Aldeões Mortos-Vivos.{*B*}{*B*} -{*T1*}Novas Funcionalidades{*ETB*} - Troca com aldeões, repara ou enfeitiça armas e ferramentas usando a Bigorna, armazena objetos num Baú Ender, controla um porco enquanto o montas usando uma Cenoura num Pau!{*B*}{*B*} -{*T1*}Novos Mini-Tutoriais{*ETB*} – Aprende a usar as novas funcionalidades no Mundo Tutorial!{*B*}{*B*} -{*T1*}Novos 'Easter Eggs'{*ETB*} – Mudámos de sítio todos os Discos de Música secretos no Mundo Tutorial. Vê se consegues voltar a encontrá-los!{*B*}{*B*} - +Cavalos + +{*T3*}INSTRUÇÕES DE JOGO: CAVALOS{*ETW*}{*B*}{*B*} +Os Cavalos e os Burros estão sobretudo nas planícies. As Mulas são descendentes de um Burro e de um Cavalo, mas são inférteis.{*B*} +Todos os Cavalos, Burros e Mulas adultos podem ser montados. Porém, só os Cavalos podem ter armadura, e só as Mulas e os Burros podem ser equipados com alforjes para transportar objetos.{*B*}{*B*} +Os Cavalos, os Burros e as Mulas têm de ser domesticados antes de poderem ser usados. Para domesticar um cavalo, é preciso montá-lo e conseguir ficar em cima dele enquanto ele tenta atirar o jogador para o chão.{*B*} +Quando surgem Corações de Amor à volta do cavalo, ele está domesticado e já não tentará atirar o jogador para o chão. Para guiar um cavalo, é preciso equipá-lo com uma Sela.{*B*}{*B*} +Podes comprar Selas aos aldeões ou encontrá-las dentro de Baús escondidos pelo mundo.{*B*} +Os Burros e Mulas domesticados podem receber alforjes se lhes prenderes um Baú. Poderás depois aceder aos alforjes enquanto montas ou quando te aproximas furtivamente do animal.{*B*}{*B*} +Os Cavalos e os Burros (as Mulas não) podem ser procriados como os outros animais, usando Maçãs Douradas ou Cenouras Douradas.{*B*} +Os potros tornam-se cavalos adultos ao fim de algum tempo, mas podes acelerar o processo alimentando-os com Trigo ou Feno.{*B*} + + +Faróis + +{*T3*}INSTRUÇÕES DE JOGO: FARÓIS{*ETW*}{*B*}{*B*} +Os Faróis Ativos projetam um feixe de luz brilhante para o céu e atribuem poderes a jogadores próximos.{*B*} +São criados a partir de Vidro, Obsidiana e Estrelas do Submundo, que podem ser obtidos derrotando o Cérbero.{*B*}{*B*} +Os Faróis têm de ser colocados de modo a apanhar sol durante o dia. Eles têm de ser colocados em Pirâmides de Ferro, Ouro, Esmeralda ou Diamante.{*B*} +O material do Farol em cima do qual este é colocado não tem qualquer efeito na sua potência.{*B*}{*B*} +No menu do Farol podes selecionar um poder principal para o teu Farol. Quantos mais camadas tiver a tua pirâmide, mais poderes terás à escolha.{*B*} +Um Farol numa pirâmide com pelo menos quatro camadas também te permite escolher entre o poder secundário de Regeneração ou um poder principal mais forte.{*B*}{*B*} +Para definir os poderes do teu Farol tens de sacrificar uma Esmeralda, um Diamante, Lingotes de Ferro ou Ouro na ranhura de pagamento.{*B*} +Uma vez definidos, os poderes irão emanar indefinidamente do Farol.{*B*} + + +Fogo de artifício + +{*T3*}INSTRUÇÕES DE JOGO: FOGO DE ARTIFÃCIO{*ETW*}{*B*}{*B*} +O Fogo de Artifício é um objeto decorativo que pode ser lançado à mão ou a partir de Distribuidores. Pode ser criado usando Papel, Pólvora e, opcionalmente, algumas Estrelas de Fogo de Artifício.{*B*} +As cores, o desaparecimento, a forma, o tamanho e os efeitos (como os rastos e a cintilância) das Estrelas de Fogo de Artifício podem ser personalizados incluindo ingredientes adicionais no momento da criação.{*B*}{*B*} +Para criar um Fogo de Artifício, coloca Pólvora e Papel na grelha de criação de 3x3 que aparece acima do teu inventário.{*B*} +Opcionalmente, podes colocar múltiplas Estrelas de Fogo de Artifício na grelha para as adicionar ao Fogo de Artifício.{*B*} +Preencher mais ranhuras na grelha de criação com Pólvora aumenta a altura a que as Estrelas de Fogo de Artifício vão explodir.{*B*}{*B*} +Podes então retirar o Fogo de Artifício criado da ranhura de saída.{*B*}{*B*} +As Estrelas de Fogo de Artifício podem ser criadas colocando Pólvora e Tinta na grelha de criação.{*B*} + - A Tinta definirá a cor da explosão da Estrela de Fogo de Artifício.{*B*} + - A forma da Estrela de Fogo de Artifício é definida adicionando uma Carga de Fogo, uma Pepita de Ouro, uma Pena ou uma Cabeça de Criatura.{*B*} + - Um rasto ou uma cintilância podem ser adicionados usando Diamantes ou Pó de Glowstone.{*B*}{*B*} +Depois de ser criada uma Estrela de Fogo de Artifício, podes definir a cor de desaparecimento da Estrela de Fogo de Artifício criando-a com Tinta. + + +Funis + +{*T3*}INSTRUÇÕES DE JOGO: FUNIS{*ETW*}{*B*}{*B*} +Os Funis são usados para inserir ou remover objetos de contentores, e para recolher automaticamente objetos atirados a eles.{*B*} +Eles podem afetar Postos de Poções, Baús, Distribuidores, Soltadores, Vagonetas com Baús, Vagonetas com Funis, bem como outros Funis.{*B*}{*B*} +Os Funis vão tentar continuamente sugar objetos de um contentor adequado colocado acima deles. Também vão tentar inserir objetos armazenados num contentor de destino.{*B*} +Se um Funil for alimentado por Redstone tornar-se-á inativo e parará de sugar e de inserir objetos.{*B*}{*B*} +Um Funil aponta na direção em que tenta colocar objetos. Para levar um Funil a apontar para um determinado bloco, coloca-o frente a esse bloco enquanto andas furtivamente.{*B*} + + +Soltadores + +{*T3*}INSTRUÇÕES DE JOGO: SOLTADORES{*ETW*}{*B*}{*B*} +Quando alimentados por Redstone, os Soltadores vão largar no chão um objeto ao acaso que contenham. Usa {*CONTROLLER_ACTION_USE*} para abrir o Soltador e depois podes carregar o Soltador com objetos do teu inventário.{*B*} +Se o Soltador estiver perante um Baú ou outro tipo de Contentor, o objeto será colocado aí e não no chão. Podes criar longas cadeias de Soltadores para transportar objetos ao longo de um caminho. Para que isto funcione, eles terão de ser, alternadamente, ligados e desligados. + Provoca mais danos do que com a mão. @@ -553,7 +608,7 @@ Tarte de Abóbora, Poção de Visão Nocturna, Poção de Invisibilidade, Quartz Utilizado para criar escadas compridas. Duas placas colocadas uma sobre a outra criam um bloco de placa dupla de tamanho normal. -Utilizado como escadas longas. Duas placas colocadas uma sobre a outra irão criar um bloco de placas duplo de tamanho normal. +Utilizado para criar escadas compridas. Duas placas colocadas uma sobre a outra criam um bloco de placa dupla de tamanho normal. Utilizadas para criar luz. As tochas também derretem a neve e o gelo. @@ -606,10 +661,36 @@ As cores da cama são sempre as mesmas, independentemente das cores da lã usada Quando seguras no mapa, poderás ver a imagem de uma área explorada. Pode ser utilizado para descobrir caminhos. +Quando se usa torna-se um mapa da parte do mundo em que estás, e vai-se preenchendo à medida que exploras. + Utilizado para ataques à distância com setas. Utilizadas como munição para os arcos. +Largado pelo Cérbero, usado no fabrico de Faróis. + +Quando ativados, criam explosões coloridas. Cor, efeito, forma e desaparecimento são determinados pela Estrela de Fogo de Artifício usada quando é criado o Fogo de Artifício. + +Usada para determinar cor, efeito e forma de um Fogo de Artifício. + +Usado em circuitos Redstone para manter, comparar ou subtrair a força do sinal, ou para medir determinados estados de blocos. + +É um tipo de Vagoneta que atua como bloco de TNT móvel. + +É um bloco que produz um sinal Redstone com base na luz solar (ou na ausência desta). + +É um tipo de Vagoneta especial que funciona de modo similar a um Funil. Recolhe objetos que estão nos carris e nos contentores acima. + +Um tipo especial de Armadura que pode ser colocada num cavalo. Fornece 5 de Armadura. + +Um tipo especial de Armadura que pode ser colocada num cavalo. Fornece 7 de Armadura. + +Um tipo especial de Armadura que pode ser colocada num cavalo. Fornece 11 de Armadura. + +Usado para atrelar criaturas ao jogador ou a postes de Vedação. + +Utilizada para nomear criaturas no mundo. + Restitui 2,5{*ICON_SHANK_01*}. Restitui 1{*ICON_SHANK_01*}. Podes usar até 6 vezes. @@ -628,7 +709,7 @@ As cores da cama são sempre as mesmas, independentemente das cores da lã usada Restitui 4{*ICON_SHANK_01*}. Cria-se cozinhando bife cru numa fornalha. -Restituem 1,5{*ICON_SHANK_01*} ou podem ser cozinhadas numa fornalha. +Restitui 1,5{*ICON_SHANK_01*} ou pode ser cozinhado numa fornalha. Restituem 4{*ICON_SHANK_01*}. Criadas ao cozinhar costeletas de porco cruas numa fornalha. @@ -646,7 +727,7 @@ As cores da cama são sempre as mesmas, independentemente das cores da lã usada Utilizada para enviar uma descarga elétrica ao ligar e desligar. Fica ligada ou desligada até ser premida novamente. -Envia constantemente uma descarga elétrica ou pode ser utilizada como receptor/transmissor quando ligada ao lado de um bloco. +Envia constantemente uma descarga elétrica ou pode ser utilizada como recetor/transmissor quando ligada ao lado de um bloco. Pode também ser utilizada para iluminação reduzida. Utilizado em circuitos de Redstone como repetidor, retardador e/ou díodo. @@ -661,7 +742,7 @@ Pode também ser utilizada para iluminação reduzida. Quando ativado, acelera as vagonetas que lhe passam por cima. Quando não está ativado, as vagonetas param. -Funciona como uma Placa de Pressão (envia um sinal de Redstone quando ativado), mas só pode ser ativado por uma vagoneta. +Funciona como uma Placa de Pressão (envia um sinal de Redstone quando ativado), mas só pode ser ativado por uma Vagoneta. Utilizada para te transportar a ti, um animal ou um monstro pelos carris. @@ -822,7 +903,7 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm Recolhido ao matar um esqueleto. Pode ser usado para criar farinha de ossos e para domesticar lobos. -Recolhido quando um esqueleto mata um Creeper. Pode ser reproduzido numa jukebox. +Recolhido quando um Esqueleto mata um Creeper. Pode ser reproduzido numa jukebox. Extingue incêndios e ajuda as plantações a crescer. Pode ser recolhida num balde. @@ -932,102 +1013,160 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm Pode ser colhido para recolher Grãos de Cacau. -As Cabeças de Mob podem ser colocadas como decoração ou usadas como máscara na ranhura de capacete. +As Cabeças de Criatura podem ser colocadas como decoração ou usadas como máscara na ranhura de capacete. +Utilizado para executar ordens. + +Projeta um feixe de luz para o céu e pode fornecer Efeitos de Estado a jogadores próximos. + +Armazena blocos e objetos lá dentro. Coloca dois baús lado a lado para criar um baú maior com o dobro da capacidade. O baú preso também cria uma carga de Redstone quando aberto. + +Fornece uma carga de Redstone. A carga será mais forte se houver mais objetos na placa. + +Fornece uma carga de Redstone. A carga será mais forte se houver mais objetos na placa. Requer mais peso do que a placa leve. + +Usado como fonte de poder de Redstone. Pode voltar a ser transformado em Redstone. + +Usado para apanhar objetos ou para transferi-los para dentro e para fora de contentores. + +Um tipo de carril que pode ativar ou desativar Vagonetas com Funis e despoletar Vagonetas com TNT. + +Usado para agarrar e soltar objetos, ou para empurrar objetos para outro contentor, quando recebe uma carga de Redstone. + +Blocos coloridos criados através da aplicação de tinta em Barro Endurecido. + +Pode ser dado como alimento a Cavalos, Burros ou Mulas para curar até 10 Corações. Acelera o crescimento dos potros. + +Criado através da fundição de Barro numa fornalha. + +Fabricado a partir de vidro e de uma tinta. + +Fabricado a partir de Vidro Manchado. + +Uma forma compacta de armazenar Carvão. Pode ser usado como combustível numa Fornalha. + Lula - + Solta sacos de tinta quando é morta. - + Vaca - + Solta cabedal quando é morta. Pode também ser ordenhada com um balde. - + Ovelha - + Solta lã quando é tosquiada (se ainda não tiver sido tosquiada). Pode ser pintada para que a sua lã ganhe uma cor diferente. - + Galinha - + Solta penas quando é morta e também põe ovos de forma aleatória. - + Porco - + Solta costeletas quando é morto. Pode ser montado utilizando uma sela. - + Lobo - + É dócil, mas, se o atacares, ele contra-ataca. Pode ser domado utilizando ossos, o que faz com que te siga e ataque tudo o que te atacar. - + Creeper - + Explode se te aproximares demasiado! - + Esqueleto - + Dispara setas contra ti. Solta setas quando é morto. - + Aranha - + Ataca-te quando te aproximas. Pode subir paredes. Solta fios quando é morta. - + Morto-vivo - + Ataca-te quando te aproximas. - + Pastor Morto-vivo - + Inicialmente dócil, ataca em grupos se for atacado. - + Medusa - + Dispara bolas flamejantes que explodem quando entram em contacto. - + Slime - + Divide-se em Slimes mais pequenos quando sofre danos. - + Enderman - + Ataca-te se olhares para ele. Consegue movimentar blocos. - + Peixe Prateado - + Atrai os Peixes Prateados escondidos quando atacado. Esconde-se nos blocos de pedra. - + Aranha da Caverna - + A sua mordidela é venenosa. - + Vacogumelos - + Usada com uma tigela para fazer guisado de cogumelos. Produz cogumelos e torna-se uma vaca normal quando tosquiada. - + Golem de Neve - + O Golem de Neve pode ser criado pelos jogadores com blocos de neve e uma abóbora. Enviam bolas de neve aos inimigos dos seus criadores. - + Ender Dragon - + Um grande dragão preto que se encontra no Fim. - + Blaze - + Inimigos que podem ser encontrados no Submundo, principalmente dentro das Fortalezas do Submundo. Produzem Varinhas de Blaze quando são mortos. - + Cubo de Magma - + Podem ser encontrados no Submundo. Semelhantes aos Slimes, dividem-se em versões mais pequenas quando são mortos. - + Aldeão - + Ocelote - + Podem ser encontrados em Selvas. Podem ser domesticados quando alimentados com Peixe Cru. Porém, tens de ser o Ocelote a aproximar-se de ti, pois qualquer movimento brusco vai assustá-lo. - + Golem de Ferro - + Aparece nas Aldeias para as proteger e pode ser criado usando Blocos de Ferro e Abóboras. - + +Morcego + +Estas criaturas voadoras estão em cavernas ou noutros grandes espaços fechados. + +Bruxa + +Estas inimigas estão nos pântanos e atacam-te atirando Poções. Largam Poções quando são mortas. + +Cavalo + +Estes animais podem ser domesticados e depois podem ser montados. + +Burro + +Estes animais podem ser domesticados e depois podem ser montados. Têm um baú preso a eles. + +Mula + +Nascem do cruzamento de um Cavalo com um Burro. Estes animais podem ser domesticados e depois podem ser montados e carregar baús. + +Cavalo Morto-vivo + +Cavalo Esqueleto + +Cérbero + +São criados a partir de Caveiras de Cérbero e Areia Movediça. Atiram caveiras explosivas contra ti. + Explosives Animator Concept Artist @@ -1374,6 +1513,8 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm Mapa +Mapa Vazio + Disco Música - "13" Disco Música - "cat" @@ -1434,7 +1575,7 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm Olho de Aranha -Olho de Aranha Fermentado +Olho Aranha Ferment. Pó de Blaze @@ -1452,7 +1593,7 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm Carga de Fogo -Carga de Fogo (Carvão veg.) +Carga Fogo (Carv. veg.) Carga de Fogo (Carvão) @@ -1476,6 +1617,28 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm Cabeça de Creeper +Estrela do Submundo + +Foguete Fogo de Art. + +Estrela Fogo de Art. + +Comparador de Redstone + +Vagoneta com TNT + +Vagoneta com Funil + +Armadura de Cavalo em Ferro + +Armadura de Cavalo em Ouro + +Armadura de Cavalo em Diamante + +Corda de Conduzir + +Etiqueta + Pedra Bloco de Erva @@ -1492,6 +1655,8 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm Tábuas Madeira Selva +Placas de Madeira (qualquer) + Rebento Carvalho Jovem @@ -1606,7 +1771,7 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm Placa Madeira Carvalho -Placa de Cobblestone +Placa Pedra Arredond. Placa de Tijolo @@ -1828,6 +1993,190 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm Caveira +Bloco de Ordens + +Farol + +Baú Preso + +Placa Pressão Pond. (Leve) + +Placa Press. Pond. (Pesada) + +Comparador de Redstone + +Sensor de Luz do Dia + +Bloco de Redstone + +Funil + +Carril Ativador + +Soltador + +Barro Manchado + +Fardo de Palha + +Barro Endurecido + +Bloco de Carvão + +Barro Manchado Preto + +Barro Manchado Vermelho + +Barro Manchado Verde + +Barro Manchado Castanho + +Barro Manchado Azul + +Barro Manchado Roxo + +Barro Manchado Azul Ciano + +Barro Manch. Cinz. Claro + +Barro Manchado Cinzento + +Barro Manchado Rosa + +Barro Manchado Lima + +Barro Manchado Amarelo + +Barro Manch. Azul Claro + +Barro Manchado Magenta + +Barro Manchado Laranja + +Barro Manchado Branco + +Vidro Manchado + +Vidro Manchado Preto + +Vidro Manchado Vermelho + +Vidro Manchado Verde + +Vidro Manchado Castanho + +Vidro Manchado Azul + +Vidro Manchado Roxo + +Vidro Manchado Azul Ciano + +Vidro Manchado Cinzento Claro + +Vidro Manchado Cinzento + +Vidro Manchado Rosa + +Vidro Manchado Lima + +Vidro Manchado Amarelo + +Vidro Manchado Azul Claro + +Vidro Manchado Magenta + +Vidro Manchado Laranja + +Vidro Manchado Branco + +Painel de Vidro Manchado + +Painel de Vidro Manchado Preto + +Painel de Vidro Manchado Vermelho + +Painel de Vidro Manchado Verde + +Painel de Vidro Manchado Castanho + +Painel de Vidro Manchado Azul + +Painel de Vidro Manchado Roxo + +Painel de Vidro Manchado Azul Ciano + +Painel de Vidro Manchado Cinzento Claro + +Painel de Vidro Manchado Cinzento + +Painel de Vidro Manchado Rosa + +Painel de Vidro Manchado Lima + +Painel de Vidro Manchado Amarelo + +Painel de Vidro Manchado Azul Claro + +Painel de Vidro Manchado Magenta + +Painel de Vidro Manchado Laranja + +Painel de Vidro Manchado Branco + +Bola Pequena + +Bola Grande + +Forma de Estrela + +Forma de Creeper + +Explosão + +Forma Desconhecida + +Preto + +Vermelho + +Verde + +Castanho + +Azul + +Roxo + +Azul Ciano + +Cinzento Claro + +Cinzento + +Rosa + +Lima + +Amarelo + +Azul Claro + +Magenta + +Laranja + +Branco + +Personalizado + +Desaparecimento + +Cintilância + +Rasto + +Duração do Voo: +  Controlos Atuais Esquema @@ -2005,8 +2354,7 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm Este é o teu inventário. Mostra os objetos disponíveis que tens na mão e todos os objetos que estás a transportar. A tua armadura também é mostrada aqui. - - + {*B*} Prime{*CONTROLLER_VK_A*} para continuar.{*B*} Prime{*CONTROLLER_VK_B*} se já sabes utilizar o inventário. @@ -2027,7 +2375,7 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm - Se quiseres saber mais sobre um determinado objeto, coloca o ponteiro sobre o objeto e prime{*CONTROLLER_VK_RT*}. + Se quiseres saber mais sobre um determinado objeto, coloca o ponteiro sobre o objeto e prime{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. @@ -2061,7 +2409,7 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm - Se quiseres saber mais sobre um determinado objeto, coloca o ponteiro sobre o objeto e prime{*CONTROLLER_VK_RT*}. + Se quiseres saber mais sobre um determinado objeto, coloca o ponteiro sobre o objeto e prime{*CONTROLLER_ACTION_MENU_PAGEDOWN*}. @@ -2425,7 +2773,7 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm - No baú nesta área existem alguns componentes para criar circuitos com pistões. Experimenta usar ou completar os circuitos nesta área ou cria o teu próprio circuito. Existem mais exemplos fora da área do tutorial. + No baú nesta área existem alguns componentes para criar circuitos com pistões. Experimenta usar ou completar os circuitos nesta área ou cria o teu próprio circuito. Há mais exemplos fora da área do tutorial. @@ -2443,7 +2791,7 @@ A tinta pode também ser feita combinando tinta cinza com farinha de ossos, perm - Para ativar um Portal do Submundo, incendeia os blocos de Obsidiana dentro da estrutura com Sílex e Aço. Os Portais podem ser desativados se a sua estrutura se partir, se ocorrer uma explosão nas proximidades ou se escorrer líquido sobre os blocos. + Para ativar um Portal do Submundo, incendeia os blocos de Obsidiana dentro da estrutura com Sílex e Aço. Os Portais podem ser desativados se a sua estrutura se partir, se ocorrer uma explosão nas proximidades ou se escorrer líquido através dos blocos. @@ -2608,6 +2956,211 @@ No modo de voo, podes manter premido{*CONTROLLER_ACTION_JUMP*} para subires e{*C Prime{*CONTROLLER_VK_B*} se já souberes tudo sobre a barra de comida e a alimentação. + + Esta é a interface de inventário do cavalo. + + + + {*B*}Prime {*CONTROLLER_VK_A*} para continuar. + {*B*}Prime {*CONTROLLER_VK_B*} se já souberes como usar o inventário do cavalo. + + + + O inventário do cavalo permite-te equipar ou transferir objetos para o teu Cavalo, Burro ou Mula. + + + + Sela o teu Cavalo colocando-lhe uma Sela na ranhura para selas. Os Cavalos podem receber uma Armadura de Cavalo na ranhura para armaduras. + + + + Neste menu também podes transferir objetos entre o teu inventário e os alforjes presos aos Burros e Mulas. + + +Encontraste um Cavalo. + +Encontraste um Burro. + +Encontraste uma Mula. + + + {*B*}Prime {*CONTROLLER_VK_A*} para saber mais sobre Cavalos, Burros e Mulas. + {*B*}Prime {*CONTROLLER_VK_B*} se já souberes o que precisas sobre Cavalos, Burros e Mulas. + + + + Os Cavalos e os Burros estão sobretudo nas planícies. As Mulas podem ser criadas cruzando um Burro com um Cavalo, mas são inférteis. + + + + Todos os Cavalos, Burros e Mulas adultos podem ser montados. Porém, só os Cavalos podem receber uma armadura, e só as Mulas e os Burros podem ser equipados com alforjes para transportar objetos. + + + + Os Cavalos, os Burros e as Mulas têm de ser domesticados antes de poderem ser usados. Para domesticar um cavalo é preciso tentar montá-lo e conseguir permanecer em cima dele enquanto ele tenta sacudir o jogador para o chão. + + + + Quando ficam domesticados, surgem Corações de Amor à volta deles e deixam de tentar sacudir o jogador. + + + + Experimenta montar este cavalo agora. Usa {*CONTROLLER_ACTION_USE*} sem objetos ou ferramentas na mão para montá-lo. + + + + Para guiar um cavalo, tens de equipá-lo com uma sela, que podes comprar aos aldeões ou encontrar dentro de baús escondidos no mundo. + + + + Burros e Mulas domesticados podem receber alforjes se lhes prenderes um baú. Podes aceder aos alforjes enquanto montas ou quando te aproximas furtivamente do animal. + + + + Os Cavalos e os Burros (as Mulas não) podem ser procriados como os outros animais, usando Maçãs Douradas ou Cenouras Douradas. Os potros tornam-se cavalos adultos ao fim de algum tempo, mas podes acelerar o processo alimentando-os com trigo ou feno. + + + + Podes tentar domesticar Cavalos e Burros aqui, e nos baús que por aqui andam também encontrarás Selas, Armaduras de Cavalo e outros objetos úteis para Cavalos. + + + + Esta é a interface do Farol, que podes usar para escolher os poderes que o teu Farol concede. + + + + {*B*}Prime {*CONTROLLER_VK_A*} para continuar. + {*B*}Prime {*CONTROLLER_VK_B*} se já sabes como usar a interface do Farol. + + + + No menu do Farol podes selecionar 1 poder principal para o teu Farol. Quanto mais camadas tiver a tua pirâmide, mais poderes terás à escolha. + + + + Um Farol numa pirâmide com pelo menos 4 camadas permite-te escolher entre o poder secundário de Regeneração ou um poder principal mais forte. + + + + Para definir os poderes do teu Farol tens de sacrificar uma Esmeralda, um Diamante, Lingotes de Ferro ou Ouro na ranhura de pagamento. Uma vez definidos, os poderes irão emanar indefinidamente do Farol. + + +No topo desta pirâmide há um Farol inativo. + + + {*B*}Prime {*CONTROLLER_VK_A*} para saber mais sobre Faróis. + {*B*}Prime {*CONTROLLER_VK_B*} se já sabes o que precisas sobre Faróis. + + + + Os Faróis Ativos projetam um feixe de luz brilhante para o céu e atribuem poderes a jogadores próximos. São feitos com Vidro, Obsidiana e Estrelas do Submundo, que podem ser obtidas derrotando o Cérbero. + + + + Os Faróis têm de ser colocados de modo a captar a luz solar durante o dia. Os Faróis têm de ser colocados sobre Pirâmides de Ferro, Ouro, Esmeralda ou Diamante. Porém, o tipo de material não tem qualquer efeito na potência do farol. + + + + Experimenta usar o Farol para definir os poderes que ele concede. Podes usar os Lingotes de Ferro disponibilizados como forma de pagamento. + + +Esta divisão contém Funis. + + + {*B*}Prime {*CONTROLLER_VK_A*} para saber mais sobre Funis. + {*B*}Prime {*CONTROLLER_VK_B*} se já sabes o que precisas sobre Funis. + + + + Os Funis são usados para inserir ou remover objetos de contentores, e para recolher automaticamente os objetos que são atirados neles. + + + + Eles podem afetar Postos de Poções, Baús, Distribuidores, Soltadores, Vagonetas com Baús, Vagonetas com Funis, bem como outros Funis. + + + + Os Funis vão tentar sempre sugar objetos dos contentores adequados acima deles. Também vão tentar inserir objetos armazenados num contentor de destino. + + + + Porém, se um Funil for alimentado por Redstone tornar-se-á inativo e parará de sugar e de inserir objetos. + + + + Um Funil aponta na direção em que tenta colocar objetos. Para levar um Funil a apontar para um determinado bloco, coloca-o frente a esse bloco enquanto andas furtivamente. + + + + Há vários modelos de Funil para veres e experimentares nesta divisão. + + + + Esta é a interface do Fogo de Artifício, que podes usar para criar Fogo de Artifício e Estrelas de Fogo de Artifício. + + + + {*B*}Prime {*CONTROLLER_VK_A*} para continuar. + {*B*}Prime {*CONTROLLER_VK_B*} se já sabes como usar a interface do Farol. + + + + Para criar um Fogo de Artifício, coloca Pólvora e Papel na grelha de 3x3 que é apresentada acima do teu inventário. + + + + Opcionalmente, podes colocar várias Estrelas de Fogo de Artifício na grelha e adicioná-las ao Fogo de Artifício. + + + + Preencher mais ranhuras na grelha com Pólvora aumentará a altura a que todas as Estrelas de Fogo de Artifício vão explodir. + + + + Podes então retirar o Fogo de Artifício criado da ranhura de saída. + + + + As Estrelas de Fogo de Artifício podem ser criadas colocando Pólvora e Tinta na grelha. + + + + A tinta definirá a cor da explosão da Estrela de Fogo de Artifício. + + + + A forma da Estrela de Fogo de Artifício é definida adicionando um destes elementos: Carga de Fogo, Pepita de Ouro, Pena ou Cabeça de Criatura. + + + + Podes adicionar um rasto ou uma cintilância usando Diamantes ou Pó de Glowstone. + + + + Depois de criares uma Estrela de Fogo de Artifício, podes definir a cor de desaparecimento da Estrela de Fogo de Artifício criando-a com Tinta. + + + + Dentro dos baús há vários objetos que podem ser usados na criação de FOGO DE ARTIFÃCIO! + + + + {*B*}Prime{*CONTROLLER_VK_A*} para saber mais sobre Fogo de Artifício. + {*B*}Prime{*CONTROLLER_VK_B*} se já sabes o que queres sobre Fogo de Artifício. + + + + O Fogo de Artifício é um objeto decorativo que pode ser lançado à mão ou a partir de Distribuidores. É feito usando Papel, Pólvora e, opcionalmente, uma série de Estrelas de Fogo de Artifício. + + + + As cores, o desaparecimento, a forma, a dimensão e os efeitos (como rastos e cintilâncias) das Estrelas de Fogo de Artifício podem ser personalizados através da inclusão de ingredientes extra aquando da criação. + + + + Experimenta criar um Fogo de Artifício na Mesa de Criação usando um sortido de ingredientes dos baús. + +  Selecionar Usar @@ -2646,25 +3199,25 @@ No modo de voo, podes manter premido{*CONTROLLER_ACTION_JUMP*} para subires e{*C Retirar -Retirar tudo +Retirar Tudo -Retirar metade +Retirar Metade Colocar -Colocar tudo +Colocar Tudo -Colocar um +Colocar Um Largar -Largar tudo +Largar Tudo -Largar um +Largar Um Trocar -Mover rápido +Mover Rápido Limpar Seleção Rápida @@ -2830,6 +3383,22 @@ No modo de voo, podes manter premido{*CONTROLLER_ACTION_JUMP*} para subires e{*C Carregar Gravação para Xbox One +Montar + +Desmontar + +Prender Baú + +Lançar + +Atrelar + +Soltar + +Prender + +Nomear + OK Cancelar @@ -2842,7 +3411,7 @@ No modo de voo, podes manter premido{*CONTROLLER_ACTION_JUMP*} para subires e{*C Guardar Jogo -Sair sem guardar +Sair Sem Guardar Tens a certeza de que queres substituir os jogos guardados anteriormente pela versão atual deste mundo? @@ -3058,7 +3627,7 @@ Queres desbloquear o jogo completo? Vários -Preparação de Poções +Poções Poções @@ -3140,6 +3709,20 @@ Queres desbloquear o jogo completo? Distribuidor +Cavalo + +Soltador + +Funil + +Farol + +Poder Principal + +Poder Secundário + +Vagoneta + De momento, não existem ofertas de conteúdo transferível deste tipo disponíveis para este título. %s juntou-se ao jogo. @@ -3203,7 +3786,7 @@ Queres desbloquear o jogo completo? O jogo no qual pretendes participar encontra-se na tua lista de níveis excluídos. Se quiseres participar neste jogo, o nível será removido da lista de níveis excluídos. -Excluir este nível? +Excluir Este Nível? Tens a certeza de que queres adicionar este nível à lista de níveis excluídos? Se selecionares OK, irás sair do jogo. @@ -3225,7 +3808,7 @@ Não desligues a consola Xbox 360 enquanto este ícone estiver visível. Opacidade da Interface -A preparar gravação automática do nível +A Preparar Gravação Automática do Nível Tamanho HUD @@ -3299,10 +3882,14 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? Modo Criativo +Modo de Jogo: Aventura + Sobrevivência Criativo +Aventura + Criado em Sobrevivência Criado em Criativo @@ -3323,6 +3910,8 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? Superplano +Introduz uma semente para gerar novamente o mesmo terreno. Deixa em branco para um mundo aleatório. + Quando ativado, o jogo ficará online. Quando ativado, só os jogadores convidados podem aderir. @@ -3347,6 +3936,20 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? Quanto ativada, é criado um baú com objetos úteis junto ao ponto de regeneração do jogador. +Quando desativada, impede que monstros e animais mudem blocos (por exemplo, explosões de Creeper não destroem blocos e as Ovelhas não comem Erva) ou apanhem objetos. + +Quando ativado, os jogadores mantêm o inventário quando morrem. + +Quando desativada, as criaturas não se reproduzem naturalmente. + +Quando desativado, os monstros e animais não deixam cair saques (por exemplo, os Creepers não largam pólvora). + +Quando desativada, os blocos não largam objetos quando são destruídos (por exemplo, os blocos de Pedra não deixam cair Pedra Arredondada). + +Quando desativada, os jogadores não regeneram naturalmente a sua saúde. + +Quando desativado, a hora do dia não muda. + Pacotes de Skins Temas @@ -3395,7 +3998,49 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? {*PLAYER*} foi agredido por {*SOURCE*} -{*PLAYER*} foi morto por {*SOURCE*} +{*PLAYER*} foi morto por {*SOURCE*} usando magia + +{*PLAYER*} caiu de uma escada + +{*PLAYER*} caiu de umas videiras + +{*PLAYER*} caiu fora da água + +{*PLAYER*} caiu de um local elevado + +{*PLAYER*} foi condenado a cair por {*SOURCE*} + +{*PLAYER*} foi condenado a cair por {*SOURCE*} + +{*PLAYER*} foi condenado a cair por {*SOURCE*} usando {*ITEM*} + +{*PLAYER*} caiu demasiado longe e foi liquidado por {*SOURCE*} + +{*PLAYER*} caiu demasiado longe e foi liquidado por {*SOURCE*} usando {*ITEM*} + +{*PLAYER*} entrou no fogo enquanto combatia {*SOURCE*} + +{*PLAYER*} ficou esturricado enquanto combatia {*SOURCE*} + +{*PLAYER*} tentou nadar em lava para fugir de {*SOURCE*} + +{*PLAYER*} afogou-se enquanto tentava fugir de {*SOURCE*} + +{*PLAYER*} foi de encontro a um cato enquanto tentava fugir de {*SOURCE*} + +{*PLAYER*} foi rebentado por {*SOURCE*} + +{*PLAYER*} feneceu + +{*PLAYER*} foi assassinado por {*SOURCE*} usando {*ITEM*} + +{*PLAYER*} foi alvejado por {*SOURCE*} usando {*ITEM*} + +{*PLAYER*} foi atingido por uma bola de fogo por {*SOURCE*} usando {*ITEM*} + +{*PLAYER*} foi esmagado por {*SOURCE*} usando {*ITEM*} + +{*PLAYER*} foi morto por {*SOURCE*} usando {*ITEM*} Rochas Enevoadas @@ -3427,9 +4072,9 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? Já não podes usar contentores (tais como baús) -Já não podes atacar habitantes +Já não podes atacar criaturas -Já podes atacar habitantes +Já podes atacar criaturas Já não podes atacar jogadores @@ -3560,9 +4205,9 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? Não Repor Submundo -De momento, não é possível tosquiar este Vacogumelo. Foi alcançado o número máximo de Porcos, Ovelhas, Vacas e Gatos. +De momento, não é possível tosquiar este Vacogumelo. Foi alcançado o número máximo de Porcos, Ovelhas, Vacas, Gatos e Cavalos. -De momento, não é possível usar o Ovo de Geração. O número máximo de Porcos, Ovelhas, Vacas e Gatos foi alcançado. +De momento, não é possível usar o Ovo de Geração. O número máximo de Porcos, Ovelhas, Vacas, Gatos e Cavalos foi alcançado. De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de Vacogumelos. @@ -3572,6 +4217,8 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de Lulas num mundo. +De momento, não é possível usar Ovo de Geração. Foi alcançado o número máximo de Morcegos num mundo. + De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de inimigos num mundo. De momento, não é possível usar o Ovo de Geração. Foi alcançado o número máximo de aldeões num mundo. @@ -3580,17 +4227,19 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? Não podes produzir inimigos no modo Calmo. -Este animal não pode entrar no Modo Amor. O número máximo de Porcos, Ovelhas, Vacas e Gatos de criação foi alcançado. +Este animal não pode entrar no Modo Amor. O número máximo de Porcos, Ovelhas, Vacas, Gatos e Cavalos de criação foi alcançado. Este animal não pode entrar no Modo Amor. Foi alcançado o número máximo de Lobos de criação. Este animal não pode entrar no Modo Amor. Foi alcançado o número máximo de Galinhas de criação. +Este animal não pode entrar no Modo Amor. Foi alcançado o número máximo de cavalos de criação. + Este animal não pode entrar no Modo Amor. Foi alcançado o número máximo de Vacogumelos de criação. Foi alcançado o número máximo de Barcos num mundo. -O número máximo de Cabeças de Mob num mundo foi alcançado. +O número máximo de Cabeças de Criatura num mundo foi alcançado. Inverter @@ -3600,7 +4249,7 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? Regenerar -Conteúdo transferível +Conteúdo Transferível Alterar Skin @@ -3613,27 +4262,43 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? Ficha técnica Reinstalar Conteúdo - + Definições de Depuração - + Fogos Propagados - + Explosões de TNT - + Jogador vs. Jogador - + Confiar nos Jogadores - + Privilégios de Anfitrião - + Gerar Estruturas - + Mundo Superplano - + Baú de Bónus - + Opções de Mundo - + +Opções de Jogo + +Perturbação de Criaturas + +Manter Inventário + +Geração de Criaturas + +Saques de Criaturas + +Queda de Peças + +Regeneração Natural + +Ciclo da Luz do Dia + Pode Construir e Escavar Pode Usar Portas e Interruptores @@ -3672,7 +4337,7 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? Semente para o Gerador de Mundos -Deixar livre para uma semente aleatória +Deixar livre p/ semente aleatória Jogadores @@ -3820,6 +4485,14 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? Veneno +Cérbero + +Aumento de Saúde + +Absorção + +Saturação + de Velocidade de Lentidão @@ -3858,6 +4531,14 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? de Veneno +de Decadência + +de Aumento de Saúde + +de Absorção + +de Saturação + II @@ -3954,6 +4635,22 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? Reduz a saúde dos jogadores, animais e monstros afetados ao longo do tempo. +Quando se Aplica: + +Força de Salto de Cavalo + +Reforços Mortos-vivos + +Saúde Máx. + +Alcance de Seguimento das Criaturas + +Resistência a Ataques + +Velocidade + +Danos de Ataque + Precisão Golpear @@ -4044,7 +4741,7 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? Restitui 3{*ICON_SHANK_01*}. Cria-se cozendo uma batata numa fornalha. -Restitui 1{*ICON_SHANK_01*} ou pode ser cozida numa fornalha. Pode ser plantada na terra. Se comeres isto podes ficar doente. +Restitui 1{*ICON_SHANK_01*}. Se comeres isto podes ficar envenenado. Restitui 3{*ICON_SHANK_01*}. Fabricada a partir de uma cenoura e de pepitas de ouro. @@ -4112,7 +4809,7 @@ Queres instalar o pacote de mistura ou pacote de texturas agora? Bloco de Quartzo -Bloco de Quartzo Esculpido +Bloc. Quartzo Esculpido Bloco Pilar de Quartzo @@ -4442,11 +5139,11 @@ Todos os Baús Ender de um mundo estão ligados. Os objetos colocados num Baú E Xbox 360 -BACK +Anterior Esta opção desativa as atualizações dos feitos e das classificações para este mundo durante o jogo e também ao carregá-lo novamente após guardar com esta opção ativa. -Carregar Gravação para Xbox One +Carregar Grav. Xbox One Carregar Gravação diff --git a/Minecraft.Client/Common/Media/skin.swf b/Minecraft.Client/Common/Media/skin.swf index c4660d59..6206ca47 100644 Binary files a/Minecraft.Client/Common/Media/skin.swf and b/Minecraft.Client/Common/Media/skin.swf differ diff --git a/Minecraft.Client/Common/Media/skinGraphics.swf b/Minecraft.Client/Common/Media/skinGraphics.swf index 8438f11d..f0482ec7 100644 Binary files a/Minecraft.Client/Common/Media/skinGraphics.swf and b/Minecraft.Client/Common/Media/skinGraphics.swf differ diff --git a/Minecraft.Client/Common/Media/skinGraphicsHud.swf b/Minecraft.Client/Common/Media/skinGraphicsHud.swf index 55123e69..7f75f423 100644 Binary files a/Minecraft.Client/Common/Media/skinGraphicsHud.swf and b/Minecraft.Client/Common/Media/skinGraphicsHud.swf differ diff --git a/Minecraft.Client/Common/Media/skinGraphicsInGame.swf b/Minecraft.Client/Common/Media/skinGraphicsInGame.swf index 6612beaf..639f5bda 100644 Binary files a/Minecraft.Client/Common/Media/skinGraphicsInGame.swf and b/Minecraft.Client/Common/Media/skinGraphicsInGame.swf differ diff --git a/Minecraft.Client/Common/Media/skinHD.swf b/Minecraft.Client/Common/Media/skinHD.swf index c80fa406..12d35caf 100644 Binary files a/Minecraft.Client/Common/Media/skinHD.swf and b/Minecraft.Client/Common/Media/skinHD.swf differ diff --git a/Minecraft.Client/Common/Media/skinHDGraphics.swf b/Minecraft.Client/Common/Media/skinHDGraphics.swf index 27e3798a..7ba08bc8 100644 Binary files a/Minecraft.Client/Common/Media/skinHDGraphics.swf and b/Minecraft.Client/Common/Media/skinHDGraphics.swf differ diff --git a/Minecraft.Client/Common/Media/skinHDGraphicsHud.swf b/Minecraft.Client/Common/Media/skinHDGraphicsHud.swf index 2c467474..bb51379e 100644 Binary files a/Minecraft.Client/Common/Media/skinHDGraphicsHud.swf and b/Minecraft.Client/Common/Media/skinHDGraphicsHud.swf differ diff --git a/Minecraft.Client/Common/Media/skinHDGraphicsInGame.swf b/Minecraft.Client/Common/Media/skinHDGraphicsInGame.swf index 7a39b099..d014d317 100644 Binary files a/Minecraft.Client/Common/Media/skinHDGraphicsInGame.swf and b/Minecraft.Client/Common/Media/skinHDGraphicsInGame.swf differ diff --git a/Minecraft.Client/Common/Media/skinHDHud.swf b/Minecraft.Client/Common/Media/skinHDHud.swf index fcdbe396..0e2a9ef2 100644 Binary files a/Minecraft.Client/Common/Media/skinHDHud.swf and b/Minecraft.Client/Common/Media/skinHDHud.swf differ diff --git a/Minecraft.Client/Common/Media/skinHDInGame.swf b/Minecraft.Client/Common/Media/skinHDInGame.swf index cfc91228..b9aaa068 100644 Binary files a/Minecraft.Client/Common/Media/skinHDInGame.swf and b/Minecraft.Client/Common/Media/skinHDInGame.swf differ diff --git a/Minecraft.Client/Common/Media/skinHDLabels.swf b/Minecraft.Client/Common/Media/skinHDLabels.swf index 5ed2b349..dd80d1e7 100644 Binary files a/Minecraft.Client/Common/Media/skinHDLabels.swf and b/Minecraft.Client/Common/Media/skinHDLabels.swf differ diff --git a/Minecraft.Client/Common/Media/skinHud.swf b/Minecraft.Client/Common/Media/skinHud.swf index c98bf708..31b3ff00 100644 Binary files a/Minecraft.Client/Common/Media/skinHud.swf and b/Minecraft.Client/Common/Media/skinHud.swf differ diff --git a/Minecraft.Client/Common/Media/skinInGame.swf b/Minecraft.Client/Common/Media/skinInGame.swf index bee85d33..fd3147b6 100644 Binary files a/Minecraft.Client/Common/Media/skinInGame.swf and b/Minecraft.Client/Common/Media/skinInGame.swf differ diff --git a/Minecraft.Client/Common/Media/skinLabels.swf b/Minecraft.Client/Common/Media/skinLabels.swf index 04a41d33..e562acbe 100644 Binary files a/Minecraft.Client/Common/Media/skinLabels.swf and b/Minecraft.Client/Common/Media/skinLabels.swf differ diff --git a/Minecraft.Client/Common/Media/skin_Minecraft.xui b/Minecraft.Client/Common/Media/skin_Minecraft.xui index 5d4517d2..da03a9ab 100644 --- a/Minecraft.Client/Common/Media/skin_Minecraft.xui +++ b/Minecraft.Client/Common/Media/skin_Minecraft.xui @@ -2,7 +2,7 @@ 1280.000000 720.000000 -[LayerFolders]5|+How To Play|34|+|0|+ControllerIcons|3|+|0|+Creative Inventory|8|+|0|+Crafting Scene|16|+|0|+Scenes, Panels,etc|14|+|0|+Main Menu|4|+|0|+DLC|4|+|0|+Skin Select Scene|15|+|0|+HTML|4|+|0|+HUD|18|+|0|+Inventory Containers Special|34|+|0|+Inventory Containers Shared|22|+|0|+Lists|0|+Leaderboard|4|+|0|+Players|6|+|25|+|0|+Tooltips|20|+|0|+Credits|8|+|0|-Labels and Text|53|+|0|-Other|11|+|0|+ImagePresenters|2|+|0|-Default Controls|18|+|0[/LayerFolders] +[LayerFolders]7|+How To Play|44|+|0|+ControllerIcons|3|+|0|+Creative Inventory|8|+|0|+Crafting Scene|16|+|0|+Scenes, Panels,etc|14|+|0|+Main Menu|4|+|0|+DLC|4|+|0|+Skin Select Scene|15|+|0|+HTML|4|+|0|+HUD|19|+|0|-Inventory Containers Special|41|+|0|+Inventory Containers Shared|24|+|0|+Lists|0|+Leaderboard|4|+|0|+Players|6|+|25|+|0|+Tooltips|22|+|0|+Credits|8|+|0|-Labels and Text|53|+|0|+Other|11|+|0|+ImagePresenters|2|+|0|+Default Controls|18|+|0[/LayerFolders] @@ -12951,6 +12951,406 @@ +RStick_Button +350.000000 +36.000000 + + + +text_ButtonText +300.000000 +36.000000 +61.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +16.000000 +20497 + + + + +rs_graphic +58.000000 +48.000000 +0.000000,-5.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonRS_TT.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + +rs_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +0.000000,-5.000000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-5.000000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +0.000000,-5.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-5.000000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-5.000000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +1.500000,-0.750000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-5.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + + + + +RStick_ButtonSmall +350.000000 +25.000000 + + + +text_ButtonText +300.000000 +25.000000 +43.000000,0.000000,0.000000 +1 +0xffffffff +0xff000000 +11.000000 +20497 + + + + +rb_graphic +40.000000 +34.000000 +0.000000,-3.000000,0.000000 +0.800000 +16 +Graphics\X360ControllerIcons\ButtonRS_TT.png +48 + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +EndFocusDisable + +stop + + +Press + + + +EndPress + +stop + + +InitFocus + + + +InitFocusLoop + + + +EndInitFocus + +gotoandplay +InitFocusLoop + + +InitFocusDisable + + + +EndInitFocusDisable + +stop + + + +text_ButtonText +TextColor + + +0 +0xffffffff + + + +0 +0xff606060 + + + +0 +0xff606060 + + + +0 +0xffa0a0a0 + + + +0 +0xffffffff + + + +rb_graphic +Opacity +Scale +Position + + +1 +0.800000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.300000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +0 +1.000000 +0.900000,0.900000,1.000000 +1.500000,1.250000,0.000000 + + + +1 +1.000000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + +1 +0.500000 +1.000000,1.000000,1.000000 +0.000000,-3.000000,0.000000 + + + + + + XuiListTexturePackButtonSmall 40.000000 40.000000 @@ -29314,6 +29714,177 @@ +ItemIconBlankSmall +22.000000 +22.000000 + + + +image +22.000000 +22.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + + + + +ItemIconBlank +42.000000 +42.000000 + + + +image +38.000000 +38.000000 +2.000000,2.000000,0.000000 +15 +CXuiCtrlMinecraftSlot +XuiVisualImagePresenter + + + + + +Normal + + + +EndNormal + +stop + + +Focus + + + +FocusLoop + + + +EndFocus + +gotoandplay +FocusLoop + + +NormalDisable + + + +EndNormalDisable + +stop + + +FocusDisable + + + +InactiveFocusLoop + + + +EndFocusDisable + +gotoandplay +InactiveFocusLoop + + +Press + + + +EndPress + +stop + + +NormalSel + + + +EndNormalSel + +stop + + + + + + ItemIcon 64.000000 64.000000 @@ -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..940a148e 100644 --- a/Minecraft.Client/Common/Network/GameNetworkManager.cpp +++ b/Minecraft.Client/Common/Network/GameNetworkManager.cpp @@ -6,6 +6,7 @@ #include "..\..\..\Minecraft.World\ThreadName.h" #include "..\..\..\Minecraft.World\Entity.h" #include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.h" +#include "..\..\..\Minecraft.World\FireworksRecipe.h" #include "..\..\ClientConnection.h" #include "..\..\Minecraft.h" #include "..\..\User.h" @@ -30,7 +31,7 @@ #ifdef _XBOX #include "Common\XUI\XUI_PauseMenu.h" -#elif !(defined __PSVITA__) +#else #include "Common\UI\UI.h" #include "Common\UI\UIScene_PauseMenu.h" #include "..\..\Xbox\Network\NetworkPlayerXbox.h" @@ -204,7 +205,79 @@ bool CGameNetworkManager::StartNetworkGame(Minecraft *minecraft, LPVOID lpParame } else { - param->seed = seed = app.getLevelGenerationOptions()->getLevelSeed(); + param->seed = seed = app.getLevelGenerationOptions()->getLevelSeed(); + + if(param->levelGen->isTutorial()) + { + // Load the tutorial save data here + if(param->levelGen->requiresBaseSave() && !param->levelGen->getBaseSavePath().empty() ) + { +#ifdef _XBOX +#ifdef _TU_BUILD + wstring fileRoot = L"UPDATE:\\res\\GameRules\\" + param->levelGen->getBaseSavePath(); +#else + wstring fileRoot = L"GAME:\\res\\TitleUpdate\\GameRules\\" + param->levelGen->getBaseSavePath(); +#endif +#else +#ifdef _WINDOWS64 + wstring fileRoot = L"Windows64Media\\Tutorial\\" + param->levelGen->getBaseSavePath(); + File root(fileRoot); + if(!root.exists()) fileRoot = L"Windows64\\Tutorial\\" + param->levelGen->getBaseSavePath(); +#elif defined(__ORBIS__) + wstring fileRoot = L"/app0/orbis/Tutorial/" + param->levelGen->getBaseSavePath(); +#elif defined(__PSVITA__) + wstring fileRoot = L"PSVita/Tutorial/" + param->levelGen->getBaseSavePath(); +#elif defined(__PS3__) + wstring fileRoot = L"PS3/Tutorial/" + param->levelGen->getBaseSavePath(); +#else + wstring fileRoot = L"Tutorial\\" + param->levelGen->getBaseSavePath(); +#endif +#endif + File grf(fileRoot); + if (grf.exists()) + { +#ifdef _UNICODE + wstring path = grf.getPath(); + const WCHAR *pchFilename=path.c_str(); + HANDLE fileHandle = CreateFile( + pchFilename, // file name + GENERIC_READ, // access mode + 0, // share mode // TODO 4J Stu - Will we need to share file? Probably not but... + NULL, // Unused + OPEN_EXISTING , // how to create // TODO 4J Stu - Assuming that the file already exists if we are opening to read from it + FILE_FLAG_SEQUENTIAL_SCAN, // file attributes + NULL // Unsupported + ); +#else + const char *pchFilename=wstringtofilename(grf.getPath()); + HANDLE fileHandle = CreateFile( + pchFilename, // file name + GENERIC_READ, // access mode + 0, // share mode // TODO 4J Stu - Will we need to share file? Probably not but... + NULL, // Unused + OPEN_EXISTING , // how to create // TODO 4J Stu - Assuming that the file already exists if we are opening to read from it + FILE_FLAG_SEQUENTIAL_SCAN, // file attributes + NULL // Unsupported + ); +#endif + + if( fileHandle != INVALID_HANDLE_VALUE ) + { + DWORD bytesRead,dwFileSize = GetFileSize(fileHandle,NULL); + PBYTE pbData = (PBYTE) new BYTE[dwFileSize]; + BOOL bSuccess = ReadFile(fileHandle,pbData,dwFileSize,&bytesRead,NULL); + if(bSuccess==FALSE) + { + app.FatalLoadError(); + } + CloseHandle(fileHandle); + + // 4J-PB - is it possible that we can get here after a read fail and it's not an error? + param->levelGen->setBaseSaveData(pbData, dwFileSize); + } + } + } + } } } } @@ -694,7 +767,7 @@ int CGameNetworkManager::JoinFromInvite_SignInReturned(void *pParam,bool bContin { UINT uiIDA[1]; uiIDA[0] = IDS_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); return 0; } @@ -738,7 +811,7 @@ int CGameNetworkManager::JoinFromInvite_SignInReturned(void *pParam,bool bContin { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); } else { @@ -856,6 +929,16 @@ int CGameNetworkManager::ServerThreadProc( void* lpParameter ) NetworkGameInitData *param = (NetworkGameInitData *)lpParameter; seed = param->seed; app.SetGameHostOption(eGameHostOption_All,param->settings); + + // 4J Stu - If we are loading a DLC save that's separate from the texture pack, load + if( param->levelGen != NULL && (param->texturePackId == 0 || param->levelGen->getRequiredTexturePackId() != param->texturePackId) ) + { + while((Minecraft::GetInstance()->skins->needsUIUpdate() || ui.IsReloadingSkin())) + { + Sleep(1); + } + param->levelGen->loadBaseSaveData(); + } } SetThreadName(-1, "Minecraft Server thread"); @@ -867,6 +950,7 @@ int CGameNetworkManager::ServerThreadProc( void* lpParameter ) Entity::useSmallIds(); Level::enableLightingCache(); Tile::CreateNewThreadStorage(); + FireworksRecipe::CreateNewThreadStorage(); MinecraftServer::main(seed, lpParameter); //saveData, app.GetGameHostOption(eGameHostOption_All)); @@ -889,10 +973,7 @@ int CGameNetworkManager::ExitAndJoinFromInviteThreadProc( void* lpParam ) Compression::UseDefaultThreadStorage(); //app.SetGameStarted(false); - -#ifndef __PSVITA__ UIScene_PauseMenu::_ExitWorld(NULL); -#endif while( g_NetworkManager.IsInSession() ) { @@ -900,7 +981,7 @@ int CGameNetworkManager::ExitAndJoinFromInviteThreadProc( void* lpParam ) } // Xbox should always be online when receiving invites - on PS3 we need to check & ask the user to sign in -#ifndef __PS3__ +#if !defined(__PS3__) && !defined(__PSVITA__) JoinFromInviteData *inviteData = (JoinFromInviteData *)lpParam; app.SetAction(inviteData->dwUserIndex, eAppAction_JoinFromInvite, lpParam); #else @@ -914,7 +995,7 @@ int CGameNetworkManager::ExitAndJoinFromInviteThreadProc( void* lpParam ) UINT uiIDA[2]; uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CGameNetworkManager::MustSignInReturned_0,lpParam, app.GetStringTable()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CGameNetworkManager::MustSignInReturned_0,lpParam); } #endif @@ -1053,16 +1134,16 @@ int CGameNetworkManager::ChangeSessionTypeThreadProc( void* lpParam ) { if(g_NetworkManager.m_bSignedOutofPSN) { - C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME, IDS_ERROR_PSN_SIGN_OUT, uiIDA,1,ProfileManager.GetPrimaryPad()); + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME, IDS_ERROR_PSN_SIGN_OUT, uiIDA,1,ProfileManager.GetPrimaryPad()); } else { - C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME, uiIDA,1,ProfileManager.GetPrimaryPad()); + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME, uiIDA,1,ProfileManager.GetPrimaryPad()); } } else { - C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_CONNECTION_LOST, g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT), uiIDA,1,ProfileManager.GetPrimaryPad()); + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_CONNECTION_LOST, g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_LIVE_NO_EXIT), uiIDA,1,ProfileManager.GetPrimaryPad()); } // Swap these two messages around as one is too long to display at 480 @@ -1073,7 +1154,7 @@ int CGameNetworkManager::ChangeSessionTypeThreadProc( void* lpParam ) { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - C4JStorage::EMessageResult result = ui.RequestMessageBox( IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME, IDS_IN_PARTY_SESSION_FULL, uiIDA,1,ProfileManager.GetPrimaryPad()); + C4JStorage::EMessageResult result = ui.RequestErrorMessage( IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME, IDS_IN_PARTY_SESSION_FULL, uiIDA,1,ProfileManager.GetPrimaryPad()); pMinecraft->progressRenderer->progressStartNoAbort( IDS_PROGRESS_CONVERTING_TO_OFFLINE_GAME ); pMinecraft->progressRenderer->progressStage( -1 ); } @@ -1215,6 +1296,13 @@ int CGameNetworkManager::ChangeSessionTypeThreadProc( void* lpParam ) // Update the network player pMinecraft->m_pendingLocalConnections[index]->getConnection()->getSocket()->setPlayer(g_NetworkManager.GetLocalPlayerByUserIndex(index)); } + else if ( pMinecraft->m_connectionFailed[index] && (pMinecraft->m_connectionFailedReason[index] == DisconnectPacket::eDisconnect_ConnectionCreationFailed) ) + { + pMinecraft->removeLocalPlayerIdx(index); +#ifdef _XBOX_ONE + ProfileManager.RemoveGamepadFromGame(index); +#endif + } } } } @@ -1572,7 +1660,7 @@ void CGameNetworkManager::GameInviteReceived( int userIndex, const INVITE_INFO * // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive if the npAvailability isn't SCE_OK UINT uiIDA[1]; uiIDA[0]=IDS_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive); } else if (ProfileManager.isSignedInPSN(iPadNotSignedInLive)) { @@ -1581,60 +1669,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 +1742,22 @@ void CGameNetworkManager::GameInviteReceived( int userIndex, const INVITE_INFO * uiIDA[0]=IDS_CONFIRM_OK; // 4J-PB - it's possible there is no primary pad here, when accepting an invite from the dashboard - ui.RequestMessageBox( IDS_CONNECTION_FAILED, IDS_CONNECTION_FAILED_NO_SD_SPLITSCREEN, uiIDA,1,XUSER_INDEX_ANY,NULL,NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_CONNECTION_FAILED, IDS_CONNECTION_FAILED_NO_SD_SPLITSCREEN, uiIDA,1,XUSER_INDEX_ANY); } else #endif if( noUGC ) { +#ifdef __PSVITA__ + // showing the system message for chat restriction here instead now, to fix FQA bug report + ProfileManager.DisplaySystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION, ProfileManager.GetPrimaryPad() ); +#else int messageText = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_SINGLE_LOCAL; if(joiningUsers > 1) messageText = IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_ALL_LOCAL; ui.RequestUGCMessageBox(IDS_CONNECTION_FAILED, messageText, XUSER_INDEX_ANY); +#endif } #if defined(__PS3__) || defined __PSVITA__ else if(bContentRestricted) @@ -1703,7 +1775,7 @@ void CGameNetworkManager::GameInviteReceived( int userIndex, const INVITE_INFO * // 4J-PB - it's possible there is no primary pad here, when accepting an invite from the dashboard //StorageManager.RequestMessageBox( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); - ui.RequestMessageBox( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,XUSER_INDEX_ANY,NULL,NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,XUSER_INDEX_ANY); } else { @@ -1717,10 +1789,11 @@ void CGameNetworkManager::GameInviteReceived( int userIndex, const INVITE_INFO * #endif if( !g_NetworkManager.IsInSession() ) { -#ifndef __PS3__ - HandleInviteWhenInMenus(userIndex, pInviteInfo); -#else +#if defined (__PS3__) || defined (__PSVITA__) // PS3 is more complicated here - we need to make sure that the player is online. If they are then we can do the same as the xbox, if not we need to try and get them online and then, if they do sign in, go down the same path + + // Determine why they're not "signed in live" + // MGH - On Vita we need to add a new message at some point for connecting when already signed in if(ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())) { HandleInviteWhenInMenus(userIndex, pInviteInfo); @@ -1730,8 +1803,12 @@ void CGameNetworkManager::GameInviteReceived( int userIndex, const INVITE_INFO * UINT uiIDA[2]; uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CGameNetworkManager::MustSignInReturned_1,(void *)pInviteInfo, app.GetStringTable()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&CGameNetworkManager::MustSignInReturned_1,(void *)pInviteInfo); } + + +#else + HandleInviteWhenInMenus(userIndex, pInviteInfo); #endif } else @@ -1777,7 +1854,9 @@ void CGameNetworkManager::HandleInviteWhenInMenus( int userIndex, const INVITE_I } else { +#ifndef _XBOX_ONE ProfileManager.SetPrimaryPad(userIndex); +#endif // 4J Stu - If we accept an invite from the main menu before going to play game we need to load the DLC // These checks are done within the StartInstallDLCProcess - (!app.DLCInstallProcessCompleted() && !app.DLCInstallPending()) app.StartInstallDLCProcess(dwUserIndex); @@ -1787,7 +1866,11 @@ void CGameNetworkManager::HandleInviteWhenInMenus( int userIndex, const INVITE_I // The locked profile should not be changed if we are in menus as the main player might sign out in the sign-in ui //ProfileManager.SetLockedProfile(-1); +#ifdef _XBOX_ONE + if((!app.IsLocalMultiplayerAvailable())&&InputManager.IsPadLocked(userIndex)) +#else if(!app.IsLocalMultiplayerAvailable()) +#endif { bool noPrivileges=!ProfileManager.AllowedToPlayMultiplayer(userIndex); @@ -1795,7 +1878,7 @@ void CGameNetworkManager::HandleInviteWhenInMenus( int userIndex, const INVITE_I { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); } else { diff --git a/Minecraft.Client/Common/Network/GameNetworkManager.h b/Minecraft.Client/Common/Network/GameNetworkManager.h index 1bb532da..01db2724 100644 --- a/Minecraft.Client/Common/Network/GameNetworkManager.h +++ b/Minecraft.Client/Common/Network/GameNetworkManager.h @@ -22,6 +22,7 @@ using namespace std; class ClientConnection; class Minecraft; +const int NON_QNET_SENDDATA_ACK_REQUIRED = 1; // This class implements the game-side interface to the networking system. As such, it is platform independent and may contain bits of game-side code where appropriate. // It shouldn't ever reference any platform specifics of the network implementation (eg QNET), rather it should interface with an implementation of PlatformNetworkManager to diff --git a/Minecraft.Client/Common/Network/NetworkPlayerInterface.h b/Minecraft.Client/Common/Network/NetworkPlayerInterface.h index 501b08ff..d26252da 100644 --- a/Minecraft.Client/Common/Network/NetworkPlayerInterface.h +++ b/Minecraft.Client/Common/Network/NetworkPlayerInterface.h @@ -9,8 +9,9 @@ class INetworkPlayer public: virtual ~INetworkPlayer() {} virtual unsigned char GetSmallId() = 0; - virtual void SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority) = 0; + virtual void SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority, bool ack) = 0; virtual bool IsSameSystem(INetworkPlayer *player) = 0; + virtual int GetOutstandingAckCount() = 0; virtual int GetSendQueueSizeBytes( INetworkPlayer *player, bool lowPriority ) = 0; virtual int GetSendQueueSizeMessages( INetworkPlayer *player, bool lowPriority ) = 0; virtual int GetCurrentRtt() = 0; @@ -28,4 +29,6 @@ public: virtual const wchar_t *GetOnlineName() = 0; virtual wstring GetDisplayName() = 0; virtual PlayerUID GetUID() = 0; + virtual void SentChunkPacket() = 0; + virtual int GetTimeSinceLastChunkPacket_ms() = 0; }; diff --git a/Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.cpp b/Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.cpp index 9c750e95..a7a4628b 100644 --- a/Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.cpp +++ b/Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.cpp @@ -5,6 +5,7 @@ NetworkPlayerSony::NetworkPlayerSony(SQRNetworkPlayer *qnetPlayer) { m_sqrPlayer = qnetPlayer; m_pSocket = NULL; + m_lastChunkPacketTime = 0; } unsigned char NetworkPlayerSony::GetSmallId() @@ -12,10 +13,10 @@ unsigned char NetworkPlayerSony::GetSmallId() return m_sqrPlayer->GetSmallId(); } -void NetworkPlayerSony::SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority) +void NetworkPlayerSony::SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority, bool ack) { // TODO - handle priority - m_sqrPlayer->SendData( ((NetworkPlayerSony *)player)->m_sqrPlayer, pvData, dataSize ); + m_sqrPlayer->SendData( ((NetworkPlayerSony *)player)->m_sqrPlayer, pvData, dataSize, ack ); } bool NetworkPlayerSony::IsSameSystem(INetworkPlayer *player) @@ -23,14 +24,19 @@ bool NetworkPlayerSony::IsSameSystem(INetworkPlayer *player) return m_sqrPlayer->IsSameSystem(((NetworkPlayerSony *)player)->m_sqrPlayer); } +int NetworkPlayerSony::GetOutstandingAckCount() +{ + return m_sqrPlayer->GetOutstandingAckCount(); +} + int NetworkPlayerSony::GetSendQueueSizeBytes( INetworkPlayer *player, bool lowPriority ) { - return 0; // TODO + return m_sqrPlayer->GetSendQueueSizeBytes(); } int NetworkPlayerSony::GetSendQueueSizeMessages( INetworkPlayer *player, bool lowPriority ) { - return 0; // TODO + return m_sqrPlayer->GetSendQueueSizeMessages(); } int NetworkPlayerSony::GetCurrentRtt() @@ -112,3 +118,20 @@ void NetworkPlayerSony::SetUID(PlayerUID UID) { m_sqrPlayer->SetUID(UID); } + +void NetworkPlayerSony::SentChunkPacket() +{ + m_lastChunkPacketTime = System::currentTimeMillis(); +} + +int NetworkPlayerSony::GetTimeSinceLastChunkPacket_ms() +{ + // If we haven't ever sent a packet, return maximum + if( m_lastChunkPacketTime == 0 ) + { + return INT_MAX; + } + + __int64 currentTime = System::currentTimeMillis(); + return (int)( currentTime - m_lastChunkPacketTime ); +} diff --git a/Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.h b/Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.h index 5c8605fb..f3415a41 100644 --- a/Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.h +++ b/Minecraft.Client/Common/Network/Sony/NetworkPlayerSony.h @@ -11,8 +11,9 @@ public: // Common player interface NetworkPlayerSony(SQRNetworkPlayer *sqrPlayer); virtual unsigned char GetSmallId(); - virtual void SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority); + virtual void SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority, bool ack); virtual bool IsSameSystem(INetworkPlayer *player); + virtual int GetOutstandingAckCount(); virtual int GetSendQueueSizeBytes( INetworkPlayer *player, bool lowPriority ); virtual int GetSendQueueSizeMessages( INetworkPlayer *player, bool lowPriority ); virtual int GetCurrentRtt(); @@ -33,7 +34,10 @@ public: void SetUID(PlayerUID UID); + virtual void SentChunkPacket(); + virtual int GetTimeSinceLastChunkPacket_ms(); private: SQRNetworkPlayer *m_sqrPlayer; Socket *m_pSocket; + __int64 m_lastChunkPacketTime; }; diff --git a/Minecraft.Client/Common/Network/Sony/PlatformNetworkManagerSony.cpp b/Minecraft.Client/Common/Network/Sony/PlatformNetworkManagerSony.cpp index 009993cb..67fd058c 100644 --- a/Minecraft.Client/Common/Network/Sony/PlatformNetworkManagerSony.cpp +++ b/Minecraft.Client/Common/Network/Sony/PlatformNetworkManagerSony.cpp @@ -54,10 +54,8 @@ void CPlatformNetworkManagerSony::HandleStateChange(SQRNetworkManager::eSQRNetwo else if( newState == SQRNetworkManager::SNM_STATE_JOINING ) { // 4J Stu - We may be accepting an invite from the DLC menu, so hide the icon -#ifdef __ORBIS__ - sceNpCommerceHidePsStoreIcon(); -#elif defined __PSVITA__ - sceNpCommerce2HidePsStoreIcon(); +#if defined __ORBIS__ || defined __PSVITA__ + app.GetCommerce()->HidePsStoreIcon(); #endif m_bLeavingGame = false; m_bLeaveGameOnTick = false; @@ -459,16 +457,16 @@ int CPlatformNetworkManagerSony::CorrectErrorIDS(int IDS) // Determine if we'd prefer to present errors as a signing out issue, rather than a network issue, based on whether we have a network connection at all or not bool preferSignoutError = false; int state; -#ifdef __PS3__ + +#if defined __PSVITA__ // MGH - to fix devtrack #6258 + if(!ProfileManager.IsSignedInPSN(ProfileManager.GetPrimaryPad())) + preferSignoutError = true; +#elif defined __ORBIS__ + if(!ProfileManager.isSignedInPSN(ProfileManager.GetPrimaryPad())) + preferSignoutError = true; +#elif defined __PS3__ int ret = cellNetCtlGetState( &state ); int IPObtainedState = CELL_NET_CTL_STATE_IPObtained; -#elif defined __ORBIS__ - int ret = sceNetCtlGetState( &state ); - int IPObtainedState = SCE_NET_CTL_STATE_IPOBTAINED; -#elif defined __PSVITA__ - int ret = sceNetCtlInetGetState( &state ); - int IPObtainedState = SCE_NET_CTL_STATE_IPOBTAINED; -#endif if( ret == 0 ) { if( state == IPObtainedState ) @@ -476,6 +474,7 @@ int CPlatformNetworkManagerSony::CorrectErrorIDS(int IDS) preferSignoutError = true; } } +#endif #ifdef __PSVITA__ // If we're in ad-hoc mode this problem definitely wasn't PSN related @@ -1446,7 +1445,8 @@ void CPlatformNetworkManagerSony::startAdhocMatching( ) bool CPlatformNetworkManagerSony::checkValidInviteData(const INVITE_INFO* pInviteInfo) { - if(((SQRNetworkManager_Vita*)m_pSQRNet_Vita)->GetHostUID() == pInviteInfo->hostPlayerUID) + SQRNetworkManager_Vita* pSQR = (SQRNetworkManager_Vita*)m_pSQRNet_Vita; + if(pSQR->IsOnlineGame() && !pSQR->IsHost()&& (pSQR->GetHostUID() == pInviteInfo->hostPlayerUID)) { // we're trying to join a game we're already in, so we just ignore this return false; diff --git a/Minecraft.Client/Common/Network/Sony/SQRNetworkManager.cpp b/Minecraft.Client/Common/Network/Sony/SQRNetworkManager.cpp index 20f2641c..f23a0a63 100644 --- a/Minecraft.Client/Common/Network/Sony/SQRNetworkManager.cpp +++ b/Minecraft.Client/Common/Network/Sony/SQRNetworkManager.cpp @@ -8,3 +8,76 @@ void SQRNetworkManager::SafeToRespondToGameBootInvite() { s_safeToRespondToGameBootInvite = true; } + +int SQRNetworkManager::GetSendQueueSizeBytes() +{ + int queueSize = 0; + int playerCount = GetPlayerCount(); + for(int i = 0; i < playerCount; ++i) + { + SQRNetworkPlayer *player = GetPlayerByIndex( i ); + if( player != NULL ) + { + queueSize += player->GetTotalSendQueueBytes(); + } + } + return queueSize; +} + +int SQRNetworkManager::GetSendQueueSizeMessages() +{ + int queueSize = 0; + int playerCount = GetPlayerCount(); + for(int i = 0; i < playerCount; ++i) + { + SQRNetworkPlayer *player = GetPlayerByIndex( i ); + if( player != NULL ) + { + queueSize += player->GetTotalSendQueueMessages(); + } + } + return queueSize; +} + +int SQRNetworkManager::GetOutstandingAckCount(SQRNetworkPlayer *pSQRPlayer) +{ + int ackCount = 0; + int playerCount = GetPlayerCount(); + for(int i = 0; i < playerCount; ++i) + { + SQRNetworkPlayer *pSQRPlayer2 = GetPlayerByIndex( i ); + if( pSQRPlayer2 ) + { + if( ( pSQRPlayer == pSQRPlayer2 ) || (pSQRPlayer->IsSameSystem(pSQRPlayer2) ) ) + { + ackCount += pSQRPlayer2->m_acksOutstanding; + } + } + } + return ackCount; +} + +void SQRNetworkManager::RequestWriteAck(int smallId) +{ + EnterCriticalSection(&m_csAckQueue); + m_queuedAckRequests.push(smallId); + LeaveCriticalSection(&m_csAckQueue); +} + +void SQRNetworkManager::TickWriteAcks() +{ + EnterCriticalSection(&m_csAckQueue); + while(m_queuedAckRequests.size() > 0) + { + int smallId = m_queuedAckRequests.front(); + m_queuedAckRequests.pop(); + SQRNetworkPlayer *player = GetPlayerBySmallId(smallId); + if( player ) + { + LeaveCriticalSection(&m_csAckQueue); + player->WriteAck(); + EnterCriticalSection(&m_csAckQueue); + } + } + LeaveCriticalSection(&m_csAckQueue); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Network/Sony/SQRNetworkManager.h b/Minecraft.Client/Common/Network/Sony/SQRNetworkManager.h index c93368d8..e3f15aca 100644 --- a/Minecraft.Client/Common/Network/Sony/SQRNetworkManager.h +++ b/Minecraft.Client/Common/Network/Sony/SQRNetworkManager.h @@ -11,6 +11,9 @@ #include #include +#if defined __PSVITA__ +#include "..\..\Minecraft.Client\PSVita\4JLibs\inc\4J_Profile.h" +#endif class SQRNetworkPlayer; class ISQRNetworkManagerListener; @@ -30,7 +33,9 @@ public: protected: friend class SQRNetworkPlayer; friend class SonyVoiceChat; - +#ifdef __PSVITA__ + friend class HelloSyncInfo; +#endif static const int MAX_FRIENDS = 100; #ifdef __PS3__ @@ -231,6 +236,8 @@ protected: std::queue m_stateChangeQueue; CRITICAL_SECTION m_csStateChangeQueue; CRITICAL_SECTION m_csMatching; + CRITICAL_SECTION m_csAckQueue; + std::queue m_queuedAckRequests; typedef enum { @@ -295,6 +302,13 @@ public: static void SafeToRespondToGameBootInvite(); + int GetOutstandingAckCount(SQRNetworkPlayer *pSonyPlayer); + int GetSendQueueSizeBytes(); + int GetSendQueueSizeMessages(); + void RequestWriteAck(int smallId); + void TickWriteAcks(); + + }; diff --git a/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.cpp b/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.cpp index e244b34c..a040b28b 100644 --- a/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.cpp +++ b/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.cpp @@ -16,6 +16,15 @@ #endif +//#define PRINT_ACK_STATS + +#ifdef __PS3__ +static const int sc_wouldBlockFlag = CELL_RUDP_ERROR_WOULDBLOCK; +#else // __ORBIS__ +static const int sc_wouldBlockFlag = SCE_RUDP_ERROR_WOULDBLOCK; +#endif + + static const bool sc_verbose = false; @@ -84,6 +93,8 @@ SQRNetworkPlayer::SQRNetworkPlayer(SQRNetworkManager *manager, eSQRNetworkPlayer m_host = onHost; m_manager = manager; m_customData = 0; + m_acksOutstanding = 0; + m_totalBytesInSendQueue = 0; if( pUID ) { memcpy(&m_ISD.m_UID,pUID,sizeof(PlayerUID)); @@ -102,6 +113,7 @@ SQRNetworkPlayer::SQRNetworkPlayer(SQRNetworkManager *manager, eSQRNetworkPlayer } SetNameFromUID(); InitializeCriticalSection(&m_csQueue); + InitializeCriticalSection(&m_csAcks); #ifdef __ORBIS__ if(IsLocal()) { @@ -109,6 +121,14 @@ SQRNetworkPlayer::SQRNetworkPlayer(SQRNetworkManager *manager, eSQRNetworkPlayer } #endif +#ifndef _CONTENT_PACKAGE + m_minAckTime = INT_MAX; + m_maxAckTime = 0; + m_totalAcks = 0; + m_totalAckTime = 0; + m_averageAckTime = 0; +#endif + } SQRNetworkPlayer::~SQRNetworkPlayer() @@ -190,13 +210,8 @@ bool SQRNetworkPlayer::HasSmallIdConfirmed() // To confirm to the host that we are ready, send a single byte with our small id. void SQRNetworkPlayer::ConfirmReady() { -#ifdef __PS3__ - int ret = cellRudpWrite( m_rudpCtx, &m_ISD, sizeof(InitSendData), CELL_RUDP_MSG_LATENCY_CRITICAL ); -#else //__ORBIS__ - int ret = sceRudpWrite( m_rudpCtx, &m_ISD, sizeof(InitSendData), SCE_RUDP_MSG_LATENCY_CRITICAL ); -#endif - // TODO - error handling here? - assert ( ret == sizeof(InitSendData) ); + SendInternal(&m_ISD, sizeof(InitSendData), e_flag_AckNotRequested); + // Final flag for a local player on the client, as we are now safe to send data on to the host m_host ? app.DebugPrintf(sc_verbose, "host : ") : app.DebugPrintf(sc_verbose, "client:"); app.DebugPrintf(sc_verbose, ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Small ID confirmed\n"); @@ -205,8 +220,9 @@ void SQRNetworkPlayer::ConfirmReady() // Attempt to send data, of any size, from this player to that specified by pPlayerTarget. This may not be possible depending on the two players, due to // our star shaped network connectivity. Data may be any size, and is copied so on returning from this method it does not need to be preserved. -void SQRNetworkPlayer::SendData( SQRNetworkPlayer *pPlayerTarget, const void *data, unsigned int dataSize ) +void SQRNetworkPlayer::SendData( SQRNetworkPlayer *pPlayerTarget, const void *data, unsigned int dataSize, bool ack ) { + AckFlags ackFlags = ack ? e_flag_AckRequested : e_flag_AckNotRequested; // Our network is connected as a star. If we are the host, then we can send to any remote player. If we're a client, we can send only to the host. // The host can also send to other local players, but this doesn't need to go through Rudp. if( m_host ) @@ -224,7 +240,7 @@ void SQRNetworkPlayer::SendData( SQRNetworkPlayer *pPlayerTarget, const void *da else if( ( m_type == SNP_TYPE_HOST ) && ( pPlayerTarget->m_type == SNP_TYPE_REMOTE ) ) { // Rudp communication from host to remote player - handled by remote player instance - pPlayerTarget->SendInternal(data,dataSize); + pPlayerTarget->SendInternal(data,dataSize, ackFlags); } else { @@ -237,7 +253,7 @@ void SQRNetworkPlayer::SendData( SQRNetworkPlayer *pPlayerTarget, const void *da if( ( m_type == SNP_TYPE_LOCAL ) && ( pPlayerTarget->m_type == SNP_TYPE_HOST ) ) { // Rudp communication from client to host - handled by this player instace - SendInternal(data, dataSize); + SendInternal(data, dataSize, ackFlags); } else { @@ -250,15 +266,30 @@ void SQRNetworkPlayer::SendData( SQRNetworkPlayer *pPlayerTarget, const void *da // Internal send function - to simplify the number of mechanisms we have for sending data, this method just adds the data to be send to the player's internal queue, // and then calls SendMoreInternal. This method can take any size of data, which it will split up into payload size chunks before sending. All input data is copied // into internal buffers. -void SQRNetworkPlayer::SendInternal(const void *data, unsigned int dataSize) +void SQRNetworkPlayer::SendInternal(const void *data, unsigned int dataSize, AckFlags ackFlags) { EnterCriticalSection(&m_csQueue); - + bool bOutstandingPackets = (m_sendQueue.size() > 0); // check if there are still packets in the queue, we won't be calling SendMoreInternal here if there are QueuedSendBlock sendBlock; unsigned char *dataCurrent = (unsigned char *)data; unsigned int dataRemaining = dataSize; + if(ackFlags == e_flag_AckReturning) + { + // no data, just the flag + assert(dataSize == 0); + assert(data == NULL); + int dataSize = dataRemaining; + if( dataSize > SNP_MAX_PAYLOAD ) dataSize = SNP_MAX_PAYLOAD; + sendBlock.start = NULL; + sendBlock.end = NULL; + sendBlock.current = NULL; + sendBlock.ack = ackFlags; + m_sendQueue.push(sendBlock); + } + else + { while( dataRemaining ) { int dataSize = dataRemaining; @@ -266,19 +297,203 @@ void SQRNetworkPlayer::SendInternal(const void *data, unsigned int dataSize) sendBlock.start = new unsigned char [dataSize]; sendBlock.end = sendBlock.start + dataSize; sendBlock.current = sendBlock.start; + sendBlock.ack = ackFlags; memcpy( sendBlock.start, dataCurrent, dataSize); m_sendQueue.push(sendBlock); dataRemaining -= dataSize; dataCurrent += dataSize; } - // Now try and send as much as we can - SendMoreInternal(); + } + m_totalBytesInSendQueue += dataSize; + + // if the queue had something in it already, then the UDP callback will fire and call SendMoreInternal + // so we don't call it here, to avoid a deadlock + if(!bOutstandingPackets) + { + // Now try and send as much as we can + SendMoreInternal(); + } LeaveCriticalSection(&m_csQueue); } +int SQRNetworkPlayer::WriteDataPacket(const void* data, int dataSize, AckFlags ackFlags) + { + DataPacketHeader header(dataSize, ackFlags); + int headerSize = sizeof(header); + int packetSize = dataSize+headerSize; + unsigned char* packetData = new unsigned char[packetSize]; + *((DataPacketHeader*)packetData) = header; + memcpy(&packetData[headerSize], data, dataSize); + +#ifndef _CONTENT_PACKAGE + if(ackFlags == e_flag_AckRequested) + m_ackStats.push_back(System::currentTimeMillis()); +#endif + +#ifdef __PS3__ + int ret = cellRudpWrite( m_rudpCtx, packetData, packetSize, 0);//CELL_RUDP_MSG_LATENCY_CRITICAL ); +#else // __ORBIS__ && __PSVITA__ + int ret = sceRudpWrite( m_rudpCtx, packetData, packetSize, 0);//SCE_RUDP_MSG_LATENCY_CRITICAL ); +#endif + if(ret == sc_wouldBlockFlag) + { + // nothing was sent! + } + else + { + assert(ret==packetSize || ret > headerSize); // we must make sure we've sent the entire packet or the header and some data at least + ret -= headerSize; + if(ackFlags == e_flag_AckRequested) + { + EnterCriticalSection(&m_csAcks); + m_acksOutstanding++; + LeaveCriticalSection(&m_csAcks); + } + } + delete packetData; + + return ret; +} + +int SQRNetworkPlayer::GetPacketDataSize() +{ + unsigned int ackFlag; + int headerSize = sizeof(ackFlag); +#ifdef __PS3__ + unsigned int packetSize = cellRudpGetSizeReadable(m_rudpCtx); +#else + unsigned int packetSize = sceRudpGetSizeReadable(m_rudpCtx); +#endif + if(packetSize == 0) + return 0; + + unsigned int dataSize = packetSize - headerSize; + assert(dataSize >= 0); + if(dataSize == 0) + { + // header only, must just be an ack returning + ReadAck(); + } + return dataSize; +} + +int SQRNetworkPlayer::ReadDataPacket(void* data, int dataSize) +{ + int headerSize = sizeof(DataPacketHeader); + int packetSize = dataSize+headerSize; + + unsigned char* packetData = new unsigned char[packetSize]; +#ifdef __PS3__ + int bytesRead = cellRudpRead( m_rudpCtx, packetData, packetSize, 0, NULL ); +#else // __ORBIS__ && __PSVITA__ + int bytesRead = sceRudpRead( m_rudpCtx, packetData, packetSize, 0, NULL ); +#endif + if(bytesRead == sc_wouldBlockFlag) + { + delete packetData; + return 0; + } + // check the header, and see if we need to send back an ack + DataPacketHeader header = *((DataPacketHeader*)packetData); + if(header.GetAckFlags() == e_flag_AckRequested) + { + // Don't send the ack back directly from here, as this is called from a rudp event callback, and we end up in a thread lock situation between the lock librudp uses + // internally (which is locked already here since we are being called in the event handler), and our own lock that we do for processing our write queue + m_manager->RequestWriteAck(GetSmallId()); + } + else + { + assert(header.GetAckFlags() == e_flag_AckNotRequested); + } + if(bytesRead > 0) + { + bytesRead -= headerSize; + memcpy(data, &packetData[headerSize], bytesRead); + } + assert(header.GetDataSize() == bytesRead); + + delete packetData; + + return bytesRead; +} + + + +void SQRNetworkPlayer::ReadAck() +{ + DataPacketHeader header; +#ifdef __PS3__ + int bytesRead = cellRudpRead( m_rudpCtx, &header, sizeof(header), 0, NULL ); +#else // __ORBIS__ && __PSVITA__ + int bytesRead = sceRudpRead( m_rudpCtx, &header, sizeof(header), 0, NULL ); +#endif + if(bytesRead == sc_wouldBlockFlag) + { + return; + } + + assert(header.GetAckFlags() == e_flag_AckReturning); + EnterCriticalSection(&m_csAcks); + m_acksOutstanding--; + assert(m_acksOutstanding >=0); + LeaveCriticalSection(&m_csAcks); + +#ifndef _CONTENT_PACKAGE +#ifdef PRINT_ACK_STATS + __int64 timeTaken = System::currentTimeMillis() - m_ackStats[0]; + if(timeTaken < m_minAckTime) + m_minAckTime = timeTaken; + if(timeTaken > m_maxAckTime) + m_maxAckTime = timeTaken; + m_totalAcks++; + m_totalAckTime += timeTaken; + m_averageAckTime = m_totalAckTime / m_totalAcks; + app.DebugPrintf("RUDP ctx : %d : Time taken for ack - %4d ms : min - %4d : max %4d : avg %4d\n", m_rudpCtx, timeTaken, m_minAckTime, m_maxAckTime, m_averageAckTime); + m_ackStats.erase(m_ackStats.begin()); +#endif +#endif +} + +void SQRNetworkPlayer::WriteAck() +{ + SendInternal(NULL, 0, e_flag_AckReturning); +} + +int SQRNetworkPlayer::GetOutstandingAckCount() +{ + return m_manager->GetOutstandingAckCount(this); +} + +int SQRNetworkPlayer::GetTotalOutstandingAckCount() +{ + return m_acksOutstanding; +} + +int SQRNetworkPlayer::GetTotalSendQueueBytes() +{ + return m_totalBytesInSendQueue; +} + +int SQRNetworkPlayer::GetTotalSendQueueMessages() +{ + CriticalSectionScopeLock lock(&m_csQueue); + return m_sendQueue.size(); + +} + +int SQRNetworkPlayer::GetSendQueueSizeBytes() +{ + return m_manager->GetSendQueueSizeBytes(); +} + +int SQRNetworkPlayer::GetSendQueueSizeMessages() +{ + return m_manager->GetSendQueueSizeMessages(); +} + // Internal send function. This attempts to send as many elements in the queue as possible until the write function tells us that we can't send any more. This way, @@ -287,6 +502,8 @@ void SQRNetworkPlayer::SendInternal(const void *data, unsigned int dataSize) void SQRNetworkPlayer::SendMoreInternal() { EnterCriticalSection(&m_csQueue); + assert(m_sendQueue.size() > 0); // this should never be called with an empty queue. + bool keepSending; do { @@ -296,17 +513,12 @@ void SQRNetworkPlayer::SendMoreInternal() // Attempt to send the full data in the first element in our queue unsigned char *data= m_sendQueue.front().current; int dataSize = m_sendQueue.front().end - m_sendQueue.front().current; -#ifdef __PS3__ - int ret = cellRudpWrite( m_rudpCtx, data, dataSize, 0);//CELL_RUDP_MSG_LATENCY_CRITICAL ); - int wouldBlockFlag = CELL_RUDP_ERROR_WOULDBLOCK; + int ret = WriteDataPacket(data, dataSize, m_sendQueue.front().ack); -#else // __ORBIS__ - int ret = sceRudpWrite( m_rudpCtx, data, dataSize, 0);//CELL_RUDP_MSG_LATENCY_CRITICAL ); - int wouldBlockFlag = SCE_RUDP_ERROR_WOULDBLOCK; -#endif if( ret == dataSize ) { // Fully sent, remove from queue - will loop in the while loop to see if there's anything else in the queue we could send + m_totalBytesInSendQueue -= ret; delete [] m_sendQueue.front().start; m_sendQueue.pop(); if( m_sendQueue.size() ) @@ -314,15 +526,15 @@ void SQRNetworkPlayer::SendMoreInternal() keepSending = true; } } - else if( ( ret >= 0 ) || ( ret == wouldBlockFlag ) ) + else if( ( ret >= 0 ) || ( ret == sc_wouldBlockFlag ) ) { - // Things left to send - adjust this element in the queue int remainingBytes; if( ret >= 0 ) { // Only ret bytes sent so far + m_totalBytesInSendQueue -= ret; remainingBytes = dataSize - ret; assert(remainingBytes > 0 ); } diff --git a/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.h b/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.h index 0cd56e8d..d0efe635 100644 --- a/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.h +++ b/Minecraft.Client/Common/Network/Sony/SQRNetworkPlayer.h @@ -48,12 +48,41 @@ class SQRNetworkPlayer SNP_TYPE_REMOTE, // On host - this player's m_rupdCtx can be used to communicate from between the host and this player. On clients - this is a remote player that cannot be communicated with } eSQRNetworkPlayerType; + enum AckFlags + { + e_flag_AckUnknown, + e_flag_AckNotRequested, + e_flag_AckRequested, + e_flag_AckReturning + }; + + class DataPacketHeader + { + unsigned short m_dataSize; + unsigned short m_ackFlags; + public: + DataPacketHeader() : m_dataSize(0), m_ackFlags(e_flag_AckUnknown) {} + DataPacketHeader(int dataSize, AckFlags ackFlags) : m_dataSize(dataSize), m_ackFlags(ackFlags) { } + AckFlags GetAckFlags() { return (AckFlags)m_ackFlags;} + int GetDataSize() { return m_dataSize; } + }; + +#ifndef _CONTENT_PACKAGE + std::vector<__int64> m_ackStats; + int m_minAckTime; + int m_maxAckTime; + int m_totalAcks; + __int64 m_totalAckTime; + int m_averageAckTime; +#endif + class QueuedSendBlock { public: unsigned char *start; unsigned char *end; unsigned char *current; + AckFlags ack; }; class InitSendData @@ -75,11 +104,26 @@ class SQRNetworkPlayer void InitialDataReceived(InitSendData *ISD); // Only for remote players as viewed from the host, this is set when the host has received confirmation that the client has received the small id for this player, ie it is now safe to send data to bool HasSmallIdConfirmed(); - void SendData( SQRNetworkPlayer *pPlayerTarget, const void *data, unsigned int dataSize ); + void SendData( SQRNetworkPlayer *pPlayerTarget, const void *data, unsigned int dataSize, bool ack ); void ConfirmReady(); - void SendInternal(const void *data, unsigned int dataSize); + void SendInternal(const void *data, unsigned int dataSize, AckFlags ackFlags); void SendMoreInternal(); + int GetPacketDataSize(); + int ReadDataPacket(void* data, int dataSize); + int WriteDataPacket(const void* data, int dataSize, AckFlags ackFlags); + void ReadAck(); + void WriteAck(); + + int GetOutstandingAckCount(); + int GetSendQueueSizeBytes(); + int GetSendQueueSizeMessages(); + + int GetTotalOutstandingAckCount(); + int GetTotalSendQueueBytes(); + int GetTotalSendQueueMessages(); + + #ifdef __PSVITA__ void SendInternal_VitaAdhoc(const void *data, unsigned int dataSize, EAdhocDataTag tag = e_dataTag_Normal); void SendMoreInternal_VitaAdhoc(); @@ -99,5 +143,9 @@ class SQRNetworkPlayer wchar_t m_name[21]; uintptr_t m_customData; CRITICAL_SECTION m_csQueue; + CRITICAL_SECTION m_csAcks; std::queue m_sendQueue; + int m_totalBytesInSendQueue; + + int m_acksOutstanding; }; diff --git a/Minecraft.Client/Common/Network/Sony/SonyCommerce.h b/Minecraft.Client/Common/Network/Sony/SonyCommerce.h index 6df04947..ff9423e8 100644 --- a/Minecraft.Client/Common/Network/Sony/SonyCommerce.h +++ b/Minecraft.Client/Common/Network/Sony/SonyCommerce.h @@ -170,4 +170,8 @@ public: virtual void CheckForTrialUpgradeKey() = 0; virtual bool LicenseChecked() = 0; +#if defined __ORBIS__ || defined __PSVITA__ + virtual void ShowPsStoreIcon() = 0; + virtual void HidePsStoreIcon() = 0; +#endif }; diff --git a/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.cpp b/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.cpp index ccb1957d..4468d163 100644 --- a/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.cpp +++ b/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.cpp @@ -36,6 +36,37 @@ static SceRemoteStorageStatus statParams; +void SonyRemoteStorage::SetRetrievedDescData() +{ + DescriptionData* pDescDataTest = (DescriptionData*)m_remoteFileInfo->fileDescription; + ESavePlatform testPlatform = (ESavePlatform)MAKE_FOURCC(pDescDataTest->m_platform[0], pDescDataTest->m_platform[1], pDescDataTest->m_platform[2], pDescDataTest->m_platform[3]); + if(testPlatform == SAVE_FILE_PLATFORM_NONE) + { + // new version of the descData + DescriptionData_V2* pDescData2 = (DescriptionData_V2*)m_remoteFileInfo->fileDescription; + m_retrievedDescData.m_descDataVersion = GetU32FromHexBytes(pDescData2->m_descDataVersion); + m_retrievedDescData.m_savePlatform = (ESavePlatform)MAKE_FOURCC(pDescData2->m_platform[0], pDescData2->m_platform[1], pDescData2->m_platform[2], pDescData2->m_platform[3]); + m_retrievedDescData.m_seed = GetU64FromHexBytes(pDescData2->m_seed); + m_retrievedDescData.m_hostOptions = GetU32FromHexBytes(pDescData2->m_hostOptions); + m_retrievedDescData.m_texturePack = GetU32FromHexBytes(pDescData2->m_texturePack); + m_retrievedDescData.m_saveVersion = GetU32FromHexBytes(pDescData2->m_saveVersion); + memcpy(m_retrievedDescData.m_saveNameUTF8, pDescData2->m_saveNameUTF8, sizeof(pDescData2->m_saveNameUTF8)); + assert(m_retrievedDescData.m_descDataVersion > 1 && m_retrievedDescData.m_descDataVersion <= sc_CurrentDescDataVersion); + } + else + { + // old version,copy the data across to the new version + DescriptionData* pDescData = (DescriptionData*)m_remoteFileInfo->fileDescription; + m_retrievedDescData.m_descDataVersion = 1; + m_retrievedDescData.m_savePlatform = (ESavePlatform)MAKE_FOURCC(pDescData->m_platform[0], pDescData->m_platform[1], pDescData->m_platform[2], pDescData->m_platform[3]); + m_retrievedDescData.m_seed = GetU64FromHexBytes(pDescData->m_seed); + m_retrievedDescData.m_hostOptions = GetU32FromHexBytes(pDescData->m_hostOptions); + m_retrievedDescData.m_texturePack = GetU32FromHexBytes(pDescData->m_texturePack); + m_retrievedDescData.m_saveVersion = SAVE_FILE_VERSION_COMPRESSED_CHUNK_STORAGE; // the last save version before we added it to this data + memcpy(m_retrievedDescData.m_saveNameUTF8, pDescData->m_saveNameUTF8, sizeof(pDescData->m_saveNameUTF8)); + } + +} @@ -51,8 +82,9 @@ void getSaveInfoReturnCallback(LPVOID lpParam, SonyRemoteStorage::Status s, int if(strcmp(statParams.data[i].fileName, sc_remoteSaveFilename) == 0) { // found the file we need in the cloud - pRemoteStorage->m_getInfoStatus = SonyRemoteStorage::e_infoFound; pRemoteStorage->m_remoteFileInfo = &statParams.data[i]; + pRemoteStorage->SetRetrievedDescData(); + pRemoteStorage->m_getInfoStatus = SonyRemoteStorage::e_infoFound; } } } @@ -104,7 +136,7 @@ void SonyRemoteStorage::getSaveInfo() bool SonyRemoteStorage::getSaveData( const char* localDirname, CallbackFunc cb, LPVOID lpParam ) { m_startTime = System::currentTimeMillis(); - m_dataProgress = 0; + m_dataProgress = -1; return getData(sc_remoteSaveFilename, localDirname, cb, lpParam); } @@ -131,7 +163,9 @@ bool SonyRemoteStorage::setSaveData(PSAVE_INFO info, CallbackFunc cb, void* lpPa m_setDataStatus = e_settingData; m_initCallbackFunc = cb; m_initCallbackParam = lpParam; - m_dataProgress = 0; + m_dataProgress = -1; + m_uploadSaveSize = 0; + m_startTime = System::currentTimeMillis(); bool bOK = init(setSaveDataInitCallback, this); if(!bOK) m_setDataStatus = e_settingDataFailed; @@ -148,16 +182,14 @@ const char* SonyRemoteStorage::getSaveNameUTF8() { if(m_getInfoStatus != e_infoFound) return NULL; - DescriptionData* pDescData = (DescriptionData*)m_remoteFileInfo->fileDescription; - return pDescData->m_saveNameUTF8; + return m_retrievedDescData.m_saveNameUTF8; } ESavePlatform SonyRemoteStorage::getSavePlatform() { if(m_getInfoStatus != e_infoFound) return SAVE_FILE_PLATFORM_NONE; - DescriptionData* pDescData = (DescriptionData*)m_remoteFileInfo->fileDescription; - return (ESavePlatform)MAKE_FOURCC(pDescData->m_platform[0], pDescData->m_platform[1], pDescData->m_platform[2], pDescData->m_platform[3]); + return m_retrievedDescData.m_savePlatform; } @@ -165,51 +197,23 @@ __int64 SonyRemoteStorage::getSaveSeed() { if(m_getInfoStatus != e_infoFound) return 0; - DescriptionData* pDescData = (DescriptionData*)m_remoteFileInfo->fileDescription; - char seedString[17]; - ZeroMemory(seedString,17); - memcpy(seedString, pDescData->m_seed,16); - - __uint64 seed = 0; - std::stringstream ss; - ss << seedString; - ss >> std::hex >> seed; - return seed; + return m_retrievedDescData.m_seed; } unsigned int SonyRemoteStorage::getSaveHostOptions() { if(m_getInfoStatus != e_infoFound) return 0; - DescriptionData* pDescData = (DescriptionData*)m_remoteFileInfo->fileDescription; - - char optionsString[9]; - ZeroMemory(optionsString,9); - memcpy(optionsString, pDescData->m_hostOptions,8); - - unsigned int uiHostOptions = 0; - std::stringstream ss; - ss << optionsString; - ss >> std::hex >> uiHostOptions; - return uiHostOptions; + return m_retrievedDescData.m_hostOptions; } unsigned int SonyRemoteStorage::getSaveTexturePack() { if(m_getInfoStatus != e_infoFound) return 0; - DescriptionData* pDescData = (DescriptionData*)m_remoteFileInfo->fileDescription; - char textureString[9]; - ZeroMemory(textureString,9); - memcpy(textureString, pDescData->m_texturePack,8); - - unsigned int uiTexturePack = 0; - std::stringstream ss; - ss << textureString; - ss >> std::hex >> uiTexturePack; - return uiTexturePack; + return m_retrievedDescData.m_texturePack; } const char* SonyRemoteStorage::getRemoteSaveFilename() @@ -292,14 +296,41 @@ bool SonyRemoteStorage::saveIsAvailable() #endif } +bool SonyRemoteStorage::saveVersionSupported() +{ + return (m_retrievedDescData.m_saveVersion <= SAVE_FILE_VERSION_NUMBER); +} + + + int SonyRemoteStorage::getDataProgress() { + if(m_dataProgress < 0) + return 0; + int chunkSize = 1024*1024; // 1mb chunks when downloading + int totalSize = getSaveFilesize(); + int transferRatePerSec = 300*1024; // a pessimistic download transfer rate + if(getStatus() == e_setDataInProgress) + { + chunkSize = 5 * 1024 * 1024; // 5mb chunks when uploading + totalSize = m_uploadSaveSize; + transferRatePerSec = 20*1024; // a pessimistic upload transfer rate + } + int sizeTransferred = (totalSize * m_dataProgress) / 100; + int nextChunk = ((sizeTransferred + chunkSize) * 100) / totalSize; + + __int64 time = System::currentTimeMillis(); int elapsedSecs = (time - m_startTime) / 1000; - int progVal = m_dataProgress + (elapsedSecs/3); - if(progVal > 95) + float estimatedTransfered = float(elapsedSecs * transferRatePerSec); + int progVal = m_dataProgress + (estimatedTransfered / float(totalSize)) * 100; + if(progVal > nextChunk) + return nextChunk; + if(progVal > 99) { - return m_dataProgress; + if(m_dataProgress > 99) + return m_dataProgress; + return 99; } return progVal; } @@ -338,3 +369,139 @@ void SonyRemoteStorage::waitForStorageManagerIdle() storageState = StorageManager.GetSaveState(); } } +void SonyRemoteStorage::GetDescriptionData(char* descData) +{ + switch(sc_CurrentDescDataVersion) + { + case 1: + { + DescriptionData descData_V1; + GetDescriptionData(descData_V1); + memcpy(descData, &descData_V1, sizeof(descData_V1)); + } + break; + case 2: + { + DescriptionData_V2 descData_V2; + GetDescriptionData(descData_V2); + memcpy(descData, &descData_V2, sizeof(descData_V2)); + } + break; + default: + assert(0); + break; + } +} + +void SonyRemoteStorage::GetDescriptionData( DescriptionData& descData) +{ + ZeroMemory(&descData, sizeof(DescriptionData)); + descData.m_platform[0] = SAVE_FILE_PLATFORM_LOCAL & 0xff; + descData.m_platform[1] = (SAVE_FILE_PLATFORM_LOCAL >> 8) & 0xff; + descData.m_platform[2] = (SAVE_FILE_PLATFORM_LOCAL >> 16) & 0xff; + descData.m_platform[3] = (SAVE_FILE_PLATFORM_LOCAL >> 24)& 0xff; + + if(m_thumbnailData) + { + unsigned int uiHostOptions; + bool bHostOptionsRead; + DWORD uiTexturePack; + char seed[22]; + app.GetImageTextData(m_thumbnailData, m_thumbnailDataSize,(unsigned char *)seed, uiHostOptions, bHostOptionsRead, uiTexturePack); + + __int64 iSeed = strtoll(seed,NULL,10); + SetU64HexBytes(descData.m_seed, iSeed); + // Save the host options that this world was last played with + SetU32HexBytes(descData.m_hostOptions, uiHostOptions); + // Save the texture pack id + SetU32HexBytes(descData.m_texturePack, uiTexturePack); + } + + memcpy(descData.m_saveNameUTF8, m_saveFileDesc, strlen(m_saveFileDesc)); + +} + +void SonyRemoteStorage::GetDescriptionData( DescriptionData_V2& descData) +{ + ZeroMemory(&descData, sizeof(DescriptionData_V2)); + descData.m_platformNone[0] = SAVE_FILE_PLATFORM_NONE & 0xff; + descData.m_platformNone[1] = (SAVE_FILE_PLATFORM_NONE >> 8) & 0xff; + descData.m_platformNone[2] = (SAVE_FILE_PLATFORM_NONE >> 16) & 0xff; + descData.m_platformNone[3] = (SAVE_FILE_PLATFORM_NONE >> 24)& 0xff; + + // Save descData version + char descDataVersion[9]; + sprintf(descDataVersion,"%08x",sc_CurrentDescDataVersion); + memcpy(descData.m_descDataVersion,descDataVersion,8); // Don't copy null + + + descData.m_platform[0] = SAVE_FILE_PLATFORM_LOCAL & 0xff; + descData.m_platform[1] = (SAVE_FILE_PLATFORM_LOCAL >> 8) & 0xff; + descData.m_platform[2] = (SAVE_FILE_PLATFORM_LOCAL >> 16) & 0xff; + descData.m_platform[3] = (SAVE_FILE_PLATFORM_LOCAL >> 24)& 0xff; + + if(m_thumbnailData) + { + unsigned int uiHostOptions; + bool bHostOptionsRead; + DWORD uiTexturePack; + char seed[22]; + app.GetImageTextData(m_thumbnailData, m_thumbnailDataSize,(unsigned char *)seed, uiHostOptions, bHostOptionsRead, uiTexturePack); + + __int64 iSeed = strtoll(seed,NULL,10); + SetU64HexBytes(descData.m_seed, iSeed); + // Save the host options that this world was last played with + SetU32HexBytes(descData.m_hostOptions, uiHostOptions); + // Save the texture pack id + SetU32HexBytes(descData.m_texturePack, uiTexturePack); + // Save the savefile version + SetU32HexBytes(descData.m_saveVersion, SAVE_FILE_VERSION_NUMBER); + // clear out the future data with underscores + memset(descData.m_futureData, '_', sizeof(descData.m_futureData)); + } + + memcpy(descData.m_saveNameUTF8, m_saveFileDesc, strlen(m_saveFileDesc)); + +} + + +uint32_t SonyRemoteStorage::GetU32FromHexBytes(char* hexBytes) +{ + char hexString[9]; + ZeroMemory(hexString,9); + memcpy(hexString, hexBytes,8); + + uint32_t u32Val = 0; + std::stringstream ss; + ss << hexString; + ss >> std::hex >> u32Val; + return u32Val; +} + +uint64_t SonyRemoteStorage::GetU64FromHexBytes(char* hexBytes) +{ + char hexString[17]; + ZeroMemory(hexString,17); + memcpy(hexString, hexBytes,16); + + uint64_t u64Val = 0; + std::stringstream ss; + ss << hexString; + ss >> std::hex >> u64Val; + return u64Val; + +} + +void SonyRemoteStorage::SetU32HexBytes(char* hexBytes, uint32_t u32) +{ + char hexString[9]; + sprintf(hexString,"%08x",u32); + memcpy(hexBytes,hexString,8); // Don't copy null +} + +void SonyRemoteStorage::SetU64HexBytes(char* hexBytes, uint64_t u64) +{ + char hexString[17]; + sprintf(hexString,"%016llx",u64); + memcpy(hexBytes,hexString,16); // Don't copy null +} diff --git a/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.h b/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.h index f435848e..d38a06e2 100644 --- a/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.h +++ b/Minecraft.Client/Common/Network/Sony/SonyRemoteStorage.h @@ -40,6 +40,7 @@ public: PSAVE_INFO m_setSaveDataInfo; SceRemoteStorageData* m_remoteFileInfo; + char m_saveFileDesc[128]; class DescriptionData { @@ -52,6 +53,47 @@ public: char m_saveNameUTF8[128]; }; + class DescriptionData_V2 + { + // this stuff is read from a JSON query, so it all has to be text based, max 256 bytes + public: + char m_platformNone[4]; // set to no platform, to indicate we're using the newer version of the data + char m_descDataVersion[8]; // 4 bytes as hex - version number will be 2 in this case + char m_platform[4]; + char m_seed[16]; // 8 bytes as hex + char m_hostOptions[8]; // 4 bytes as hex + char m_texturePack[8]; // 4 bytes as hex + char m_saveVersion[8]; // 4 bytes as hex + char m_futureData[64]; // some space for future data in case we need to expand this at all + char m_saveNameUTF8[128]; + }; + + class DescriptionDataParsed + { + public: + int m_descDataVersion; + ESavePlatform m_savePlatform; + __int64 m_seed; + uint32_t m_hostOptions; + uint32_t m_texturePack; + uint32_t m_saveVersion; + char m_saveNameUTF8[128]; + }; + + static const int sc_CurrentDescDataVersion = 2; + + void GetDescriptionData(char* descData); + void GetDescriptionData(DescriptionData& descData); + void GetDescriptionData(DescriptionData_V2& descData); + uint32_t GetU32FromHexBytes(char* hexBytes); + uint64_t GetU64FromHexBytes(char* hexBytes); + + void SetU32HexBytes(char* hexBytes, uint32_t u32); + void SetU64HexBytes(char* hexBytes, uint64_t u64); + + DescriptionDataParsed m_retrievedDescData; + void SetRetrievedDescData(); + CallbackFunc m_callbackFunc; void* m_callbackParam; @@ -62,6 +104,7 @@ public: void getSaveInfo(); bool waitingForSaveInfo() { return (m_getInfoStatus == e_gettingInfo); } bool saveIsAvailable(); + bool saveVersionSupported(); int getSaveFilesize(); bool getSaveData(const char* localDirname, CallbackFunc cb, LPVOID lpParam); @@ -115,6 +158,6 @@ protected: bool m_bAborting; bool m_bTransferStarted; - + int m_uploadSaveSize; }; diff --git a/Minecraft.Client/Common/Potion_Macros.h b/Minecraft.Client/Common/Potion_Macros.h index 29f3e03a..d458ac4b 100644 --- a/Minecraft.Client/Common/Potion_Macros.h +++ b/Minecraft.Client/Common/Potion_Macros.h @@ -35,6 +35,8 @@ #define MACRO_POTION_IS_SLOWNESS(aux) ((aux & 0x200F) == MASK_SLOWNESS) #define MACRO_POTION_IS_POISON(aux) ((aux & 0x200F) == MASK_POISON) #define MACRO_POTION_IS_INSTANTDAMAGE(aux) ((aux & 0x200F) == MASK_INSTANTDAMAGE) +#define MACRO_POTION_IS_NIGHTVISION(aux) ((aux & 0x200F) == MASK_NIGHTVISION) +#define MACRO_POTION_IS_INVISIBILITY(aux) ((aux & 0x200F) == MASK_INVISIBILITY) #define MACRO_POTION_IS_SPLASH(aux) ((aux & MASK_SPLASH) == MASK_SPLASH) #define MACRO_POTION_IS_BOTTLE(aux) ((aux & MASK_SPLASH) == 0) diff --git a/Minecraft.Client/Common/Tutorial/DiggerItemHint.cpp b/Minecraft.Client/Common/Tutorial/DiggerItemHint.cpp index 1367f411..86dbe500 100644 --- a/Minecraft.Client/Common/Tutorial/DiggerItemHint.cpp +++ b/Minecraft.Client/Common/Tutorial/DiggerItemHint.cpp @@ -62,7 +62,7 @@ int DiggerItemHint::attack(shared_ptr item, shared_ptr ent if(itemFound) { // It's also possible that we could hit TileEntities (eg falling sand) so don't want to give this hint then - if( dynamic_pointer_cast( entity ) != NULL ) + if( entity->instanceof(eTYPE_MOB) ) { return IDS_TUTORIAL_HINT_ATTACK_WITH_TOOL; } diff --git a/Minecraft.Client/Common/Tutorial/FullTutorial.cpp b/Minecraft.Client/Common/Tutorial/FullTutorial.cpp index 123ab9de..d0fda62e 100644 --- a/Minecraft.Client/Common/Tutorial/FullTutorial.cpp +++ b/Minecraft.Client/Common/Tutorial/FullTutorial.cpp @@ -140,7 +140,7 @@ FullTutorial::FullTutorial(int iPad, bool isTrial /*= false*/) int pickaxeAuxVals[] = {-1,-1,-1,-1,-1}; addTask(e_Tutorial_State_Gameplay, new CraftTask( pickaxeItems, pickaxeAuxVals, 5, 1, this, IDS_TUTORIAL_TASK_CREATE_WOODEN_PICKAXE) ); - addTask(e_Tutorial_State_Gameplay, new PickupTask( Tile::stoneBrick_Id, 8, -1, this, IDS_TUTORIAL_TASK_MINE_STONE ) ); + addTask(e_Tutorial_State_Gameplay, new PickupTask( Tile::cobblestone_Id, 8, -1, this, IDS_TUTORIAL_TASK_MINE_STONE ) ); addTask(e_Tutorial_State_Gameplay, new ProgressFlagTask( &m_progressFlags, FULL_TUTORIAL_PROGRESS_CRAFT_FURNACE, ProgressFlagTask::e_Progress_Set_Flag, this ) ); addTask(e_Tutorial_State_Gameplay, new CraftTask( Tile::furnace_Id, -1, 1, this, IDS_TUTORIAL_TASK_CREATE_FURNACE ) ); @@ -522,8 +522,8 @@ FullTutorial::FullTutorial(int iPad, bool isTrial /*= false*/) AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"tradingArea"); if(area != NULL) { - eTutorial_State enchantingStates[] = {e_Tutorial_State_Gameplay}; - AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Trading, enchantingStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + eTutorial_State tradingStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Trading, tradingStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); addTask(e_Tutorial_State_Trading, new ChoiceTask(this, IDS_TUTORIAL_TASK_TRADING_OVERVIEW, IDS_TUTORIAL_PROMPT_TRADING_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Trading) ); @@ -535,6 +535,75 @@ FullTutorial::FullTutorial(int iPad, bool isTrial /*= false*/) } } + /* + * + * + * FIREWORKS + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"fireworksArea"); + if(area != NULL) + { + eTutorial_State fireworkStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Fireworks, fireworkStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + + addTask(e_Tutorial_State_Fireworks, new ChoiceTask(this, IDS_TUTORIAL_TASK_FIREWORK_OVERVIEW, IDS_TUTORIAL_PROMPT_FIREWORK_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Trading) ); + + addTask(e_Tutorial_State_Fireworks, new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_PURPOSE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Fireworks, new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_CUSTOMISE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); // + addTask(e_Tutorial_State_Fireworks, new InfoTask(this, IDS_TUTORIAL_TASK_FIREWORK_CRAFTING, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + } + + /* + * + * + * BEACON + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"beaconArea"); + if(area != NULL) + { + eTutorial_State beaconStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Beacon, beaconStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + + addTask(e_Tutorial_State_Beacon, new ChoiceTask(this, IDS_TUTORIAL_TASK_BEACON_OVERVIEW, IDS_TUTORIAL_PROMPT_BEACON_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Beacon) ); + + addTask(e_Tutorial_State_Beacon, new InfoTask(this, IDS_TUTORIAL_TASK_BEACON_PURPOSE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Beacon, new InfoTask(this, IDS_TUTORIAL_TASK_BEACON_DESIGN, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Beacon, new InfoTask(this, IDS_TUTORIAL_TASK_BEACON_CHOOSING_POWERS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + } + + /* + * + * + * HOPPER + * + */ + if(app.getGameRuleDefinitions() != NULL) + { + AABB *area = app.getGameRuleDefinitions()->getNamedArea(L"hopperArea"); + if(area != NULL) + { + eTutorial_State hopperStates[] = {e_Tutorial_State_Gameplay}; + AddGlobalConstraint( new ChangeStateConstraint(this, e_Tutorial_State_Hopper, hopperStates, 1, area->x0,area->y0,area->z0,area->x1,area->y1,area->z1) ); + + addTask(e_Tutorial_State_Hopper, new ChoiceTask(this, IDS_TUTORIAL_TASK_HOPPER_OVERVIEW, IDS_TUTORIAL_PROMPT_HOPPER_OVERVIEW, true, ACTION_MENU_A, ACTION_MENU_B, e_Tutorial_Completion_Complete_State_Gameplay_Constraints, eTelemetryTutorial_Hopper) ); + + addTask(e_Tutorial_State_Hopper, new InfoTask(this, IDS_TUTORIAL_TASK_HOPPER_PURPOSE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Hopper, new InfoTask(this, IDS_TUTORIAL_TASK_HOPPER_CONTAINERS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Hopper, new InfoTask(this, IDS_TUTORIAL_TASK_HOPPER_MECHANICS, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Hopper, new InfoTask(this, IDS_TUTORIAL_TASK_HOPPER_REDSTONE, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Hopper, new InfoTask(this, IDS_TUTORIAL_TASK_HOPPER_OUTPUT, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + addTask(e_Tutorial_State_Hopper, new InfoTask(this, IDS_TUTORIAL_TASK_HOPPER_AREA, IDS_TUTORIAL_PROMPT_PRESS_A_TO_CONTINUE, true, ACTION_MENU_A) ); + } + } + /* * * diff --git a/Minecraft.Client/Common/Tutorial/HorseChoiceTask.cpp b/Minecraft.Client/Common/Tutorial/HorseChoiceTask.cpp new file mode 100644 index 00000000..e1d50fbf --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/HorseChoiceTask.cpp @@ -0,0 +1,43 @@ +#include "stdafx.h" + +#include + +#include "Minecraft.h" +#include "Tutorial.h" + +#include "..\Minecraft.World\EntityHorse.h" + +#include "HorseChoiceTask.h" + +HorseChoiceTask::HorseChoiceTask(Tutorial *tutorial, int iDescHorse, int iDescDonkey, int iDescMule, int iPromptId, + bool requiresUserInput, int iConfirmMapping, int iCancelMapping, + eTutorial_CompletionAction cancelAction, ETelemetryChallenges telemetryEvent) + + : ChoiceTask(tutorial, -1, iPromptId, requiresUserInput, iConfirmMapping, iCancelMapping, cancelAction, telemetryEvent) +{ + m_eHorseType = -1; + m_iDescMule = iDescMule; + m_iDescDonkey = iDescDonkey; + m_iDescHorse = iDescHorse; +} + +int HorseChoiceTask::getDescriptionId() +{ + switch (m_eHorseType) + { + case EntityHorse::TYPE_HORSE: return m_iDescHorse; + case EntityHorse::TYPE_DONKEY: return m_iDescDonkey; + case EntityHorse::TYPE_MULE: return m_iDescMule; + default: return -1; + } + return -1; +} + +void HorseChoiceTask::onLookAtEntity(shared_ptr entity) +{ + if ( (m_eHorseType < 0) && entity->instanceof(eTYPE_HORSE) ) + { + shared_ptr horse = dynamic_pointer_cast(entity); + if ( horse->isAdult() ) m_eHorseType = horse->getType(); + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/HorseChoiceTask.h b/Minecraft.Client/Common/Tutorial/HorseChoiceTask.h new file mode 100644 index 00000000..5130a7c7 --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/HorseChoiceTask.h @@ -0,0 +1,23 @@ +#pragma once +using namespace std; + +#include "ChoiceTask.h" + + +// Same as choice task, but switches description based on horse type. +class HorseChoiceTask : public ChoiceTask +{ +protected: + int m_eHorseType; + + int m_iDescHorse, m_iDescDonkey, m_iDescMule; + +public: + HorseChoiceTask(Tutorial *tutorial, int iDescHorse, int iDescDonkey, int iDescMule, int iPromptId = -1, + bool requiresUserInput = false, int iConfirmMapping = 0, int iCancelMapping = 0, + eTutorial_CompletionAction cancelAction = e_Tutorial_Completion_None, ETelemetryChallenges telemetryEvent = eTelemetryChallenges_Unknown); + + virtual int getDescriptionId(); + + virtual void onLookAtEntity(shared_ptr entity); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/LookAtTileHint.cpp b/Minecraft.Client/Common/Tutorial/LookAtTileHint.cpp index 0a953a7b..c8723a84 100644 --- a/Minecraft.Client/Common/Tutorial/LookAtTileHint.cpp +++ b/Minecraft.Client/Common/Tutorial/LookAtTileHint.cpp @@ -50,15 +50,11 @@ bool LookAtTileHint::onLookAt(int id,int iData) else { message->m_icon = id; - if(m_iDataOverride > -1) - { - message->m_iAuxVal = m_iDataOverride; - } - else - { - message->m_iAuxVal = iData; - } } + + // 4J-JEV: Moved to keep data override even if we're overriding the icon as well. + message->m_iAuxVal = (m_iDataOverride > -1) ? m_iDataOverride : iData; + message->m_messageId = Item::items[id]->getUseDescriptionId(); message->m_titleId = Item::items[id]->getDescriptionId(message->m_iAuxVal); return m_tutorial->setMessage(this, message); diff --git a/Minecraft.Client/Common/Tutorial/RideEntityTask.cpp b/Minecraft.Client/Common/Tutorial/RideEntityTask.cpp new file mode 100644 index 00000000..29fe592d --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/RideEntityTask.cpp @@ -0,0 +1,30 @@ +#include "stdafx.h" + +#include + +#include "Minecraft.h" +#include "Tutorial.h" + +#include "..\Minecraft.World\EntityHorse.h" + +#include "RideEntityTask.h" + +RideEntityTask::RideEntityTask(const int eType, Tutorial *tutorial, int descriptionId, + bool enablePreCompletion, vector *inConstraints, bool bShowMinimumTime, bool bAllowFade, bool bTaskReminders) + : TutorialTask( tutorial, descriptionId, enablePreCompletion, inConstraints, bShowMinimumTime, bAllowFade, bTaskReminders ), + m_eType( eType ) +{ +} + +bool RideEntityTask::isCompleted() +{ + return bIsCompleted; +} + +void RideEntityTask::onRideEntity(shared_ptr entity) +{ + if (entity->instanceof((eINSTANCEOF) m_eType)) + { + bIsCompleted = true; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/RideEntityTask.h b/Minecraft.Client/Common/Tutorial/RideEntityTask.h new file mode 100644 index 00000000..d9b6d41e --- /dev/null +++ b/Minecraft.Client/Common/Tutorial/RideEntityTask.h @@ -0,0 +1,22 @@ +#pragma once +using namespace std; + +#include "TutorialTask.h" + +class Level; + +// 4J-JEV: Tasks that involve riding an entity. +class RideEntityTask : public TutorialTask +{ +protected: + const int m_eType; + +public: + RideEntityTask(const int eTYPE, Tutorial *tutorial, int descriptionId, + bool enablePreCompletion = false, vector *inConstraints = NULL, + bool bShowMinimumTime = false, bool bAllowFade = true, bool bTaskReminders = true ); + + virtual bool isCompleted(); + + virtual void onRideEntity(shared_ptr entity); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/Tutorial/Tutorial.cpp b/Minecraft.Client/Common/Tutorial/Tutorial.cpp index b0a0d665..057e2171 100644 --- a/Minecraft.Client/Common/Tutorial/Tutorial.cpp +++ b/Minecraft.Client/Common/Tutorial/Tutorial.cpp @@ -289,9 +289,9 @@ void Tutorial::staticCtor() s_completableTasks.push_back( e_Tutorial_Hint_Potato ); s_completableTasks.push_back( e_Tutorial_Hint_Carrot ); - s_completableTasks.push_back( e_Tutorial_Hint_Item_Unused_18 ); - s_completableTasks.push_back( e_Tutorial_Hint_Item_Unused_19 ); - s_completableTasks.push_back( e_Tutorial_Hint_Item_Unused_20 ); + s_completableTasks.push_back( e_Tutorial_Hint_CommandBlock ); + s_completableTasks.push_back( e_Tutorial_Hint_Beacon ); + s_completableTasks.push_back( e_Tutorial_Hint_Activator_Rail ); s_completableTasks.push_back( eTutorial_Telemetry_TrialStart ); s_completableTasks.push_back( eTutorial_Telemetry_Halfway ); @@ -317,9 +317,31 @@ void Tutorial::staticCtor() s_completableTasks.push_back( e_Tutorial_State_Anvil ); s_completableTasks.push_back( e_Tutorial_State_Anvil_Menu ); s_completableTasks.push_back( e_Tutorial_State_Enderchests ); + s_completableTasks.push_back( e_Tutorial_State_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 cc1c1b82..ffe83081 100644 --- a/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp +++ b/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp @@ -104,7 +104,7 @@ int IUIScene_AbstractContainerMenu::GetSectionDimensions( ESceneSection eSection return( ( *piNumRows ) * ( *piNumColumns ) ); } -void IUIScene_AbstractContainerMenu::updateSlotPosition( ESceneSection eSection, ESceneSection newSection, ETapState eTapDirection, int *piTargetX, int *piTargetY, int xOffset ) +void IUIScene_AbstractContainerMenu::updateSlotPosition( ESceneSection eSection, ESceneSection newSection, ETapState eTapDirection, int *piTargetX, int *piTargetY, int xOffset, int yOffset ) { // Update the target slot based on the size of the current section int columns, rows; @@ -124,10 +124,19 @@ void IUIScene_AbstractContainerMenu::updateSlotPosition( ESceneSection eSection, { (*piTargetY) = 0; } - if( (*piTargetY) < 0 ) + int offsetY = (*piTargetY) - yOffset; + if( offsetY < 0 ) { (*piTargetY) = 0; } + else if(offsetY >= rows) + { + (*piTargetY) = rows - 1; + } + else + { + (*piTargetY) = offsetY; + } // Update X int offsetX = (*piTargetX) - xOffset; @@ -340,124 +349,124 @@ void IUIScene_AbstractContainerMenu::onMouseTick() { // reset the touch flag m_bFirstTouchStored[iPad]=false; - + #endif - // If there is any input on sticks, move the pointer. - if ( ( fabs( fInputX ) >= 0.01f ) || ( fabs( fInputY ) >= 0.01f ) ) + // If there is any input on sticks, move the pointer. + if ( ( fabs( fInputX ) >= 0.01f ) || ( fabs( fInputY ) >= 0.01f ) ) + { + fInputDirX = ( fInputX > 0.0f ) ? 1.0f : ( fInputX < 0.0f )?-1.0f : 0.0f; + fInputDirY = ( fInputY > 0.0f ) ? 1.0f : ( fInputY < 0.0f )?-1.0f : 0.0f; + +#ifdef TAP_DETECTION + // Check for potential tap input to jump slot. + ETapState eNewTapInput = GetTapInputType( fInputX, fInputY ); + + switch( m_eCurrTapState ) { - 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__ } @@ -589,6 +598,9 @@ void IUIScene_AbstractContainerMenu::onMouseTick() } } + // 4J - TomK - set to section none if this is a non-visible section + if(!IsVisible(eSectionUnderPointer)) eSectionUnderPointer = eSectionNone; + // If we are not over any slot, set focus elsewhere. if ( eSectionUnderPointer == eSectionNone ) { @@ -768,20 +780,26 @@ void IUIScene_AbstractContainerMenu::onMouseTick() if( bPointerIsOverSlot && bSlotHasItem ) { - vector unformattedStrings; - wstring desc = GetItemDescription( slot, unformattedStrings ); - SetPointerText(desc, unformattedStrings, slot != m_lastPointerLabelSlot); + vector *desc = GetItemDescription(slot); + SetPointerText(desc, slot != m_lastPointerLabelSlot); m_lastPointerLabelSlot = slot; + delete desc; + } + else if (eSectionUnderPointer != eSectionNone && !IsSectionSlotList(eSectionUnderPointer) ) + { + vector *desc = GetSectionHoverText(eSectionUnderPointer); + SetPointerText(desc, false); + m_lastPointerLabelSlot = NULL; + delete desc; } else { - vector unformattedStrings; - SetPointerText(L"", unformattedStrings, false); + SetPointerText(NULL, false); m_lastPointerLabelSlot = NULL; } - EToolTipItem buttonA, buttonX, buttonY, buttonRT; - buttonA = buttonX = buttonY = buttonRT = eToolTipNone; + EToolTipItem buttonA, buttonX, buttonY, buttonRT, buttonBack; + buttonA = buttonX = buttonY = buttonRT = buttonBack = eToolTipNone; if ( bPointerIsOverSlot ) { SetPointerOutsideMenu( false ); @@ -865,13 +883,22 @@ void IUIScene_AbstractContainerMenu::onMouseTick() if ( iSlotCount == 1 ) { buttonA = eToolTipPickUpGeneric; - buttonRT = eToolTipWhatIsThis; } else { // Multiple items in slot. buttonA = eToolTipPickUpAll; buttonX = eToolTipPickUpHalf; + } + +#ifdef __PSVITA__ + if (!InputManager.IsVitaTV()) + { + buttonBack = eToolTipWhatIsThis; + } + else +#endif + { buttonRT = eToolTipWhatIsThis; } } @@ -1051,7 +1078,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick() bool bValidIngredient=false; //bool bValidIngredientBottom=false; - if(Item::items[iId]->hasPotionBrewingFormula() || (iId == Item::netherStalkSeeds_Id)) + if(Item::items[iId]->hasPotionBrewingFormula() || (iId == Item::netherwart_seeds_Id)) { bValidIngredient=true; } @@ -1124,10 +1151,10 @@ void IUIScene_AbstractContainerMenu::onMouseTick() buttonY=eToolTipQuickMoveWeapon; break; - case Item::helmet_cloth_Id: - case Item::chestplate_cloth_Id: - case Item::leggings_cloth_Id: - case Item::boots_cloth_Id: + case Item::helmet_leather_Id: + case Item::chestplate_leather_Id: + case Item::leggings_leather_Id: + case Item::boots_leather_Id: case Item::helmet_chain_Id: case Item::chestplate_chain_Id: @@ -1201,13 +1228,13 @@ void IUIScene_AbstractContainerMenu::onMouseTick() shared_ptr item = nullptr; if(bPointerIsOverSlot && bSlotHasItem) item = getSlotItem(eSectionUnderPointer, iNewSlotIndex); - overrideTooltips(eSectionUnderPointer, item, bIsItemCarried, bSlotHasItem, bCarriedIsSameAsSlot, iSlotStackSizeRemaining, buttonA, buttonX, buttonY, buttonRT); + overrideTooltips(eSectionUnderPointer, item, bIsItemCarried, bSlotHasItem, bCarriedIsSameAsSlot, iSlotStackSizeRemaining, buttonA, buttonX, buttonY, buttonRT, buttonBack); SetToolTip( eToolTipButtonA, buttonA ); SetToolTip( eToolTipButtonX, buttonX ); SetToolTip( eToolTipButtonY, buttonY ); SetToolTip( eToolTipButtonRT, buttonRT ); - + SetToolTip( eToolTipButtonBack, buttonBack ); // Offset back to image top left. vPointerPos.x -= m_fPointerImageOffsetX; @@ -1278,7 +1305,7 @@ bool IUIScene_AbstractContainerMenu::handleKeyDown(int iPad, int iAction, bool b BOOL quickKeyHeld=FALSE; // Represents shift key on PC BOOL validKeyPress = FALSE; - //BOOL itemEditorKeyPress = FALSE; + bool itemEditorKeyPress = false; // Ignore input from other players //if(pMinecraft->player->GetXboxPad()!=pInputData->UserIndex) return S_OK; @@ -1286,11 +1313,9 @@ bool IUIScene_AbstractContainerMenu::handleKeyDown(int iPad, int iAction, bool b switch(iAction) { #ifdef _DEBUG_MENUS_ENABLED -#if TO_BE_IMPLEMENTED - case VK_PAD_RTHUMB_PRESS: + case ACTION_MENU_OTHER_STICK_PRESS: itemEditorKeyPress = TRUE; break; -#endif #endif case ACTION_MENU_A: #ifdef __ORBIS__ @@ -1419,13 +1444,7 @@ bool IUIScene_AbstractContainerMenu::handleKeyDown(int iPad, int iAction, bool b bHandled = true; } break; -#ifdef __PSVITA__ - //CD - Vita uses select for What's this - key 40 - case MINECRAFT_ACTION_GAME_INFO: -#else case ACTION_MENU_PAGEDOWN: -#endif - { if( IsSectionSlotList( m_eCurrSection ) ) { @@ -1491,46 +1510,18 @@ bool IUIScene_AbstractContainerMenu::handleKeyDown(int iPad, int iAction, bool b bHandled = true; } #ifdef _DEBUG_MENUS_ENABLED -#if TO_BE_IMPLEMENTED else if(itemEditorKeyPress == TRUE) { - HXUIOBJ hFocusObject = GetFocus(pInputData->UserIndex); - HXUIOBJ hFocusObjectParent; - XuiElementGetParent( hFocusObject, &hFocusObjectParent ); - - HXUICLASS hClassCXuiCtrlSlotList; - - // TODO Define values for these - hClassCXuiCtrlSlotList = XuiFindClass( L"CXuiCtrlSlotList" ); - - // If the press comes from a SlotList, cast it up then send a clicked call to it's menu - if( XuiIsInstanceOf( hFocusObjectParent, hClassCXuiCtrlSlotList ) ) - { - CXuiCtrlSlotList* slotList; - VOID *pObj; - XuiObjectFromHandle( hFocusObjectParent, &pObj ); - slotList = (CXuiCtrlSlotList *)pObj; - - int currentIndex = slotList->GetCurSel(); - - CXuiCtrlSlotItemListItem* pCXuiCtrlSlotItem; - slotList->GetCXuiCtrlSlotItem( currentIndex, &( pCXuiCtrlSlotItem ) ); - - //Minecraft *pMinecraft = Minecraft::GetInstance(); - - CScene_DebugItemEditor::ItemEditorInput *initData = new CScene_DebugItemEditor::ItemEditorInput(); - initData->iPad = m_iPad; - initData->slot = pCXuiCtrlSlotItem->getSlot( pCXuiCtrlSlotItem->m_hObj ); + if( IsSectionSlotList( m_eCurrSection ) ) + { + ItemEditorInput *initData = new ItemEditorInput(); + initData->iPad = getPad(); + initData->slot = getSlot( m_eCurrSection, getCurrentIndex(m_eCurrSection) ); initData->menu = m_menu; - // Add timer to poll controller stick input at 60Hz - HRESULT timerResult = KillTimer( POINTER_INPUT_TIMER_ID ); - assert( timerResult == S_OK ); - - app.NavigateToScene(m_iPad,eUIScene_DebugItemEditor,(void *)initData,false,TRUE); + ui.NavigateToScene(getPad(),eUIScene_DebugItemEditor,(void *)initData); } } -#endif #endif else { @@ -1552,7 +1543,7 @@ void IUIScene_AbstractContainerMenu::handleOutsideClicked(int iPad, int buttonNu // Drop items. //pMinecraft->localgameModes[m_iPad]->handleInventoryMouseClick(menu->containerId, AbstractContainerMenu::CLICKED_OUTSIDE, buttonNum, quickKeyHeld?true:false, pMinecraft->localplayers[m_iPad] ); - slotClicked(AbstractContainerMenu::CLICKED_OUTSIDE, buttonNum, quickKeyHeld?true:false); + slotClicked(AbstractContainerMenu::SLOT_CLICKED_OUTSIDE, buttonNum, quickKeyHeld?true:false); } void IUIScene_AbstractContainerMenu::handleOtherClicked(int iPad, ESceneSection eSection, int buttonNum, bool quickKey) @@ -1597,8 +1588,7 @@ bool IUIScene_AbstractContainerMenu::IsSameItemAs(shared_ptr itemA { if(itemA == NULL || itemB == NULL) return false; - bool bStackedByData = itemA->isStackedByData(); - return ( ( itemA->id == itemB->id ) && ( (bStackedByData && itemA->getAuxValue() == itemB->getAuxValue()) || !bStackedByData ) ); + return (itemA->id == itemB->id && (!itemB->isStackedByData() || itemB->getAuxValue() == itemA->getAuxValue()) && ItemInstance::tagMatches(itemB, itemA) ); } int IUIScene_AbstractContainerMenu::GetEmptyStackSpace(Slot *slot) @@ -1622,38 +1612,27 @@ int IUIScene_AbstractContainerMenu::GetEmptyStackSpace(Slot *slot) return iResult; } -wstring IUIScene_AbstractContainerMenu::GetItemDescription(Slot *slot, vector &unformattedStrings) +vector *IUIScene_AbstractContainerMenu::GetItemDescription(Slot *slot) { - if(slot == NULL) return L""; + if(slot == NULL) return NULL; - 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..7d16f522 100644 --- a/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.h +++ b/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.h @@ -52,7 +52,6 @@ protected: eSectionInventoryCreativeUsing, eSectionInventoryCreativeSelector, -#ifndef _XBOX eSectionInventoryCreativeTab_0, eSectionInventoryCreativeTab_1, eSectionInventoryCreativeTab_2, @@ -62,7 +61,6 @@ protected: eSectionInventoryCreativeTab_6, eSectionInventoryCreativeTab_7, eSectionInventoryCreativeSlider, -#endif eSectionInventoryCreativeMax, eSectionEnchantUsing, @@ -88,6 +86,37 @@ protected: eSectionAnvilResult, eSectionAnvilName, eSectionAnvilMax, + + eSectionBeaconUsing, + eSectionBeaconInventory, + eSectionBeaconItem, + eSectionBeaconPrimaryTierOneOne, + eSectionBeaconPrimaryTierOneTwo, + eSectionBeaconPrimaryTierTwoOne, + eSectionBeaconPrimaryTierTwoTwo, + eSectionBeaconPrimaryTierThree, + eSectionBeaconSecondaryOne, + eSectionBeaconSecondaryTwo, + eSectionBeaconConfirm, + eSectionBeaconMax, + + eSectionHopperUsing, + eSectionHopperInventory, + eSectionHopperContents, + eSectionHopperMax, + + eSectionHorseUsing, + eSectionHorseInventory, + eSectionHorseChest, + eSectionHorseArmor, + eSectionHorseSaddle, + eSectionHorseMax, + + eSectionFireworksUsing, + eSectionFireworksInventory, + eSectionFireworksResult, + eSectionFireworksIngredients, + eSectionFireworksMax, }; AbstractContainerMenu* m_menu; @@ -162,13 +191,14 @@ protected: virtual bool IsSectionSlotList( ESceneSection eSection ) { return eSection != eSectionNone; } virtual bool CanHaveFocus( ESceneSection eSection ) { return true; } + virtual bool IsVisible( ESceneSection eSection ) { return true; } int GetSectionDimensions( ESceneSection eSection, int* piNumColumns, int* piNumRows ); virtual int getSectionColumns(ESceneSection eSection) = 0; virtual int getSectionRows(ESceneSection eSection) = 0; virtual ESceneSection GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ) = 0; virtual void GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ) = 0; virtual void GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ) = 0; - void updateSlotPosition( ESceneSection eSection, ESceneSection newSection, ETapState eTapDirection, int *piTargetX, int *piTargetY, int xOffset ); + void updateSlotPosition( ESceneSection eSection, ESceneSection newSection, ETapState eTapDirection, int *piTargetX, int *piTargetY, int xOffset = 0, int yOffset = 0 ); #ifdef TAP_DETECTION ETapState GetTapInputType( float fInputX, float fInputY ); @@ -200,18 +230,32 @@ protected: virtual void setSectionFocus(ESceneSection eSection, int iPad) = 0; virtual void setSectionSelectedSlot(ESceneSection eSection, int x, int y) = 0; virtual void setFocusToPointer(int iPad) = 0; - virtual void SetPointerText(const wstring &description, vector &unformattedStrings, bool newSlot) = 0; + virtual void SetPointerText(vector *description, bool newSlot) = 0; + virtual vector *GetSectionHoverText(ESceneSection eSection); virtual shared_ptr getSlotItem(ESceneSection eSection, int iSlot) = 0; + virtual Slot *getSlot(ESceneSection eSection, int iSlot) = 0; virtual bool isSlotEmpty(ESceneSection eSection, int iSlot) = 0; virtual void adjustPointerForSafeZone() = 0; - virtual bool overrideTooltips(ESceneSection sectionUnderPointer, shared_ptr itemUnderPointer, bool bIsItemCarried, bool bSlotHasItem, bool bCarriedIsSameAsSlot, int iSlotStackSizeRemaining, - EToolTipItem &buttonA, EToolTipItem &buttonX, EToolTipItem &buttonY, EToolTipItem &buttonRT) { return false; } + virtual bool overrideTooltips( + ESceneSection sectionUnderPointer, + shared_ptr itemUnderPointer, + bool bIsItemCarried, + bool bSlotHasItem, + bool bCarriedIsSameAsSlot, + int iSlotStackSizeRemaining, + EToolTipItem &buttonA, + EToolTipItem &buttonX, + EToolTipItem &buttonY, + EToolTipItem &buttonRT, + EToolTipItem &buttonBack + ) { return false; } private: bool IsSameItemAs(shared_ptr itemA, shared_ptr itemB); int GetEmptyStackSpace(Slot *slot); - wstring GetItemDescription(Slot *slot, vector &unformattedStrings); + + vector *GetItemDescription(Slot *slot); protected: diff --git a/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp index 81451c7a..10d1bcc4 100644 --- a/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp +++ b/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.cpp @@ -206,7 +206,7 @@ void IUIScene_AnvilMenu::handleTick() m_costString = app.GetString(IDS_REPAIR_EXPENSIVE); canAfford = false; } - else if(!m_repairMenu->getSlot(RepairMenu::RESULT_SLOT)->hasItem()) + else if(!m_repairMenu->getSlot(AnvilMenu::RESULT_SLOT)->hasItem()) { // Do nothing } @@ -216,7 +216,7 @@ void IUIScene_AnvilMenu::handleTick() wchar_t temp[256]; swprintf(temp, 256, costString, m_repairMenu->cost); m_costString = temp; - if(!m_repairMenu->getSlot(RepairMenu::RESULT_SLOT)->mayPickup(dynamic_pointer_cast(m_inventory->player->shared_from_this()))) + if(!m_repairMenu->getSlot(AnvilMenu::RESULT_SLOT)->mayPickup(dynamic_pointer_cast(m_inventory->player->shared_from_this()))) { canAfford = false; } @@ -224,13 +224,13 @@ void IUIScene_AnvilMenu::handleTick() } setCostLabel(m_costString, canAfford); - bool crossVisible = (m_repairMenu->getSlot(RepairMenu::INPUT_SLOT)->hasItem() || m_repairMenu->getSlot(RepairMenu::ADDITIONAL_SLOT)->hasItem()) && !m_repairMenu->getSlot(RepairMenu::RESULT_SLOT)->hasItem(); + bool crossVisible = (m_repairMenu->getSlot(AnvilMenu::INPUT_SLOT)->hasItem() || m_repairMenu->getSlot(AnvilMenu::ADDITIONAL_SLOT)->hasItem()) && !m_repairMenu->getSlot(AnvilMenu::RESULT_SLOT)->hasItem(); showCross(crossVisible); } void IUIScene_AnvilMenu::updateItemName() { - Slot *slot = m_repairMenu->getSlot(RepairMenu::INPUT_SLOT); + Slot *slot = m_repairMenu->getSlot(AnvilMenu::INPUT_SLOT); if (slot != NULL && slot->hasItem()) { if (!slot->getItem()->hasCustomHoverName() && m_itemName.compare(slot->getItem()->getHoverName())==0) @@ -250,12 +250,12 @@ void IUIScene_AnvilMenu::updateItemName() void IUIScene_AnvilMenu::refreshContainer(AbstractContainerMenu *container, vector > *items) { - slotChanged(container, RepairMenu::INPUT_SLOT, container->getSlot(0)->getItem()); + slotChanged(container, AnvilMenu::INPUT_SLOT, container->getSlot(0)->getItem()); } void IUIScene_AnvilMenu::slotChanged(AbstractContainerMenu *container, int slotIndex, shared_ptr item) { - if (slotIndex == RepairMenu::INPUT_SLOT) + if (slotIndex == AnvilMenu::INPUT_SLOT) { m_itemName = item == NULL ? L"" : item->getHoverName(); setEditNameValue(m_itemName); diff --git a/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.h b/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.h index 6c4348f2..4e9e3aa7 100644 --- a/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.h +++ b/Minecraft.Client/Common/UI/IUIScene_AnvilMenu.h @@ -11,13 +11,13 @@ #define ANVIL_SCENE_ITEM2_SLOT_DOWN_OFFSET 4 class Inventory; -class RepairMenu; +class AnvilMenu; class IUIScene_AnvilMenu : public virtual IUIScene_AbstractContainerMenu, public net_minecraft_world_inventory::ContainerListener { protected: shared_ptr m_inventory; - RepairMenu *m_repairMenu; + AnvilMenu *m_repairMenu; wstring m_itemName; protected: diff --git a/Minecraft.Client/Common/UI/IUIScene_BeaconMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_BeaconMenu.cpp new file mode 100644 index 00000000..76d21406 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_BeaconMenu.cpp @@ -0,0 +1,410 @@ +#include "stdafx.h" +#include "..\Minecraft.World\CustomPayloadPacket.h" +#include "..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\Minecraft.World\net.minecraft.world.effect.h" +#include "..\Minecraft.World\HtmlString.h" +#include "IUIScene_BeaconMenu.h" +#include "Minecraft.h" +#include "MultiPlayerLocalPlayer.h" +#include "ClientConnection.h" + +IUIScene_BeaconMenu::IUIScene_BeaconMenu() +{ + m_beacon = nullptr; + m_initPowerButtons = true; +} + +IUIScene_AbstractContainerMenu::ESceneSection IUIScene_BeaconMenu::GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ) +{ + ESceneSection newSection = eSection; + + int xOffset = 0; + + // Find the new section if there is one + switch( eSection ) + { + case eSectionBeaconInventory: + if(eTapDirection == eTapStateDown) newSection = eSectionBeaconUsing; + else if(eTapDirection == eTapStateUp) + { + if( *piTargetX < 4 ) + { + newSection = eSectionBeaconPrimaryTierThree; + } + else if ( *piTargetX < 7) + { + newSection = eSectionBeaconItem; + } + else + { + newSection = eSectionBeaconConfirm; + } + } + break; + case eSectionBeaconUsing: + if(eTapDirection == eTapStateDown) + { + if( *piTargetX < 2) + { + newSection = eSectionBeaconPrimaryTierOneOne; + } + else if( *piTargetX < 5) + { + newSection = eSectionBeaconPrimaryTierOneTwo; + } + else if( *piTargetX > 8 && GetPowerButtonId(eSectionBeaconSecondaryTwo) > 0) + { + newSection = eSectionBeaconSecondaryTwo; + } + else + { + newSection = eSectionBeaconSecondaryOne; + } + } + else if(eTapDirection == eTapStateUp) newSection = eSectionBeaconInventory; + break; + case eSectionBeaconItem: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionBeaconInventory; + xOffset = -5; + } + else if(eTapDirection == eTapStateUp) newSection = eSectionBeaconSecondaryOne; + else if(eTapDirection == eTapStateLeft) newSection = eSectionBeaconConfirm; + else if(eTapDirection == eTapStateRight) newSection = eSectionBeaconConfirm; + break; + case eSectionBeaconPrimaryTierOneOne: + if(eTapDirection == eTapStateDown) newSection = eSectionBeaconPrimaryTierTwoOne; + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionBeaconUsing; + xOffset = -1; + } + else if(eTapDirection == eTapStateLeft) newSection = eSectionBeaconPrimaryTierOneTwo; + else if(eTapDirection == eTapStateRight) newSection = eSectionBeaconPrimaryTierOneTwo; + break; + case eSectionBeaconPrimaryTierOneTwo: + if(eTapDirection == eTapStateDown) newSection = eSectionBeaconPrimaryTierTwoTwo; + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionBeaconUsing; + xOffset = -3; + } + else if(eTapDirection == eTapStateLeft) newSection = eSectionBeaconPrimaryTierOneOne; + else if(eTapDirection == eTapStateRight) newSection = eSectionBeaconPrimaryTierOneOne; + break; + case eSectionBeaconPrimaryTierTwoOne: + if(eTapDirection == eTapStateDown) newSection = eSectionBeaconPrimaryTierThree; + else if(eTapDirection == eTapStateUp) newSection = eSectionBeaconPrimaryTierOneOne; + else if(eTapDirection == eTapStateLeft) + { + if(GetPowerButtonId(eSectionBeaconSecondaryTwo) > 0) + { + newSection = eSectionBeaconSecondaryTwo; + } + else + { + newSection = eSectionBeaconSecondaryOne; + } + } + else if(eTapDirection == eTapStateRight) newSection = eSectionBeaconPrimaryTierTwoTwo; + break; + case eSectionBeaconPrimaryTierTwoTwo: + if(eTapDirection == eTapStateDown) newSection = eSectionBeaconPrimaryTierThree; + else if(eTapDirection == eTapStateUp) newSection = eSectionBeaconPrimaryTierOneTwo; + else if(eTapDirection == eTapStateLeft) newSection = eSectionBeaconPrimaryTierTwoOne; + else if(eTapDirection == eTapStateRight) newSection = eSectionBeaconSecondaryOne; + break; + case eSectionBeaconPrimaryTierThree: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionBeaconInventory; + xOffset = -3; + } + else if(eTapDirection == eTapStateUp) newSection = eSectionBeaconPrimaryTierTwoOne; + break; + case eSectionBeaconSecondaryOne: + if(eTapDirection == eTapStateDown) newSection = eSectionBeaconItem; + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionBeaconUsing; + xOffset = -7; + } + else if(eTapDirection == eTapStateLeft) newSection = eSectionBeaconPrimaryTierTwoTwo; + else if(eTapDirection == eTapStateRight) + { + if(GetPowerButtonId(eSectionBeaconSecondaryTwo) > 0) + { + newSection = eSectionBeaconSecondaryTwo; + } + else + { + newSection = eSectionBeaconPrimaryTierTwoOne; + } + } + break; + case eSectionBeaconSecondaryTwo: + if(eTapDirection == eTapStateDown) newSection = eSectionBeaconItem; + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionBeaconUsing; + xOffset = -8; + } + else if(eTapDirection == eTapStateLeft) newSection = eSectionBeaconSecondaryOne; + else if(eTapDirection == eTapStateRight) newSection = eSectionBeaconPrimaryTierTwoOne; + break; + case eSectionBeaconConfirm: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionBeaconInventory; + xOffset = -8; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionBeaconSecondaryOne; + } + else if(eTapDirection == eTapStateLeft) newSection = eSectionBeaconItem; + else if(eTapDirection == eTapStateRight) newSection = eSectionBeaconItem; + break; + default: + assert(false); + break; + } + + updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, xOffset); + + return newSection; +} + +int IUIScene_BeaconMenu::getSectionStartOffset(IUIScene_AbstractContainerMenu::ESceneSection eSection) +{ + int offset = 0; + switch( eSection ) + { + case eSectionBeaconItem: + offset = BeaconMenu::PAYMENT_SLOT; + break; + case eSectionBeaconInventory: + offset = BeaconMenu::INV_SLOT_START; + break; + case eSectionBeaconUsing: + offset = BeaconMenu::USE_ROW_SLOT_START; + break; + default: + assert( false ); + break; + } + return offset; +} + +bool IUIScene_BeaconMenu::IsSectionSlotList( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionBeaconItem: + case eSectionBeaconInventory: + case eSectionBeaconUsing: + return true; + } + return false; +} + +void IUIScene_BeaconMenu::handleOtherClicked(int iPad, ESceneSection eSection, int buttonNum, bool quickKey) +{ + switch(eSection) + { + case eSectionBeaconConfirm: + { + if( (m_beacon->getItem(0) == NULL) || (m_beacon->getPrimaryPower() <= 0) ) return; + ByteArrayOutputStream baos; + DataOutputStream dos(&baos); + dos.writeInt(m_beacon->getPrimaryPower()); + dos.writeInt(m_beacon->getSecondaryPower()); + + Minecraft::GetInstance()->localplayers[getPad()]->connection->send(shared_ptr(new CustomPayloadPacket(CustomPayloadPacket::SET_BEACON_PACKET, baos.toByteArray()))); + + if (m_beacon->getPrimaryPower() > 0) + { + int effectId = m_beacon->getPrimaryPower(); + + bool active = true; + bool selected = false; + + int tier = 3; + if (tier >= m_beacon->getLevels()) + { + active = false; + } + else if (effectId == m_beacon->getSecondaryPower()) + { + selected = true; + } + + AddPowerButton(GetId(tier, m_beacon->getPrimaryPower()), MobEffect::effects[m_beacon->getPrimaryPower()]->getIcon(), tier, 1, active, selected); + } + } + break; + case eSectionBeaconPrimaryTierOneOne: + case eSectionBeaconPrimaryTierOneTwo: + case eSectionBeaconPrimaryTierTwoOne: + case eSectionBeaconPrimaryTierTwoTwo: + case eSectionBeaconPrimaryTierThree: + case eSectionBeaconSecondaryOne: + case eSectionBeaconSecondaryTwo: + if(IsPowerButtonSelected(eSection)) + { + return; + } + + int id = GetPowerButtonId(eSection); + int effectId = (id & 0xff); + int tier = (id >> 8); + + if (tier < 3) + { + m_beacon->setPrimaryPower(effectId); + } + else + { + m_beacon->setSecondaryPower(effectId); + } + SetPowerButtonSelected(eSection); + break; + }; +} + +void IUIScene_BeaconMenu::handleTick() +{ + if (m_initPowerButtons && m_beacon->getLevels() >= 0) + { + m_initPowerButtons = false; + for (int tier = 0; tier <= 2; tier++) + { + int count = BeaconTileEntity::BEACON_EFFECTS_EFFECTS;//BEACON_EFFECTS[tier].length; + int totalWidth = count * 22 + (count - 1) * 2; + + for (int c = 0; c < count; c++) + { + if(BeaconTileEntity::BEACON_EFFECTS[tier][c] == NULL) continue; + + int effectId = BeaconTileEntity::BEACON_EFFECTS[tier][c]->id; + int icon = BeaconTileEntity::BEACON_EFFECTS[tier][c]->getIcon(); + + bool active = true; + bool selected = false; + + if (tier >= m_beacon->getLevels()) + { + active = false; + } + else if (effectId == m_beacon->getPrimaryPower()) + { + selected = true; + } + + AddPowerButton(GetId(tier, effectId), icon, tier, c, active, selected); + } + } + + { + int tier = 3; + + int count = BeaconTileEntity::BEACON_EFFECTS_EFFECTS + 1;//BEACON_EFFECTS[tier].length + 1; + int totalWidth = count * 22 + (count - 1) * 2; + + for (int c = 0; c < count - 1; c++) + { + if(BeaconTileEntity::BEACON_EFFECTS[tier][c] == NULL) continue; + + int effectId = BeaconTileEntity::BEACON_EFFECTS[tier][c]->id; + int icon = BeaconTileEntity::BEACON_EFFECTS[tier][c]->getIcon(); + + bool active = true; + bool selected = false; + + if (tier >= m_beacon->getLevels()) + { + active = false; + } + else if (effectId == m_beacon->getSecondaryPower()) + { + selected = true; + } + + AddPowerButton(GetId(tier, effectId), icon, tier, c, active, selected); + } + if (m_beacon->getPrimaryPower() > 0) + { + int effectId = m_beacon->getPrimaryPower(); + + bool active = true; + bool selected = false; + + if (tier >= m_beacon->getLevels()) + { + active = false; + } + else if (effectId == m_beacon->getSecondaryPower()) + { + selected = true; + } + + AddPowerButton(GetId(tier, m_beacon->getPrimaryPower()), MobEffect::effects[m_beacon->getPrimaryPower()]->getIcon(), tier, 1, active, selected); + } + } + } + + SetConfirmButtonEnabled( (m_beacon->getItem(0) != NULL) && (m_beacon->getPrimaryPower() > 0) ); +} + +int IUIScene_BeaconMenu::GetId(int tier, int effectId) +{ + return (tier << 8) | effectId; +} + +vector *IUIScene_BeaconMenu::GetSectionHoverText(ESceneSection eSection) +{ + vector *desc = NULL; + switch(eSection) + { + case eSectionBeaconSecondaryTwo: + if(GetPowerButtonId(eSectionBeaconSecondaryTwo) == 0) + { + // This isn't visible + break; + } + // Fall through otherwise + case eSectionBeaconPrimaryTierOneOne: + case eSectionBeaconPrimaryTierOneTwo: + case eSectionBeaconPrimaryTierTwoOne: + case eSectionBeaconPrimaryTierTwoTwo: + case eSectionBeaconPrimaryTierThree: + case eSectionBeaconSecondaryOne: + { + int id = GetPowerButtonId(eSection); + int effectId = (id & 0xff); + + desc = new vector(); + + HtmlString string( app.GetString(MobEffect::effects[effectId]->getDescriptionId()), eHTMLColor_White ); + desc->push_back( string ); + } + break; + } + return desc; +} + +bool IUIScene_BeaconMenu::IsVisible( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionBeaconSecondaryTwo: + if(GetPowerButtonId(eSectionBeaconSecondaryTwo) == 0) + { + // This isn't visible + return false; + } + } + return true; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_BeaconMenu.h b/Minecraft.Client/Common/UI/IUIScene_BeaconMenu.h new file mode 100644 index 00000000..1f5f7340 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_BeaconMenu.h @@ -0,0 +1,31 @@ +#pragma once +#include "Common\UI\IUIScene_AbstractContainerMenu.h" + +class BeaconTileEntity; + +class IUIScene_BeaconMenu : public virtual IUIScene_AbstractContainerMenu +{ +public: + IUIScene_BeaconMenu(); + + virtual ESceneSection GetSectionAndSlotInDirection(ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY); + int getSectionStartOffset(ESceneSection eSection); + virtual void handleOtherClicked(int iPad, ESceneSection eSection, int buttonNum, bool quickKey); + virtual bool IsSectionSlotList( ESceneSection eSection ); + virtual vector *GetSectionHoverText(ESceneSection eSection); + bool IsVisible( ESceneSection eSection ); + +protected: + void handleTick(); + int GetId(int tier, int effectId); + + virtual void SetConfirmButtonEnabled(bool enabled) = 0; + virtual void AddPowerButton(int id, int icon, int tier, int count, bool active, bool selected) = 0; + virtual int GetPowerButtonId(ESceneSection eSection) = 0; + virtual bool IsPowerButtonSelected(ESceneSection eSection) = 0; + virtual void SetPowerButtonSelected(ESceneSection eSection) = 0; + + shared_ptr m_beacon; + bool m_initPowerButtons; +}; + diff --git a/Minecraft.Client/Common/UI/IUIScene_CommandBlockMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_CommandBlockMenu.cpp new file mode 100644 index 00000000..4371b4e5 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_CommandBlockMenu.cpp @@ -0,0 +1,25 @@ +#include "stdafx.h" +#include "../../../Minecraft.World/CustomPayloadPacket.h" +#include "MultiPlayerLocalPlayer.h" +#include "ClientConnection.h" +#include "IUIScene_CommandBlockMenu.h" + +void IUIScene_CommandBlockMenu::Initialise(CommandBlockEntity *commandBlock) +{ + m_commandBlock = commandBlock; + SetCommand(m_commandBlock->getCommand()); +} + +void IUIScene_CommandBlockMenu::ConfirmButtonClicked() +{ + ByteArrayOutputStream baos; + DataOutputStream dos(&baos); + + dos.writeInt(m_commandBlock->x); + dos.writeInt(m_commandBlock->y); + dos.writeInt(m_commandBlock->z); + dos.writeUTF(GetCommand()); + + Minecraft::GetInstance()->localplayers[GetPad()]->connection->send(shared_ptr(new CustomPayloadPacket(CustomPayloadPacket::SET_ADVENTURE_COMMAND_PACKET, baos.toByteArray()))); +} + diff --git a/Minecraft.Client/Common/UI/IUIScene_CommandBlockMenu.h b/Minecraft.Client/Common/UI/IUIScene_CommandBlockMenu.h new file mode 100644 index 00000000..db0aff82 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_CommandBlockMenu.h @@ -0,0 +1,18 @@ +#pragma once +#include "../Minecraft.World/net.minecraft.world.level.tile.entity.h" + +class IUIScene_CommandBlockMenu +{ +public: + void Initialise(CommandBlockEntity *commandBlock); + +protected: + void ConfirmButtonClicked(); + + virtual wstring GetCommand(); + virtual void SetCommand(wstring command); + virtual int GetPad(); + +private: + CommandBlockEntity *m_commandBlock; +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.cpp index f158b174..05a44202 100644 --- a/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.cpp +++ b/Minecraft.Client/Common/UI/IUIScene_CraftingMenu.cpp @@ -267,65 +267,68 @@ bool IUIScene_CraftingMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) //pMinecraft->soundEngine->playUI( L"random.pop", 1.0f, 1.0f); ui.PlayUISFX(eSFX_Craft); - // and remove those resources from your inventory - for(int i=0;iid != Item::fireworksCharge_Id && pTempItemInst->id != Item::fireworks_Id) { - for(int j=0;j ingItemInst = nullptr; - // do we need to remove a specific aux value? - if(pRecipeIngredientsRequired[iRecipe].iIngAuxValA[i]!=Recipes::ANY_AUX_VALUE) + for(int j=0;jinventory->getResourceItem( pRecipeIngredientsRequired[iRecipe].iIngIDA[i],pRecipeIngredientsRequired[iRecipe].iIngAuxValA[i] ); - m_pPlayer->inventory->removeResource(pRecipeIngredientsRequired[iRecipe].iIngIDA[i],pRecipeIngredientsRequired[iRecipe].iIngAuxValA[i]); - } - else - { - ingItemInst = m_pPlayer->inventory->getResourceItem( pRecipeIngredientsRequired[iRecipe].iIngIDA[i] ); - m_pPlayer->inventory->removeResource(pRecipeIngredientsRequired[iRecipe].iIngIDA[i]); - } - - // 4J Stu - Fix for #13097 - Bug: Milk Buckets are removed when crafting Cake - if (ingItemInst != NULL) - { - if (ingItemInst->getItem()->hasCraftingRemainingItem()) + shared_ptr ingItemInst = nullptr; + // do we need to remove a specific aux value? + if(pRecipeIngredientsRequired[iRecipe].iIngAuxValA[i]!=Recipes::ANY_AUX_VALUE) { - // 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..c3348e58 100644 --- a/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp +++ b/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.cpp @@ -8,6 +8,9 @@ #include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" #include "..\..\..\Minecraft.World\net.minecraft.world.item.h" #include "..\..\..\Minecraft.World\net.minecraft.world.item.enchantment.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.animal.h" +#include "..\..\..\Minecraft.World\JavaMath.h" // 4J JEV - Images for each tab. IUIScene_CreativeMenu::TabSpec **IUIScene_CreativeMenu::specs = NULL; @@ -26,14 +29,15 @@ void IUIScene_CreativeMenu::staticCtor() // Building Blocks DEF(eCreativeInventory_BuildingBlocks) - ITEM(Tile::rock_Id) + ITEM(Tile::stone_Id) ITEM(Tile::grass_Id) ITEM(Tile::dirt_Id) - ITEM(Tile::stoneBrick_Id) + ITEM(Tile::cobblestone_Id) ITEM(Tile::sand_Id) ITEM(Tile::sandStone_Id) ITEM_AUX(Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE) ITEM_AUX(Tile::sandStone_Id, SandStoneTile::TYPE_HEIROGLYPHS) + ITEM(Tile::coalBlock_Id) ITEM(Tile::goldBlock_Id) ITEM(Tile::ironBlock_Id) ITEM(Tile::lapisBlock_Id) @@ -59,24 +63,29 @@ void IUIScene_CreativeMenu::staticCtor() ITEM_AUX(Tile::treeTrunk_Id, TreeTile::JUNGLE_TRUNK) ITEM(Tile::gravel_Id) ITEM(Tile::redBrick_Id) - ITEM(Tile::mossStone_Id) + ITEM(Tile::mossyCobblestone_Id) ITEM(Tile::obsidian_Id) ITEM(Tile::clay) ITEM(Tile::ice_Id) ITEM(Tile::snow_Id) - ITEM(Tile::hellRock_Id) - ITEM(Tile::hellSand_Id) - ITEM(Tile::lightGem_Id) - ITEM_AUX(Tile::stoneBrickSmooth_Id,SmoothStoneBrickTile::TYPE_DEFAULT) - ITEM_AUX(Tile::stoneBrickSmooth_Id,SmoothStoneBrickTile::TYPE_MOSSY) - ITEM_AUX(Tile::stoneBrickSmooth_Id,SmoothStoneBrickTile::TYPE_CRACKED) - ITEM_AUX(Tile::stoneBrickSmooth_Id,SmoothStoneBrickTile::TYPE_DETAIL) + ITEM(Tile::netherRack_Id) + ITEM(Tile::soulsand_Id) + ITEM(Tile::glowstone_Id) + ITEM(Tile::fence_Id) + ITEM(Tile::netherFence_Id) + ITEM(Tile::ironFence_Id) + ITEM_AUX(Tile::cobbleWall_Id, WallTile::TYPE_NORMAL) + ITEM_AUX(Tile::cobbleWall_Id, WallTile::TYPE_MOSSY) + ITEM_AUX(Tile::stoneBrick_Id,SmoothStoneBrickTile::TYPE_DEFAULT) + ITEM_AUX(Tile::stoneBrick_Id,SmoothStoneBrickTile::TYPE_MOSSY) + ITEM_AUX(Tile::stoneBrick_Id,SmoothStoneBrickTile::TYPE_CRACKED) + ITEM_AUX(Tile::stoneBrick_Id,SmoothStoneBrickTile::TYPE_DETAIL) ITEM_AUX(Tile::monsterStoneEgg_Id,StoneMonsterTile::HOST_ROCK) ITEM_AUX(Tile::monsterStoneEgg_Id,StoneMonsterTile::HOST_COBBLE) ITEM_AUX(Tile::monsterStoneEgg_Id,StoneMonsterTile::HOST_STONEBRICK) ITEM(Tile::mycel_Id) ITEM(Tile::netherBrick_Id) - ITEM(Tile::whiteStone_Id) + ITEM(Tile::endStone_Id) ITEM_AUX(Tile::quartzBlock_Id,QuartzBlockTile::TYPE_CHISELED) ITEM_AUX(Tile::quartzBlock_Id,QuartzBlockTile::TYPE_LINES_Y) ITEM(Tile::trapdoor_Id) @@ -102,11 +111,28 @@ void IUIScene_CreativeMenu::staticCtor() ITEM(Tile::stairs_junglewood_Id) ITEM(Tile::stairs_stone_Id) ITEM(Tile::stairs_bricks_Id) - ITEM(Tile::stairs_stoneBrickSmooth_Id) + ITEM(Tile::stairs_stoneBrick_Id) ITEM(Tile::stairs_netherBricks_Id) ITEM(Tile::stairs_sandstone_Id) ITEM(Tile::stairs_quartz_Id) + ITEM(Tile::clayHardened_Id) + ITEM_AUX(Tile::clayHardened_colored_Id,14) // Red + ITEM_AUX(Tile::clayHardened_colored_Id,1) // Orange + ITEM_AUX(Tile::clayHardened_colored_Id,4) // Yellow + ITEM_AUX(Tile::clayHardened_colored_Id,5) // Lime + ITEM_AUX(Tile::clayHardened_colored_Id,3) // Light Blue + ITEM_AUX(Tile::clayHardened_colored_Id,9) // Cyan + ITEM_AUX(Tile::clayHardened_colored_Id,11) // Blue + ITEM_AUX(Tile::clayHardened_colored_Id,10) // Purple + ITEM_AUX(Tile::clayHardened_colored_Id,2) // Magenta + ITEM_AUX(Tile::clayHardened_colored_Id,6) // Pink + ITEM_AUX(Tile::clayHardened_colored_Id,0) // White + ITEM_AUX(Tile::clayHardened_colored_Id,8) // Light Gray + ITEM_AUX(Tile::clayHardened_colored_Id,7) // Gray + ITEM_AUX(Tile::clayHardened_colored_Id,15) // Black + ITEM_AUX(Tile::clayHardened_colored_Id,13) // Green + ITEM_AUX(Tile::clayHardened_colored_Id,12) // Brown // Decoration DEF(eCreativeInventory_Decoration) @@ -136,8 +162,8 @@ void IUIScene_CreativeMenu::staticCtor() ITEM(Tile::deadBush_Id) ITEM(Tile::flower_Id) ITEM(Tile::rose_Id) - ITEM(Tile::mushroom1_Id) - ITEM(Tile::mushroom2_Id) + ITEM(Tile::mushroom_brown_Id) + ITEM(Tile::mushroom_red_Id) ITEM(Tile::cactus_Id) ITEM(Tile::topSnow_Id) // 4J-PB - Already got sugar cane in Materials ITEM_11(Tile::reeds_Id) @@ -149,22 +175,23 @@ void IUIScene_CreativeMenu::staticCtor() ITEM(Item::sign_Id) ITEM(Tile::bookshelf_Id) ITEM(Item::flowerPot_Id) - ITEM_AUX(Tile::cloth_Id,14) // Red - ITEM_AUX(Tile::cloth_Id,1) // Orange - ITEM_AUX(Tile::cloth_Id,4) // Yellow - ITEM_AUX(Tile::cloth_Id,5) // Lime - ITEM_AUX(Tile::cloth_Id,3) // Light Blue - ITEM_AUX(Tile::cloth_Id,9) // Cyan - ITEM_AUX(Tile::cloth_Id,11) // Blue - ITEM_AUX(Tile::cloth_Id,10) // Purple - ITEM_AUX(Tile::cloth_Id,2) // Magenta - ITEM_AUX(Tile::cloth_Id,6) // Pink - ITEM_AUX(Tile::cloth_Id,0) // White - ITEM_AUX(Tile::cloth_Id,8) // Light Gray - ITEM_AUX(Tile::cloth_Id,7) // Gray - ITEM_AUX(Tile::cloth_Id,15) // Black - ITEM_AUX(Tile::cloth_Id,13) // Green - ITEM_AUX(Tile::cloth_Id,12) // Brown + ITEM(Tile::hayBlock_Id) + ITEM_AUX(Tile::wool_Id,14) // Red + ITEM_AUX(Tile::wool_Id,1) // Orange + ITEM_AUX(Tile::wool_Id,4) // Yellow + ITEM_AUX(Tile::wool_Id,5) // Lime + ITEM_AUX(Tile::wool_Id,3) // Light Blue + ITEM_AUX(Tile::wool_Id,9) // Cyan + ITEM_AUX(Tile::wool_Id,11) // Blue + ITEM_AUX(Tile::wool_Id,10) // Purple + ITEM_AUX(Tile::wool_Id,2) // Magenta + ITEM_AUX(Tile::wool_Id,6) // Pink + ITEM_AUX(Tile::wool_Id,0) // White + ITEM_AUX(Tile::wool_Id,8) // Light Gray + ITEM_AUX(Tile::wool_Id,7) // Gray + ITEM_AUX(Tile::wool_Id,15) // Black + ITEM_AUX(Tile::wool_Id,13) // Green + ITEM_AUX(Tile::wool_Id,12) // Brown ITEM_AUX(Tile::woolCarpet_Id,14) // Red ITEM_AUX(Tile::woolCarpet_Id,1) // Orange @@ -183,11 +210,102 @@ void IUIScene_CreativeMenu::staticCtor() ITEM_AUX(Tile::woolCarpet_Id,13) // Green ITEM_AUX(Tile::woolCarpet_Id,12) // Brown +#if 0 + ITEM_AUX(Tile::stained_glass_Id,14) // Red + ITEM_AUX(Tile::stained_glass_Id,1) // Orange + ITEM_AUX(Tile::stained_glass_Id,4) // Yellow + ITEM_AUX(Tile::stained_glass_Id,5) // Lime + ITEM_AUX(Tile::stained_glass_Id,3) // Light Blue + ITEM_AUX(Tile::stained_glass_Id,9) // Cyan + ITEM_AUX(Tile::stained_glass_Id,11) // Blue + ITEM_AUX(Tile::stained_glass_Id,10) // Purple + ITEM_AUX(Tile::stained_glass_Id,2) // Magenta + ITEM_AUX(Tile::stained_glass_Id,6) // Pink + ITEM_AUX(Tile::stained_glass_Id,0) // White + ITEM_AUX(Tile::stained_glass_Id,8) // Light Gray + ITEM_AUX(Tile::stained_glass_Id,7) // Gray + ITEM_AUX(Tile::stained_glass_Id,15) // Black + ITEM_AUX(Tile::stained_glass_Id,13) // Green + ITEM_AUX(Tile::stained_glass_Id,12) // Brown + + ITEM_AUX(Tile::stained_glass_pane_Id,14) // Red + ITEM_AUX(Tile::stained_glass_pane_Id,1) // Orange + ITEM_AUX(Tile::stained_glass_pane_Id,4) // Yellow + ITEM_AUX(Tile::stained_glass_pane_Id,5) // Lime + ITEM_AUX(Tile::stained_glass_pane_Id,3) // Light Blue + ITEM_AUX(Tile::stained_glass_pane_Id,9) // Cyan + ITEM_AUX(Tile::stained_glass_pane_Id,11) // Blue + ITEM_AUX(Tile::stained_glass_pane_Id,10) // Purple + ITEM_AUX(Tile::stained_glass_pane_Id,2) // Magenta + ITEM_AUX(Tile::stained_glass_pane_Id,6) // Pink + ITEM_AUX(Tile::stained_glass_pane_Id,0) // White + ITEM_AUX(Tile::stained_glass_pane_Id,8) // Light Gray + ITEM_AUX(Tile::stained_glass_pane_Id,7) // Gray + ITEM_AUX(Tile::stained_glass_pane_Id,15) // Black + ITEM_AUX(Tile::stained_glass_pane_Id,13) // Green + ITEM_AUX(Tile::stained_glass_pane_Id,12) // Brown +#endif + +#ifndef _CONTENT_PACKAGE + DEF(eCreativeInventory_ArtToolsDecorations) + if(app.DebugSettingsOn()) + { + for(unsigned int i = 0; i < Painting::LAST_VALUE; ++i) + { + ITEM_AUX(Item::painting_Id, i + 1) + } + + BuildFirework(list, FireworksItem::TYPE_BIG, DyePowderItem::PURPLE, 1, false, false); + + BuildFirework(list, FireworksItem::TYPE_SMALL, DyePowderItem::RED, 1, false, false); + BuildFirework(list, FireworksItem::TYPE_SMALL, DyePowderItem::RED, 2, false, false); + BuildFirework(list, FireworksItem::TYPE_SMALL, DyePowderItem::RED, 3, false, false); + + BuildFirework(list, FireworksItem::TYPE_BURST, DyePowderItem::GREEN, 1, false, true); + BuildFirework(list, FireworksItem::TYPE_CREEPER, DyePowderItem::BLUE, 1, true, false); + BuildFirework(list, FireworksItem::TYPE_STAR, DyePowderItem::YELLOW, 1, false, false); + BuildFirework(list, FireworksItem::TYPE_BIG, DyePowderItem::WHITE, 1, true, true); + + ITEM_AUX(Tile::stained_glass_Id,14) // Red + ITEM_AUX(Tile::stained_glass_Id,1) // Orange + ITEM_AUX(Tile::stained_glass_Id,4) // Yellow + ITEM_AUX(Tile::stained_glass_Id,5) // Lime + ITEM_AUX(Tile::stained_glass_Id,3) // Light Blue + ITEM_AUX(Tile::stained_glass_Id,9) // Cyan + ITEM_AUX(Tile::stained_glass_Id,11) // Blue + ITEM_AUX(Tile::stained_glass_Id,10) // Purple + ITEM_AUX(Tile::stained_glass_Id,2) // Magenta + ITEM_AUX(Tile::stained_glass_Id,6) // Pink + ITEM_AUX(Tile::stained_glass_Id,0) // White + ITEM_AUX(Tile::stained_glass_Id,8) // Light Gray + ITEM_AUX(Tile::stained_glass_Id,7) // Gray + ITEM_AUX(Tile::stained_glass_Id,15) // Black + ITEM_AUX(Tile::stained_glass_Id,13) // Green + ITEM_AUX(Tile::stained_glass_Id,12) // Brown + + ITEM_AUX(Tile::stained_glass_pane_Id,14) // Red + ITEM_AUX(Tile::stained_glass_pane_Id,1) // Orange + ITEM_AUX(Tile::stained_glass_pane_Id,4) // Yellow + ITEM_AUX(Tile::stained_glass_pane_Id,5) // Lime + ITEM_AUX(Tile::stained_glass_pane_Id,3) // Light Blue + ITEM_AUX(Tile::stained_glass_pane_Id,9) // Cyan + ITEM_AUX(Tile::stained_glass_pane_Id,11) // Blue + ITEM_AUX(Tile::stained_glass_pane_Id,10) // Purple + ITEM_AUX(Tile::stained_glass_pane_Id,2) // Magenta + ITEM_AUX(Tile::stained_glass_pane_Id,6) // Pink + ITEM_AUX(Tile::stained_glass_pane_Id,0) // White + ITEM_AUX(Tile::stained_glass_pane_Id,8) // Light Gray + ITEM_AUX(Tile::stained_glass_pane_Id,7) // Gray + ITEM_AUX(Tile::stained_glass_pane_Id,15) // Black + ITEM_AUX(Tile::stained_glass_pane_Id,13) // Green + ITEM_AUX(Tile::stained_glass_pane_Id,12) // Brown + } +#endif // Redstone DEF(eCreativeInventory_Redstone) ITEM(Tile::dispenser_Id) - ITEM(Tile::musicBlock_Id) + ITEM(Tile::noteblock_Id) ITEM(Tile::pistonBase_Id) ITEM(Tile::pistonStickyBase_Id) ITEM(Tile::tnt_Id) @@ -197,20 +315,31 @@ void IUIScene_CreativeMenu::staticCtor() ITEM(Tile::pressurePlate_stone_Id) ITEM(Tile::pressurePlate_wood_Id) ITEM(Item::redStone_Id) - ITEM(Tile::notGate_on_Id) - ITEM(Item::diode_Id) + ITEM(Tile::redstoneBlock_Id) + ITEM(Tile::redstoneTorch_on_Id) + ITEM(Item::repeater_Id) ITEM(Tile::redstoneLight_Id) ITEM(Tile::tripWireSource_Id) + ITEM(Tile::daylightDetector_Id) + ITEM(Tile::dropper_Id) + ITEM(Tile::hopper_Id) + ITEM(Item::comparator_Id) + ITEM(Tile::chest_trap_Id) + ITEM(Tile::weightedPlate_heavy_Id) + ITEM(Tile::weightedPlate_light_Id) // Transport DEF(eCreativeInventory_Transport) ITEM(Tile::rail_Id) ITEM(Tile::goldenRail_Id) ITEM(Tile::detectorRail_Id) + ITEM(Tile::activatorRail_Id) ITEM(Tile::ladder_Id) ITEM(Item::minecart_Id) ITEM(Item::minecart_chest_Id) ITEM(Item::minecart_furnace_Id) + ITEM(Item::minecart_hopper_Id) + ITEM(Item::minecart_tnt_Id) ITEM(Item::saddle_Id) ITEM(Item::boat_Id) @@ -222,25 +351,49 @@ void IUIScene_CreativeMenu::staticCtor() ITEM(Tile::furnace_Id) ITEM(Item::brewingStand_Id) ITEM(Tile::enchantTable_Id) + ITEM(Tile::beacon_Id) ITEM(Tile::endPortalFrameTile_Id) - ITEM(Tile::recordPlayer_Id) + ITEM(Tile::jukebox_Id) ITEM(Tile::anvil_Id); - ITEM(Tile::fence_Id) - ITEM(Tile::netherFence_Id) - ITEM(Tile::ironFence_Id) - ITEM_AUX(Tile::cobbleWall_Id, WallTile::TYPE_NORMAL) - ITEM_AUX(Tile::cobbleWall_Id, WallTile::TYPE_MOSSY) ITEM(Item::bed_Id) ITEM(Item::bucket_empty_Id) ITEM(Item::bucket_lava_Id) ITEM(Item::bucket_water_Id) - ITEM(Item::milk_Id) + ITEM(Item::bucket_milk_Id) ITEM(Item::cauldron_Id) ITEM(Item::snowBall_Id) ITEM(Item::paper_Id) ITEM(Item::book_Id) ITEM(Item::enderPearl_Id) ITEM(Item::eyeOfEnder_Id) + ITEM(Item::nameTag_Id) + ITEM(Item::netherStar_Id) + ITEM_AUX(Item::spawnEgg_Id, 50); // Creeper + ITEM_AUX(Item::spawnEgg_Id, 51); // Skeleton + ITEM_AUX(Item::spawnEgg_Id, 52); // Spider + ITEM_AUX(Item::spawnEgg_Id, 54); // Zombie + ITEM_AUX(Item::spawnEgg_Id, 55); // Slime + ITEM_AUX(Item::spawnEgg_Id, 56); // Ghast + ITEM_AUX(Item::spawnEgg_Id, 57); // Zombie Pigman + ITEM_AUX(Item::spawnEgg_Id, 58); // Enderman + ITEM_AUX(Item::spawnEgg_Id, 59); // Cave Spider + ITEM_AUX(Item::spawnEgg_Id, 60); // Silverfish + ITEM_AUX(Item::spawnEgg_Id, 61); // Blaze + ITEM_AUX(Item::spawnEgg_Id, 62); // Magma Cube + ITEM_AUX(Item::spawnEgg_Id, 65); // Bat + ITEM_AUX(Item::spawnEgg_Id, 66); // Witch + ITEM_AUX(Item::spawnEgg_Id, 90); // Pig + ITEM_AUX(Item::spawnEgg_Id, 91); // Sheep + ITEM_AUX(Item::spawnEgg_Id, 92); // Cow + ITEM_AUX(Item::spawnEgg_Id, 93); // Chicken + ITEM_AUX(Item::spawnEgg_Id, 94); // Squid + ITEM_AUX(Item::spawnEgg_Id, 95); // Wolf + ITEM_AUX(Item::spawnEgg_Id, 96); // Mooshroom + ITEM_AUX(Item::spawnEgg_Id, 98); // Ozelot + ITEM_AUX(Item::spawnEgg_Id, 100); // Horse + ITEM_AUX(Item::spawnEgg_Id, 100 | ((EntityHorse::TYPE_DONKEY + 1) << 12) ); // Donkey + ITEM_AUX(Item::spawnEgg_Id, 100 | ((EntityHorse::TYPE_MULE + 1) << 12)); // Mule + ITEM_AUX(Item::spawnEgg_Id, 120); // Villager ITEM(Item::record_01_Id) ITEM(Item::record_02_Id) ITEM(Item::record_03_Id) @@ -253,27 +406,26 @@ void IUIScene_CreativeMenu::staticCtor() ITEM(Item::record_10_Id) ITEM(Item::record_11_Id) ITEM(Item::record_12_Id) - ITEM_AUX(Item::monsterPlacer_Id, 50); // Creeper - ITEM_AUX(Item::monsterPlacer_Id, 51); // Skeleton - ITEM_AUX(Item::monsterPlacer_Id, 52); // Spider - ITEM_AUX(Item::monsterPlacer_Id, 54); // Zombie - ITEM_AUX(Item::monsterPlacer_Id, 55); // Slime - ITEM_AUX(Item::monsterPlacer_Id, 56); // Ghast - ITEM_AUX(Item::monsterPlacer_Id, 57); // Zombie Pigman - ITEM_AUX(Item::monsterPlacer_Id, 58); // Enderman - ITEM_AUX(Item::monsterPlacer_Id, 59); // Cave Spider - ITEM_AUX(Item::monsterPlacer_Id, 60); // Silverfish - ITEM_AUX(Item::monsterPlacer_Id, 61); // Blaze - ITEM_AUX(Item::monsterPlacer_Id, 62); // Magma Cube - ITEM_AUX(Item::monsterPlacer_Id, 90); // Pig - ITEM_AUX(Item::monsterPlacer_Id, 91); // Sheep - ITEM_AUX(Item::monsterPlacer_Id, 92); // Cow - ITEM_AUX(Item::monsterPlacer_Id, 93); // Chicken - ITEM_AUX(Item::monsterPlacer_Id, 94); // Squid - ITEM_AUX(Item::monsterPlacer_Id, 95); // Wolf - ITEM_AUX(Item::monsterPlacer_Id, 96); // Mooshroom - ITEM_AUX(Item::monsterPlacer_Id, 98); // Ozelot - ITEM_AUX(Item::monsterPlacer_Id, 120); // Villager + + BuildFirework(list, FireworksItem::TYPE_SMALL, DyePowderItem::LIGHT_BLUE, 1, true, false); + BuildFirework(list, FireworksItem::TYPE_CREEPER, DyePowderItem::GREEN, 2, false, false); + BuildFirework(list, FireworksItem::TYPE_MAX, DyePowderItem::RED, 2, false, false, DyePowderItem::ORANGE); + BuildFirework(list, FireworksItem::TYPE_BURST, DyePowderItem::MAGENTA, 3, true, false, DyePowderItem::BLUE); + BuildFirework(list, FireworksItem::TYPE_STAR, DyePowderItem::YELLOW, 2, false, true, DyePowderItem::ORANGE); + +#ifndef _CONTENT_PACKAGE + DEF(eCreativeInventory_ArtToolsMisc) + if(app.DebugSettingsOn()) + { + ITEM_AUX(Item::spawnEgg_Id, 100 | ((EntityHorse::TYPE_SKELETON + 1) << 12)); // Skeleton + ITEM_AUX(Item::spawnEgg_Id, 100 | ((EntityHorse::TYPE_UNDEAD + 1) << 12)); // Zombie + ITEM_AUX(Item::spawnEgg_Id, 98 | ((Ocelot::TYPE_BLACK + 1) << 12)); + ITEM_AUX(Item::spawnEgg_Id, 98 | ((Ocelot::TYPE_RED + 1) << 12)); + ITEM_AUX(Item::spawnEgg_Id, 98 | ((Ocelot::TYPE_SIAMESE + 1) << 12)); + ITEM_AUX(Item::spawnEgg_Id, 52 | (2 << 12)); // Spider-Jockey + ITEM_AUX(Item::spawnEgg_Id, 63); // Enderdragon + } +#endif // Food DEF(eCreativeInventory_Food) @@ -305,17 +457,17 @@ void IUIScene_CreativeMenu::staticCtor() // Tools, Armour and Weapons (Complete) DEF(eCreativeInventory_ToolsArmourWeapons) ITEM(Item::compass_Id) - ITEM(Item::helmet_cloth_Id) - ITEM(Item::chestplate_cloth_Id) - ITEM(Item::leggings_cloth_Id) - ITEM(Item::boots_cloth_Id) + ITEM(Item::helmet_leather_Id) + ITEM(Item::chestplate_leather_Id) + ITEM(Item::leggings_leather_Id) + ITEM(Item::boots_leather_Id) ITEM(Item::sword_wood_Id) ITEM(Item::shovel_wood_Id) ITEM(Item::pickAxe_wood_Id) ITEM(Item::hatchet_wood_Id) ITEM(Item::hoe_wood_Id) - ITEM(Item::map_Id) + ITEM(Item::emptyMap_Id) ITEM(Item::helmet_chain_Id) ITEM(Item::chestplate_chain_Id) ITEM(Item::leggings_chain_Id) @@ -364,6 +516,10 @@ void IUIScene_CreativeMenu::staticCtor() ITEM(Item::shears_Id) ITEM(Item::fishingRod_Id) ITEM(Item::carrotOnAStick_Id) + ITEM(Item::lead_Id) + ITEM(Item::horseArmorDiamond_Id) + ITEM(Item::horseArmorGold_Id) + ITEM(Item::horseArmorMetal_Id) for(unsigned int i = 0; i < Enchantment::enchantments.length; ++i) { @@ -372,6 +528,16 @@ void IUIScene_CreativeMenu::staticCtor() list->push_back(Item::enchantedBook->createForEnchantment(new EnchantmentInstance(enchantment, enchantment->getMaxLevel()))); } +#ifndef _CONTENT_PACKAGE + if(app.DebugSettingsOn()) + { + shared_ptr debugSword = shared_ptr(new ItemInstance(Item::sword_diamond_Id, 1, 0)); + debugSword->enchant( Enchantment::damageBonus, 50 ); + debugSword->setHoverName(L"Sword of Debug"); + list->push_back(debugSword); + } +#endif + // Materials DEF(eCreativeInventory_Materials) ITEM(Item::coal_Id) @@ -390,7 +556,7 @@ void IUIScene_CreativeMenu::staticCtor() ITEM(Item::feather_Id) ITEM(Item::flint_Id) ITEM(Item::leather_Id) - ITEM(Item::sulphur_Id) + ITEM(Item::gunpowder_Id) ITEM(Item::clay_Id) ITEM(Item::yellowDust_Id) ITEM(Item::seeds_wheat_Id) @@ -403,7 +569,7 @@ void IUIScene_CreativeMenu::staticCtor() ITEM(Item::slimeBall_Id) ITEM(Item::blazeRod_Id) ITEM(Item::goldNugget_Id) - ITEM(Item::netherStalkSeeds_Id) + ITEM(Item::netherwart_seeds_Id) ITEM_AUX(Item::dye_powder_Id,1) // Red ITEM_AUX(Item::dye_powder_Id,14) // Orange ITEM_AUX(Item::dye_powder_Id,11) // Yellow @@ -538,22 +704,28 @@ void IUIScene_CreativeMenu::staticCtor() // Top Row ECreative_Inventory_Groups blocksGroup[] = {eCreativeInventory_BuildingBlocks}; - specs[eCreativeInventoryTab_BuildingBlocks] = new TabSpec(L"Structures", IDS_GROUPNAME_BUILDING_BLOCKS, 1, blocksGroup, 0, NULL); - + specs[eCreativeInventoryTab_BuildingBlocks] = new TabSpec(L"Structures", IDS_GROUPNAME_BUILDING_BLOCKS, 1, blocksGroup); + +#ifndef _CONTENT_PACKAGE ECreative_Inventory_Groups decorationsGroup[] = {eCreativeInventory_Decoration}; - 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) @@ -641,6 +853,7 @@ IUIScene_CreativeMenu::TabSpec::~TabSpec() { if(m_staticGroupsA != NULL) delete [] m_staticGroupsA; if(m_dynamicGroupsA != NULL) delete [] m_dynamicGroupsA; + if(m_debugGroupsA != NULL) delete [] m_debugGroupsA; } void IUIScene_CreativeMenu::TabSpec::populateMenu(AbstractContainerMenu *menu, int dynamicIndex, unsigned int page) @@ -659,12 +872,12 @@ void IUIScene_CreativeMenu::TabSpec::populateMenu(AbstractContainerMenu *menu, i // Fill from the static groups unsigned int startIndex = page * m_staticPerPage; - int remainingItems = m_staticItems - startIndex; // Work out the first group with an item the want to display, and which item in that group unsigned int currentIndex = 0; unsigned int currentGroup = 0; unsigned int currentItem = 0; + bool displayStatic = false; for(; currentGroup < m_staticGroupsCount; ++currentGroup) { int size = categoryGroups[m_staticGroupsA[currentGroup]].size(); @@ -673,27 +886,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 +969,16 @@ void IUIScene_CreativeMenu::TabSpec::populateMenu(AbstractContainerMenu *menu, i unsigned int IUIScene_CreativeMenu::TabSpec::getPageCount() { - return m_pages; +#ifndef _CONTENT_PACKAGE + if(app.DebugArtToolsOn()) + { + return (int)ceil((float)(m_staticItems + m_debugItems) / m_staticPerPage); + } + else +#endif + { + return m_pages; + } } @@ -763,7 +1038,6 @@ IUIScene_AbstractContainerMenu::ESceneSection IUIScene_CreativeMenu::GetSectionA newSection = eSectionInventoryCreativeSelector; } break; -#ifndef _XBOX case eSectionInventoryCreativeTab_0: case eSectionInventoryCreativeTab_1: case eSectionInventoryCreativeTab_2: @@ -775,7 +1049,6 @@ IUIScene_AbstractContainerMenu::ESceneSection IUIScene_CreativeMenu::GetSectionA case eSectionInventoryCreativeSlider: /* do nothing */ break; -#endif default: assert( false ); break; @@ -800,7 +1073,7 @@ bool IUIScene_CreativeMenu::handleValidKeyPress(int iPad, int buttonNum, BOOL qu { m_menu->getSlot(i)->set(nullptr); // call this function to synchronize multiplayer item bar - pMinecraft->localgameModes[iPad]->handleCreativeModeItemAdd(nullptr, i - (int)m_menu->slots->size() + 9 + InventoryMenu::USE_ROW_SLOT_START); + pMinecraft->localgameModes[iPad]->handleCreativeModeItemAdd(nullptr, i - (int)m_menu->slots.size() + 9 + InventoryMenu::USE_ROW_SLOT_START); } } return true; @@ -930,7 +1203,7 @@ void IUIScene_CreativeMenu::handleSlotListClicked(ESceneSection eSection, int bu m_menu->clicked(currentIndex, buttonNum, quickKeyHeld?AbstractContainerMenu::CLICK_QUICK_MOVE:AbstractContainerMenu::CLICK_PICKUP, pMinecraft->localplayers[getPad()]); shared_ptr newItem = m_menu->getSlot(currentIndex)->getItem(); // call this function to synchronize multiplayer item bar - pMinecraft->localgameModes[getPad()]->handleCreativeModeItemAdd(newItem, currentIndex - (int)m_menu->slots->size() + 9 + InventoryMenu::USE_ROW_SLOT_START); + pMinecraft->localgameModes[getPad()]->handleCreativeModeItemAdd(newItem, currentIndex - (int)m_menu->slots.size() + 9 + InventoryMenu::USE_ROW_SLOT_START); if(m_bCarryingCreativeItem) { @@ -978,7 +1251,7 @@ bool IUIScene_CreativeMenu::getEmptyInventorySlot(shared_ptr item, for(unsigned int i = TabSpec::MAX_SIZE; i < TabSpec::MAX_SIZE + 9; ++i) { shared_ptr slotItem = m_menu->getSlot(i)->getItem(); - if( slotItem != NULL && slotItem->sameItem(item) && (slotItem->GetCount() + item->GetCount() <= item->getMaxStackSize() )) + if( slotItem != NULL && slotItem->sameItemWithTags(item) && (slotItem->GetCount() + item->GetCount() <= item->getMaxStackSize() )) { sameItemFound = true; slotX = i - TabSpec::MAX_SIZE; @@ -1021,7 +1294,7 @@ int IUIScene_CreativeMenu::getSectionStartOffset(ESceneSection eSection) } bool IUIScene_CreativeMenu::overrideTooltips(ESceneSection sectionUnderPointer, shared_ptr itemUnderPointer, bool bIsItemCarried, bool bSlotHasItem, bool bCarriedIsSameAsSlot, int iSlotStackSizeRemaining, - EToolTipItem &buttonA, EToolTipItem &buttonX, EToolTipItem &buttonY, EToolTipItem &buttonRT) + EToolTipItem &buttonA, EToolTipItem &buttonX, EToolTipItem &buttonY, EToolTipItem &buttonRT, EToolTipItem &buttonBack) { bool _override = false; @@ -1030,7 +1303,6 @@ bool IUIScene_CreativeMenu::overrideTooltips(ESceneSection sectionUnderPointer, if(bSlotHasItem) { buttonA = eToolTipPickUpGeneric; - buttonRT = eToolTipWhatIsThis; if(itemUnderPointer->isStackable()) { @@ -1051,3 +1323,74 @@ bool IUIScene_CreativeMenu::overrideTooltips(ESceneSection sectionUnderPointer, return _override; } + +void IUIScene_CreativeMenu::BuildFirework(vector > *list, byte type, int color, int sulphur, bool flicker, bool trail, int fadeColor/*= -1*/) +{ + ///////////////////////////////// + // Create firecharge + ///////////////////////////////// + + + CompoundTag *expTag = new CompoundTag(FireworksItem::TAG_EXPLOSION); + + vector colors; + + colors.push_back(DyePowderItem::COLOR_RGB[color]); + + // glowstone dust gives flickering + if (flicker) expTag->putBoolean(FireworksItem::TAG_E_FLICKER, true); + + // diamonds give trails + if (trail) expTag->putBoolean(FireworksItem::TAG_E_TRAIL, true); + + intArray colorArray(colors.size()); + for (int i = 0; i < colorArray.length; i++) + { + colorArray[i] = colors.at(i); + } + expTag->putIntArray(FireworksItem::TAG_E_COLORS, colorArray); + // delete colorArray.data; + + expTag->putByte(FireworksItem::TAG_E_TYPE, type); + + if (fadeColor != -1) + { + //////////////////////////////////// + // Apply fade colors to firecharge + //////////////////////////////////// + + vector colors; + colors.push_back(DyePowderItem::COLOR_RGB[fadeColor]); + + intArray colorArray(colors.size()); + for (int i = 0; i < colorArray.length; i++) + { + colorArray[i] = colors.at(i); + } + expTag->putIntArray(FireworksItem::TAG_E_FADECOLORS, colorArray); + } + + ///////////////////////////////// + // Create fireworks + ///////////////////////////////// + + shared_ptr firework; + + { + firework = shared_ptr( new ItemInstance(Item::fireworks) ); + CompoundTag *itemTag = new CompoundTag(); + CompoundTag *fireTag = new CompoundTag(FireworksItem::TAG_FIREWORKS); + ListTag *expTags = new ListTag(FireworksItem::TAG_EXPLOSIONS); + + expTags->add(expTag); + + fireTag->put(FireworksItem::TAG_EXPLOSIONS, expTags); + fireTag->putByte(FireworksItem::TAG_FLIGHT, (byte) sulphur); + + itemTag->put(FireworksItem::TAG_FIREWORKS, fireTag); + + firework->setTag(itemTag); + } + + list->push_back(firework); +} diff --git a/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.h b/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.h index 7ab3ff7e..64b78029 100644 --- a/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.h +++ b/Minecraft.Client/Common/UI/IUIScene_CreativeMenu.h @@ -38,6 +38,8 @@ public: eCreativeInventory_Potions_Extended, eCreativeInventory_Potions_Level2_Extended, eCreativeInventory_Misc, + eCreativeInventory_ArtToolsDecorations, + eCreativeInventory_ArtToolsMisc, eCreativeInventoryGroupsCount }; @@ -57,14 +59,17 @@ public: ECreative_Inventory_Groups *m_staticGroupsA; const int m_dynamicGroupsCount; ECreative_Inventory_Groups *m_dynamicGroupsA; + const int m_debugGroupsCount; + ECreative_Inventory_Groups *m_debugGroupsA; private: unsigned int m_pages; unsigned int m_staticPerPage; unsigned int m_staticItems; + unsigned int m_debugItems; public: - TabSpec( LPCWSTR icon, int descriptionId, int staticGroupsCount, ECreative_Inventory_Groups *staticGroups, int dynamicGroupsCount, ECreative_Inventory_Groups *dynamicGroups ); + TabSpec( LPCWSTR icon, int descriptionId, int staticGroupsCount, ECreative_Inventory_Groups *staticGroups, int dynamicGroupsCount = 0, ECreative_Inventory_Groups *dynamicGroups = NULL, int debugGroupsCount = 0, ECreative_Inventory_Groups *debugGroups = NULL ); ~TabSpec(); void populateMenu(AbstractContainerMenu *menu, int dynamicIndex, unsigned int page); @@ -104,7 +109,8 @@ protected: int m_tabDynamicPos[eCreativeInventoryTab_COUNT]; int m_tabPage[eCreativeInventoryTab_COUNT]; - void switchTab(ECreativeInventoryTabs tab); + void switchTab(ECreativeInventoryTabs tab); + void ScrollBar(UIVec2D pointerPos); virtual void updateTabHighlightAndText(ECreativeInventoryTabs tab) = 0; virtual void updateScrollCurrentPage(int currentPage, int pageCount) = 0; virtual ESceneSection GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ); @@ -117,6 +123,19 @@ protected: virtual bool IsSectionSlotList( ESceneSection eSection ); virtual bool CanHaveFocus( ESceneSection eSection ); - virtual bool overrideTooltips(ESceneSection sectionUnderPointer, shared_ptr itemUnderPointer, bool bIsItemCarried, bool bSlotHasItem, bool bCarriedIsSameAsSlot, int iSlotStackSizeRemaining, - EToolTipItem &buttonA, EToolTipItem &buttonX, EToolTipItem &buttonY, EToolTipItem &buttonRT); + virtual bool overrideTooltips( + ESceneSection sectionUnderPointer, + shared_ptr itemUnderPointer, + bool bIsItemCarried, + bool bSlotHasItem, + bool bCarriedIsSameAsSlot, + int iSlotStackSizeRemaining, + EToolTipItem &buttonA, + EToolTipItem &buttonX, + EToolTipItem &buttonY, + EToolTipItem &buttonRT, + EToolTipItem &buttonBack + ); + + static void BuildFirework(vector > *list, byte type, int color, int sulphur, bool flicker, bool trail, int fadeColor = -1); }; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_FireworksMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_FireworksMenu.cpp new file mode 100644 index 00000000..7f90fe8f --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_FireworksMenu.cpp @@ -0,0 +1,129 @@ +#include "stdafx.h" + +#include "IUIScene_FireworksMenu.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" + +IUIScene_AbstractContainerMenu::ESceneSection IUIScene_FireworksMenu::GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ) +{ + ESceneSection newSection = eSection; + int xOffset = 0; + int yOffset = 0; + + // Find the new section if there is one + switch( eSection ) + { + case eSectionFireworksIngredients: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionFireworksInventory; + xOffset = -1; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionFireworksUsing; + xOffset = -1; + } + else if(eTapDirection == eTapStateLeft) + { + newSection = eSectionFireworksResult; + } + else if(eTapDirection == eTapStateRight) + { + newSection = eSectionFireworksResult; + } + break; + case eSectionFireworksResult: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionFireworksInventory; + xOffset = -7; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionFireworksUsing; + xOffset = -7; + } + else if(eTapDirection == eTapStateLeft) + { + newSection = eSectionFireworksIngredients; + yOffset = -1; + *piTargetX = getSectionColumns(eSectionFireworksIngredients); + } + else if(eTapDirection == eTapStateRight) + { + newSection = eSectionFireworksIngredients; + yOffset = -1; + *piTargetX = 0; + } + break; + case eSectionFireworksInventory: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionFireworksUsing; + } + else if(eTapDirection == eTapStateUp) + { + if(*piTargetX < 6) + { + newSection = eSectionFireworksIngredients; + xOffset = 1; + } + else + { + newSection = eSectionFireworksResult; + } + } + break; + case eSectionFireworksUsing: + if(eTapDirection == eTapStateDown) + { + if(*piTargetX < 6) + { + newSection = eSectionFireworksIngredients; + xOffset = 1; + } + else + { + newSection = eSectionFireworksResult; + } + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionFireworksInventory; + } + break; + default: + assert( false ); + break; + } + + updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, xOffset, yOffset); + + return newSection; +} + +int IUIScene_FireworksMenu::getSectionStartOffset(ESceneSection eSection) +{ + int offset = 0; + switch( eSection ) + { + + case eSectionFireworksIngredients: + offset = FireworksMenu::CRAFT_SLOT_START; + break; + + case eSectionFireworksResult: + offset = FireworksMenu::RESULT_SLOT; + break; + case eSectionFireworksInventory: + offset = FireworksMenu::INV_SLOT_START; + break; + case eSectionFireworksUsing: + offset = FireworksMenu::INV_SLOT_START + 27; + break; + default: + assert( false ); + break; + } + return offset; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_FireworksMenu.h b/Minecraft.Client/Common/UI/IUIScene_FireworksMenu.h new file mode 100644 index 00000000..4764d72c --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_FireworksMenu.h @@ -0,0 +1,9 @@ +#pragma once +#include "IUIScene_AbstractContainerMenu.h" + +class IUIScene_FireworksMenu : public virtual IUIScene_AbstractContainerMenu +{ +protected: + virtual ESceneSection GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ); + int getSectionStartOffset(ESceneSection eSection); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_HUD.cpp b/Minecraft.Client/Common/UI/IUIScene_HUD.cpp new file mode 100644 index 00000000..03adbd2c --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_HUD.cpp @@ -0,0 +1,264 @@ +#include "stdafx.h" +#include "..\..\Minecraft.h" +#include "..\..\MultiPlayerLocalPlayer.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.effect.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.ai.attributes.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.monster.h" +#include "IUIScene_HUD.h" + +IUIScene_HUD::IUIScene_HUD() +{ + m_lastActiveSlot = -1; + m_iGuiScale = -1; + m_bToolTipsVisible = true; + m_lastExpProgress = 0.0f; + m_lastExpLevel = 0; + m_iCurrentHealth = 0; + m_lastMaxHealth = 20; + m_lastHealthBlink = false; + m_lastHealthPoison = false; + m_iCurrentFood = -1; + m_lastFoodPoison = false; + m_lastAir = 10; + m_currentExtraAir = 0; + m_lastArmour = 0; + m_showHealth = true; + m_showHorseHealth = true; + m_showFood = true; + m_showAir = true; + m_showArmour = true; + m_showExpBar = true; + m_bRegenEffectEnabled = false; + m_iFoodSaturation = 0; + m_lastDragonHealth = 0.0f; + m_showDragonHealth = false; + m_ticksWithNoBoss = 0; + m_uiSelectedItemOpacityCountDown = 0; + m_displayName = L""; + m_lastShowDisplayName = true; + m_bRidingHorse = true; + m_horseHealth = 1; + m_lastHealthWither = true; + m_iCurrentHealthAbsorb = -1; + m_horseJumpProgress = 1.0f; + m_iHeartOffsetIndex = -1; + m_bHealthAbsorbActive = false; + m_iHorseMaxHealth = -1; + m_bIsJumpable = false; +} + +void IUIScene_HUD::updateFrameTick() +{ + int iPad = getPad(); + Minecraft *pMinecraft = Minecraft::GetInstance(); + + int iGuiScale; + + if(pMinecraft->localplayers[iPad]->m_iScreenSection == C4JRender::VIEWPORT_TYPE_FULLSCREEN) + { + iGuiScale=app.GetGameSettings(iPad,eGameSetting_UISize); + } + else + { + iGuiScale=app.GetGameSettings(iPad,eGameSetting_UISizeSplitscreen); + } + SetHudSize(iGuiScale); + + SetDisplayName(ProfileManager.GetDisplayName(iPad)); + + SetTooltipsEnabled(((ui.GetMenuDisplayed(ProfileManager.GetPrimaryPad())) || (app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_Tooltips) != 0))); + + SetActiveSlot(pMinecraft->localplayers[iPad]->inventory->selected); + + if (pMinecraft->localgameModes[iPad]->canHurtPlayer()) + { + renderPlayerHealth(); + } + else + { + //SetRidingHorse(false, 0); + shared_ptr riding = pMinecraft->localplayers[iPad]->riding; + if(riding == NULL) + { + SetRidingHorse(false, false, 0); + } + else + { + SetRidingHorse(true, pMinecraft->localplayers[iPad]->isRidingJumpable(), 0); + } + ShowHorseHealth(false); + m_horseHealth = 0; + ShowHealth(false); + ShowFood(false); + ShowAir(false); + ShowArmour(false); + ShowExpBar(false); + SetHealthAbsorb(0); + } + + if(pMinecraft->localplayers[iPad]->isRidingJumpable()) + { + SetHorseJumpBarProgress(pMinecraft->localplayers[iPad]->getJumpRidingScale()); + } + else if (pMinecraft->localgameModes[iPad]->hasExperience()) + { + // Update xp progress + ShowExpBar(true); + + SetExpBarProgress(pMinecraft->localplayers[iPad]->experienceProgress, pMinecraft->localplayers[iPad]->getXpNeededForNextLevel()); + + // Update xp level + SetExpLevel(pMinecraft->localplayers[iPad]->experienceLevel); + } + else + { + ShowExpBar(false); + SetExpLevel(0); + } + + if(m_uiSelectedItemOpacityCountDown>0) + { + --m_uiSelectedItemOpacityCountDown; + + // 4J Stu - Timing here is kept the same as on Xbox360, even though we do it differently now and do the fade out in Flash rather than directly setting opacity + if(m_uiSelectedItemOpacityCountDown < (SharedConstants::TICKS_PER_SECOND * 1) ) + { + HideSelectedLabel(); + m_uiSelectedItemOpacityCountDown = 0; + } + } + + unsigned char ucAlpha=app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_InterfaceOpacity); + float fVal; + + if(ucAlpha<80) + { + // if we are in a menu, set the minimum opacity for tooltips to 15% + if(ui.GetMenuDisplayed(iPad) && (ucAlpha<15)) + { + ucAlpha=15; + } + + // check if we have the timer running for the opacity + unsigned int uiOpacityTimer=app.GetOpacityTimer(iPad); + if(uiOpacityTimer!=0) + { + if(uiOpacityTimer<10) + { + float fStep=(80.0f-(float)ucAlpha)/10.0f; + fVal=0.01f*(80.0f-((10.0f-(float)uiOpacityTimer)*fStep)); + } + else + { + fVal=0.01f*80.0f; + } + } + else + { + fVal=0.01f*(float)ucAlpha; + } + } + else + { + // if we are in a menu, set the minimum opacity for tooltips to 15% + if(ui.GetMenuDisplayed(iPad) && (ucAlpha<15)) + { + ucAlpha=15; + } + fVal=0.01f*(float)ucAlpha; + } + SetOpacity(fVal); + + bool bDisplayGui=app.GetGameStarted() && !ui.GetMenuDisplayed(iPad) && !(app.GetXuiAction(iPad)==eAppAction_AutosaveSaveGameCapturedThumbnail) && app.GetGameSettings(iPad,eGameSetting_DisplayHUD)!=0; + if(bDisplayGui && pMinecraft->localplayers[iPad] != NULL) + { + SetVisible(true); + } + else + { + SetVisible(false); + } +} + +void IUIScene_HUD::renderPlayerHealth() +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + int iPad = getPad(); + + ShowHealth(true); + + SetRegenerationEffect(pMinecraft->localplayers[iPad]->hasEffect(MobEffect::regeneration)); + + // Update health + bool blink = pMinecraft->localplayers[iPad]->invulnerableTime / 3 % 2 == 1; + if (pMinecraft->localplayers[iPad]->invulnerableTime < 10) blink = false; + int currentHealth = pMinecraft->localplayers[iPad]->getHealth(); + int oldHealth = pMinecraft->localplayers[iPad]->lastHealth; + bool bHasPoison = pMinecraft->localplayers[iPad]->hasEffect(MobEffect::poison); + bool bHasWither = pMinecraft->localplayers[iPad]->hasEffect(MobEffect::wither); + AttributeInstance *maxHealthAttribute = pMinecraft->localplayers[iPad]->getAttribute(SharedMonsterAttributes::MAX_HEALTH); + float maxHealth = (float)maxHealthAttribute->getValue(); + float totalAbsorption = pMinecraft->localplayers[iPad]->getAbsorptionAmount(); + + // Update armour + int armor = pMinecraft->localplayers[iPad]->getArmorValue(); + + SetHealth(currentHealth, oldHealth, blink, bHasPoison || bHasWither, bHasWither); + SetHealthAbsorb(totalAbsorption); + + if(armor > 0) + { + ShowArmour(true); + SetArmour(armor); + } + else + { + ShowArmour(false); + } + + shared_ptr riding = pMinecraft->localplayers[iPad]->riding; + + if(riding == NULL || riding && !riding->instanceof(eTYPE_LIVINGENTITY)) + { + SetRidingHorse(false, false, 0); + + ShowFood(true); + ShowHorseHealth(false); + m_horseHealth = 0; + + // Update food + //bool foodBlink = false; + FoodData *foodData = pMinecraft->localplayers[iPad]->getFoodData(); + int food = foodData->getFoodLevel(); + int oldFood = foodData->getLastFoodLevel(); + bool hasHungerEffect = pMinecraft->localplayers[iPad]->hasEffect(MobEffect::hunger); + int saturationLevel = pMinecraft->localplayers[iPad]->getFoodData()->getSaturationLevel(); + + SetFood(food, oldFood, hasHungerEffect); + SetFoodSaturationLevel(saturationLevel); + + // Update air + if (pMinecraft->localplayers[iPad]->isUnderLiquid(Material::water)) + { + ShowAir(true); + int count = (int) ceil((pMinecraft->localplayers[iPad]->getAirSupply() - 2) * 10.0f / Player::TOTAL_AIR_SUPPLY); + int extra = (int) ceil((pMinecraft->localplayers[iPad]->getAirSupply()) * 10.0f / Player::TOTAL_AIR_SUPPLY) - count; + SetAir(count, extra); + } + else + { + ShowAir(false); + } + } + else if(riding->instanceof(eTYPE_LIVINGENTITY) ) + { + shared_ptr living = dynamic_pointer_cast(riding); + int riderCurrentHealth = (int) ceil(living->getHealth()); + float maxRiderHealth = living->getMaxHealth(); + + SetRidingHorse(true, pMinecraft->localplayers[iPad]->isRidingJumpable(), maxRiderHealth); + SetHorseHealth(riderCurrentHealth); + ShowHorseHealth(true); + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_HUD.h b/Minecraft.Client/Common/UI/IUIScene_HUD.h new file mode 100644 index 00000000..0f643dd3 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_HUD.h @@ -0,0 +1,85 @@ +#pragma once + +class IUIScene_HUD +{ +protected: + int m_lastActiveSlot; + int m_iGuiScale; + bool m_bToolTipsVisible; + float m_lastExpProgress; + int m_lastExpLevel; + int m_iCurrentHealth; + int m_lastMaxHealth; + bool m_lastHealthBlink, m_lastHealthPoison, m_lastHealthWither; + int m_iCurrentFood; + bool m_lastFoodPoison; + int m_lastAir, m_currentExtraAir; + int m_lastArmour; + float m_lastDragonHealth; + bool m_showDragonHealth; + int m_ticksWithNoBoss; + bool m_lastShowDisplayName; + int m_horseHealth; + int m_iCurrentHealthAbsorb; + float m_horseJumpProgress; + int m_iHeartOffsetIndex; + bool m_bHealthAbsorbActive; + int m_iHorseMaxHealth; + + bool m_showHealth, m_showHorseHealth, m_showFood, m_showAir, m_showArmour, m_showExpBar, m_bRidingHorse, m_bIsJumpable; + bool m_bRegenEffectEnabled; + int m_iFoodSaturation; + + unsigned int m_uiSelectedItemOpacityCountDown; + + wstring m_displayName; + + IUIScene_HUD(); + + virtual int getPad() = 0; + virtual void SetOpacity(float opacity) = 0; + virtual void SetVisible(bool visible) = 0; + + virtual void SetHudSize(int scale) = 0; + virtual void SetExpBarProgress(float progress, int xpNeededForNextLevel) = 0; + virtual void SetExpLevel(int level) = 0; + virtual void SetActiveSlot(int slot) = 0; + + virtual void SetHealth(int iHealth, int iLastHealth, bool bBlink, bool bPoison, bool bWither) = 0; + virtual void SetFood(int iFood, int iLastFood, bool bPoison) = 0; + virtual void SetAir(int iAir, int extra) = 0; + virtual void SetArmour(int iArmour) = 0; + + virtual void ShowHealth(bool show) = 0; + virtual void ShowHorseHealth(bool show) = 0; + virtual void ShowFood(bool show) = 0; + virtual void ShowAir(bool show) = 0; + virtual void ShowArmour(bool show) = 0; + virtual void ShowExpBar(bool show) = 0; + + virtual void SetRegenerationEffect(bool bEnabled) = 0; + virtual void SetFoodSaturationLevel(int iSaturation) = 0; + + virtual void SetDragonHealth(float health) = 0; + virtual void SetDragonLabel(const wstring &label) = 0; + virtual void ShowDragonHealth(bool show) = 0; + + virtual void HideSelectedLabel() = 0; + + virtual void SetDisplayName(const wstring &displayName) = 0; + + virtual void SetTooltipsEnabled(bool bEnabled) = 0; + + virtual void SetRidingHorse(bool ridingHorse, bool bIsJumpable, int maxHorseHealth) = 0; + virtual void SetHorseHealth(int health, bool blink = false) = 0; + virtual void SetHorseJumpBarProgress(float progress) = 0; + + virtual void SetHealthAbsorb(int healthAbsorb) = 0; + + virtual void SetSelectedLabel(const wstring &label) = 0; + virtual void ShowDisplayName(bool show) = 0; + +public: + void updateFrameTick(); + void renderPlayerHealth(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_HopperMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_HopperMenu.cpp new file mode 100644 index 00000000..392c12d4 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_HopperMenu.cpp @@ -0,0 +1,77 @@ +#include "stdafx.h" +#include "IUIScene_HopperMenu.h" +#include "../Minecraft.World/net.minecraft.world.inventory.h" + +IUIScene_AbstractContainerMenu::ESceneSection IUIScene_HopperMenu::GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ) +{ + ESceneSection newSection = eSection; + + int xOffset = 0; + + // Find the new section if there is one + switch( eSection ) + { + case eSectionHopperContents: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionHopperInventory; + xOffset = -2; + } + else if(eTapDirection == eTapStateUp) + { + xOffset = -2; + newSection = eSectionHopperUsing; + } + break; + case eSectionHopperInventory: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionHopperUsing; + } + else if(eTapDirection == eTapStateUp) + { + xOffset = 2; + newSection = eSectionHopperContents; + } + break; + case eSectionHopperUsing: + if(eTapDirection == eTapStateDown) + { + xOffset = 2; + newSection = eSectionHopperContents; + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionHopperInventory; + } + break; + default: + assert(false); + break; + } + + updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, xOffset); + + return newSection; +} + +int IUIScene_HopperMenu::getSectionStartOffset(ESceneSection eSection) +{ + int offset = 0; + switch( eSection ) + { + case eSectionHopperContents: + offset = HopperMenu::CONTENTS_SLOT_START; + break; + case eSectionHopperInventory: + offset = HopperMenu::INV_SLOT_START; + break; + case eSectionHopperUsing: + offset = HopperMenu::USE_ROW_SLOT_START; + break; + default: + assert( false ); + break; + } + return offset; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_HopperMenu.h b/Minecraft.Client/Common/UI/IUIScene_HopperMenu.h new file mode 100644 index 00000000..ef6d8d25 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_HopperMenu.h @@ -0,0 +1,12 @@ +#pragma once + +#include "IUIScene_AbstractContainerMenu.h" +#include "../../../Minecraft.World/Container.h" +#include "../../../Minecraft.World/Inventory.h" + +class IUIScene_HopperMenu : public virtual IUIScene_AbstractContainerMenu +{ +public: + virtual ESceneSection GetSectionAndSlotInDirection(ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY); + int getSectionStartOffset(ESceneSection eSection); +}; diff --git a/Minecraft.Client/Common/UI/IUIScene_HorseInventoryMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_HorseInventoryMenu.cpp new file mode 100644 index 00000000..8f1caab8 --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_HorseInventoryMenu.cpp @@ -0,0 +1,251 @@ +#include "stdafx.h" +#include "IUIScene_HorseInventoryMenu.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.animal.h" + +IUIScene_AbstractContainerMenu::ESceneSection IUIScene_HorseInventoryMenu::GetSectionAndSlotInDirection( ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY ) +{ + ESceneSection newSection = eSection; + + int xOffset = 0; + int yOffset = 0; + + // Find the new section if there is one + switch( eSection ) + { + case eSectionHorseUsing: + if(eTapDirection == eTapStateDown) + { + if(m_horse->isChestedHorse() && *piTargetX >= 4) + { + newSection = eSectionHorseChest; + xOffset = 4; + } + else + { + newSection = eSectionHorseSaddle; + } + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionHorseInventory; + } + break; + case eSectionHorseInventory: + if(eTapDirection == eTapStateDown) + { + newSection = eSectionHorseUsing; + } + else if(eTapDirection == eTapStateUp) + { + if(m_horse->isChestedHorse() && *piTargetX >= 4) + { + xOffset = 4; + newSection = eSectionHorseChest; + } + else if(m_horse->canWearArmor()) + { + newSection = eSectionHorseArmor; + } + else + { + newSection = eSectionHorseSaddle; + } + } + break; + case eSectionHorseChest: + if(eTapDirection == eTapStateDown) + { + xOffset = -4; + newSection = eSectionHorseInventory; + } + else if(eTapDirection == eTapStateUp) + { + xOffset = -4; + newSection = eSectionHorseUsing; + } + else if(eTapDirection == eTapStateLeft) + { + if(*piTargetX < 0) + { + if(m_horse->canWearArmor() && *piTargetY == 1) + { + newSection = eSectionHorseArmor; + } + else if( *piTargetY == 0) + { + newSection = eSectionHorseSaddle; + } + } + } + else if(eTapDirection == eTapStateRight) + { + if(*piTargetX >= getSectionColumns(eSectionHorseChest)) + { + if(m_horse->canWearArmor() && *piTargetY == 1) + { + newSection = eSectionHorseArmor; + } + else if( *piTargetY == 0) + { + newSection = eSectionHorseSaddle; + } + } + } + break; + case eSectionHorseArmor: + if(eTapDirection == eTapStateDown) + { + if(m_horse->isChestedHorse()) + { + newSection = eSectionHorseChest; + } + else + { + newSection = eSectionHorseInventory; + } + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionHorseSaddle; + } + else if(eTapDirection == eTapStateRight) + { + if(m_horse->isChestedHorse()) + { + yOffset = -1; + *piTargetX = 0; + newSection = eSectionHorseChest; + } + } + else if(eTapDirection == eTapStateLeft) + { + if(m_horse->isChestedHorse()) + { + yOffset = -1; + *piTargetX = getSectionColumns(eSectionHorseChest); + newSection = eSectionHorseChest; + } + } + break; + case eSectionHorseSaddle: + if(eTapDirection == eTapStateDown) + { + if(m_horse->canWearArmor()) + { + newSection = eSectionHorseArmor; + } + else + { + newSection = eSectionHorseInventory; + } + } + else if(eTapDirection == eTapStateUp) + { + newSection = eSectionHorseUsing; + } + else if(eTapDirection == eTapStateRight) + { + if(m_horse->isChestedHorse()) + { + *piTargetX = 0; + newSection = eSectionHorseChest; + } + } + else if(eTapDirection == eTapStateLeft) + { + if(m_horse->isChestedHorse()) + { + *piTargetX = getSectionColumns(eSectionHorseChest); + newSection = eSectionHorseChest; + } + } + break; + default: + assert(false); + break; + } + + updateSlotPosition(eSection, newSection, eTapDirection, piTargetX, piTargetY, xOffset, yOffset); + + return newSection; +} + +// TODO: Offset will vary by type of horse, add in once horse menu and horse entity are implemented +int IUIScene_HorseInventoryMenu::getSectionStartOffset(ESceneSection eSection) +{ + int offset = 0; + switch( eSection ) + { + case eSectionHorseSaddle: + offset = EntityHorse::INV_SLOT_SADDLE; + break; + case eSectionHorseArmor: + offset = EntityHorse::INV_SLOT_ARMOR; + break; + case eSectionHorseChest: + offset = EntityHorse::INV_BASE_COUNT; + break; + case eSectionHorseInventory: + offset = EntityHorse::INV_BASE_COUNT; + if(m_horse->isChestedHorse()) + { + offset += EntityHorse::INV_DONKEY_CHEST_COUNT; + } + break; + case eSectionHorseUsing: + offset = EntityHorse::INV_BASE_COUNT + 27; + if(m_horse->isChestedHorse()) + { + offset += EntityHorse::INV_DONKEY_CHEST_COUNT; + } + break; + default: + assert( false ); + break; + } + return offset; +} + +bool IUIScene_HorseInventoryMenu::IsSectionSlotList( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionHorseChest: + if(!m_horse->isChestedHorse()) + return false; + else + return true; + case eSectionHorseArmor: + if(!m_horse->canWearArmor()) + return false; + else + return true; + case eSectionHorseSaddle: + case eSectionHorseInventory: + case eSectionHorseUsing: + return true; + } + return false; +} + +bool IUIScene_HorseInventoryMenu::IsVisible( ESceneSection eSection ) +{ + switch( eSection ) + { + case eSectionHorseChest: + if(!m_horse->isChestedHorse()) + return false; + else + return true; + case eSectionHorseArmor: + if(!m_horse->canWearArmor()) + return false; + else + return true; + case eSectionHorseSaddle: + case eSectionHorseInventory: + case eSectionHorseUsing: + return true; + } + return false; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_HorseInventoryMenu.h b/Minecraft.Client/Common/UI/IUIScene_HorseInventoryMenu.h new file mode 100644 index 00000000..6df2001e --- /dev/null +++ b/Minecraft.Client/Common/UI/IUIScene_HorseInventoryMenu.h @@ -0,0 +1,20 @@ +#pragma once + +#include "IUIScene_AbstractContainerMenu.h" +#include "../../../Minecraft.World/Container.h" +#include "../../../Minecraft.World/Inventory.h" +#include "../../../Minecraft.World/EntityHorse.h" + +class IUIScene_HorseInventoryMenu : public virtual IUIScene_AbstractContainerMenu +{ +protected: + shared_ptr m_inventory; + shared_ptr m_container; + shared_ptr m_horse; + +public: + virtual ESceneSection GetSectionAndSlotInDirection(ESceneSection eSection, ETapState eTapDirection, int *piTargetX, int *piTargetY); + int getSectionStartOffset(ESceneSection eSection); + bool IsSectionSlotList( ESceneSection eSection ); + bool IsVisible( ESceneSection eSection ); +}; diff --git a/Minecraft.Client/Common/UI/IUIScene_PauseMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_PauseMenu.cpp index 79203e7c..ab1767d4 100644 --- a/Minecraft.Client/Common/UI/IUIScene_PauseMenu.cpp +++ b/Minecraft.Client/Common/UI/IUIScene_PauseMenu.cpp @@ -11,15 +11,23 @@ #include "..\..\DLCTexturePack.h" #include "..\..\..\Minecraft.World\StringHelpers.h" +#ifndef _XBOX +#include "UI.h" +#endif + int IUIScene_PauseMenu::ExitGameDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) { - IUIScene_PauseMenu *scene = (IUIScene_PauseMenu *)pParam; +#ifdef _XBOX + IUIScene_PauseMenu *pScene = (IUIScene_PauseMenu *)pParam; +#else + IUIScene_PauseMenu *pScene = dynamic_cast(ui.GetSceneFromCallbackId((size_t)pParam)); +#endif // Results switched for this dialog if(result==C4JStorage::EMessage_ResultDecline) { - scene->SetIgnoreInput(true); + if(pScene) pScene->SetIgnoreInput(true); app.SetAction(iPad,eAppAction_ExitWorld); } return 0; @@ -28,7 +36,11 @@ int IUIScene_PauseMenu::ExitGameDialogReturned(void *pParam,int iPad,C4JStorage: int IUIScene_PauseMenu::ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) { - IUIScene_PauseMenu *scene = (IUIScene_PauseMenu *)pParam; +#ifdef _XBOX + IUIScene_PauseMenu *pScene = (IUIScene_PauseMenu *)pParam; +#else + IUIScene_PauseMenu *pScene = dynamic_cast(ui.GetSceneFromCallbackId((size_t)pParam)); +#endif // Exit with or without saving // Decline means save in this dialog @@ -62,7 +74,7 @@ int IUIScene_PauseMenu::ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStor uiIDA[1]=IDS_CONFIRM_CANCEL; // Give the player a warning about the trial version of the texture pack - ui.RequestMessageBox(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad() , &IUIScene_PauseMenu::WarningTrialTexturePackReturned, scene,app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad() , &IUIScene_PauseMenu::WarningTrialTexturePackReturned, pParam); return S_OK; } @@ -78,7 +90,7 @@ int IUIScene_PauseMenu::ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStor UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameAndSaveReturned, scene, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameAndSaveReturned, pParam); return 0; } else @@ -95,11 +107,11 @@ int IUIScene_PauseMenu::ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStor UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_TITLE_DECLINE_SAVE_GAME, IDS_CONFIRM_DECLINE_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameDeclineSaveReturned, scene, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_TITLE_DECLINE_SAVE_GAME, IDS_CONFIRM_DECLINE_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameDeclineSaveReturned, pParam); return 0; } - scene->SetIgnoreInput(true); + if(pScene) pScene->SetIgnoreInput(true); app.SetAction(iPad,eAppAction_ExitWorld); } @@ -110,7 +122,11 @@ int IUIScene_PauseMenu::ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStor int IUIScene_PauseMenu::ExitGameAndSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) { // 4J-PB - we won't come in here if we have a trial texture pack - IUIScene_PauseMenu *scene = (IUIScene_PauseMenu *)pParam; +#ifdef _XBOX + IUIScene_PauseMenu *pScene = (IUIScene_PauseMenu *)pParam; +#else + IUIScene_PauseMenu *pScene = dynamic_cast(ui.GetSceneFromCallbackId((size_t)pParam)); +#endif // results switched for this dialog if(result==C4JStorage::EMessage_ResultDecline) @@ -121,7 +137,7 @@ int IUIScene_PauseMenu::ExitGameAndSaveReturned(void *pParam,int iPad,C4JStorage #if defined(_XBOX_ONE) || defined(__ORBIS__) StorageManager.SetSaveDisabled(false); #endif - scene->SetIgnoreInput(true); + if(pScene) pScene->SetIgnoreInput(true); MinecraftServer::getInstance()->setSaveOnExit( true ); // flag a app action of exit game app.SetAction(iPad,eAppAction_ExitWorld); @@ -139,11 +155,11 @@ int IUIScene_PauseMenu::ExitGameAndSaveReturned(void *pParam,int iPad,C4JStorage if(g_NetworkManager.GetPlayerCount()>1) { - ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameSaveDialogReturned, scene, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameSaveDialogReturned, pParam); } else { - ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameSaveDialogReturned, scene, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, ProfileManager.GetPrimaryPad(), &IUIScene_PauseMenu::ExitGameSaveDialogReturned, pParam); } } } @@ -154,7 +170,11 @@ int IUIScene_PauseMenu::ExitGameAndSaveReturned(void *pParam,int iPad,C4JStorage int IUIScene_PauseMenu::ExitGameDeclineSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) { - IUIScene_PauseMenu *scene = (IUIScene_PauseMenu *)pParam; +#ifdef _XBOX + IUIScene_PauseMenu *pScene = (IUIScene_PauseMenu *)pParam; +#else + IUIScene_PauseMenu *pScene = dynamic_cast(ui.GetSceneFromCallbackId((size_t)pParam)); +#endif // results switched for this dialog if(result==C4JStorage::EMessage_ResultDecline) @@ -163,7 +183,7 @@ int IUIScene_PauseMenu::ExitGameDeclineSaveReturned(void *pParam,int iPad,C4JSto // Don't do this here, as it will still try and save some things even though it shouldn't! //StorageManager.SetSaveDisabled(false); #endif - scene->SetIgnoreInput(true); + if(pScene) pScene->SetIgnoreInput(true); MinecraftServer::getInstance()->setSaveOnExit( false ); // flag a app action of exit game app.SetAction(iPad,eAppAction_ExitWorld); @@ -181,11 +201,11 @@ int IUIScene_PauseMenu::ExitGameDeclineSaveReturned(void *pParam,int iPad,C4JSto if(g_NetworkManager.GetPlayerCount()>1) { - ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, ProfileManager.GetPrimaryPad(),&IUIScene_PauseMenu::ExitGameSaveDialogReturned, scene, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, ProfileManager.GetPrimaryPad(),&IUIScene_PauseMenu::ExitGameSaveDialogReturned, pParam); } else { - ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, ProfileManager.GetPrimaryPad(),&IUIScene_PauseMenu::ExitGameSaveDialogReturned, scene, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, ProfileManager.GetPrimaryPad(),&IUIScene_PauseMenu::ExitGameSaveDialogReturned, pParam); } } @@ -214,7 +234,7 @@ int IUIScene_PauseMenu::WarningTrialTexturePackReturned(void *pParam,int iPad,C4 { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad,NULL,&app, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); } else { @@ -288,7 +308,7 @@ int IUIScene_PauseMenu::WarningTrialTexturePackReturned(void *pParam,int iPad,C4 { // 4J-JEV: Fix for XB1: #165863 - XR-074: Compliance: With no active network connection user is unable to convert from Trial to Full texture pack and is not messaged why. UINT uiIDA[1] = { IDS_CONFIRM_OK }; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad); } } } @@ -498,7 +518,7 @@ void IUIScene_PauseMenu::_ExitWorld(LPVOID lpParameter) uiIDA[0]=IDS_CONFIRM_OK; // 4J Stu - Fix for #48669 - TU5: Code: Compliance: TCR #15: Incorrect/misleading messages after signing out a profile during online game session. // If the primary player is signed out, then that is most likely the cause of the disconnection so don't display a message box. This will allow the message box requested by the libraries to be brought up - if( ProfileManager.IsSignedIn(ProfileManager.GetPrimaryPad())) ui.RequestMessageBox( exitReasonTitleId, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + if( ProfileManager.IsSignedIn(ProfileManager.GetPrimaryPad())) ui.RequestErrorMessage( exitReasonTitleId, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad()); exitReasonStringId = -1; // 4J - Force a disconnection, this handles the situation that the server has already disconnected @@ -596,7 +616,7 @@ void IUIScene_PauseMenu::_ExitWorld(LPVOID lpParameter) UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox( exitReasonTitleId, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + ui.RequestErrorMessage( exitReasonTitleId, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad()); exitReasonStringId = -1; } } @@ -644,7 +664,7 @@ int IUIScene_PauseMenu::SaveGameDialogReturned(void *pParam,int iPad,C4JStorage: UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_TITLE_ENABLE_AUTOSAVE, IDS_CONFIRM_ENABLE_AUTOSAVE, uiIDA, 2, iPad,&IUIScene_PauseMenu::EnableAutosaveDialogReturned,pParam, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_TITLE_ENABLE_AUTOSAVE, IDS_CONFIRM_ENABLE_AUTOSAVE, uiIDA, 2, iPad,&IUIScene_PauseMenu::EnableAutosaveDialogReturned,pParam); #else // flag a app action of save game app.SetAction(iPad,eAppAction_SaveGame); diff --git a/Minecraft.Client/Common/UI/IUIScene_StartGame.cpp b/Minecraft.Client/Common/UI/IUIScene_StartGame.cpp index be611778..d3a9e8f0 100644 --- a/Minecraft.Client/Common/UI/IUIScene_StartGame.cpp +++ b/Minecraft.Client/Common/UI/IUIScene_StartGame.cpp @@ -239,7 +239,7 @@ void IUIScene_StartGame::UpdateCurrentTexturePack(int iSlot) // Give the player a warning about the texture pack missing - ui.RequestMessageBox(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 3, ProfileManager.GetPrimaryPad(),&:TexturePackDialogReturned,this,app.GetStringTable()); + ui.RequestErrorMessage(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 3, ProfileManager.GetPrimaryPad(),&:TexturePackDialogReturned,this); // do set the texture pack id, and on the user pressing create world, check they have it m_MoreOptionsParams.dwTexturePack = ListItem.iData; @@ -368,7 +368,7 @@ int IUIScene_StartGame::TexturePackDialogReturned(void *pParam,int iPad,C4JStora { // 4J-JEV: Fix for XB1: #165863 - XR-074: Compliance: With no active network connection user is unable to convert from Trial to Full texture pack and is not messaged why. UINT uiIDA[1] = { IDS_CONFIRM_OK }; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad); } } } diff --git a/Minecraft.Client/Common/UI/IUIScene_TradingMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_TradingMenu.cpp index 658bcdfb..8cc04940 100644 --- a/Minecraft.Client/Common/UI/IUIScene_TradingMenu.cpp +++ b/Minecraft.Client/Common/UI/IUIScene_TradingMenu.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "..\..\..\Minecraft.World\net.minecraft.world.item.trading.h" #include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" #include "..\..\..\Minecraft.World\net.minecraft.network.packet.h" #include "..\..\Minecraft.h" #include "..\..\MultiPlayerLocalPlayer.h" @@ -77,6 +78,9 @@ bool IUIScene_TradingMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) int buyBMatches = player->inventory->countMatches(buyBItem); if( (buyAItem != NULL && buyAMatches >= buyAItem->count) && (buyBItem == NULL || buyBMatches >= buyBItem->count) ) { + // 4J-JEV: Fix for PS4 #7111: [PATCH 1.12] Trading Librarian villagers for multiple ‘Enchanted Books’ will cause the title to crash. + int actualShopItem = m_activeOffers.at(selectedShopItem).second; + m_merchant->notifyTrade(activeRecipe); // Remove the items we are purchasing with @@ -91,7 +95,6 @@ bool IUIScene_TradingMenu::handleKeyDown(int iPad, int iAction, bool bRepeat) } // Send a packet to the server - int actualShopItem = m_activeOffers.at(selectedShopItem).second; player->connection->send( shared_ptr( new TradeItemPacket(m_menu->containerId, actualShopItem) ) ); updateDisplay(); @@ -238,15 +241,14 @@ void IUIScene_TradingMenu::updateDisplay() // 4J-PB - need to get the villager type here wsTemp = app.GetString(IDS_VILLAGER_OFFERS_ITEM); - wsTemp = replaceAll(wsTemp,L"{*VILLAGER_TYPE*}",app.GetString(m_merchant->getDisplayName())); + wsTemp = replaceAll(wsTemp,L"{*VILLAGER_TYPE*}",m_merchant->getDisplayName()); int iPos=wsTemp.find(L"%s"); wsTemp.replace(iPos,2,activeRecipe->getSellItem()->getHoverName()); setTitle(wsTemp.c_str()); - vector unformattedStrings; - wstring offerDescription = GetItemDescription(activeRecipe->getSellItem(), unformattedStrings); - setOfferDescription(offerDescription, unformattedStrings); + vector *offerDescription = GetItemDescription(activeRecipe->getSellItem()); + setOfferDescription(offerDescription); shared_ptr buyAItem = activeRecipe->getBuyAItem(); shared_ptr buyBItem = activeRecipe->getBuyBItem(); @@ -299,13 +301,15 @@ void IUIScene_TradingMenu::updateDisplay() } else { - setTitle(app.GetString(m_merchant->getDisplayName())); + setTitle(m_merchant->getDisplayName()); setRequest1Name(L""); setRequest2Name(L""); setRequest1RedBox(false); setRequest2RedBox(false); setRequest1Item(nullptr); - setRequest2Item(nullptr); + setRequest2Item(nullptr); + vector offerDescription; + setOfferDescription(&offerDescription); } m_bHasUpdatedOnce = true; @@ -361,27 +365,20 @@ void IUIScene_TradingMenu::setTradeItem(int index, shared_ptr item { } -wstring IUIScene_TradingMenu::GetItemDescription(shared_ptr item, vector &unformattedStrings) +vector *IUIScene_TradingMenu::GetItemDescription(shared_ptr item) { - if(item == NULL) return L""; + vector *lines = item->getHoverText(nullptr, false); - wstring desc = L""; - vector *strings = item->getHoverTextOnly(nullptr, false, unformattedStrings); - bool firstLine = true; - for(AUTO_VAR(it, strings->begin()); it != strings->end(); ++it) + // Add rarity to first line + if (lines->size() > 0) { - wstring thisString = *it; - if(!firstLine) - { - desc.append( L"
" ); - } - else - { - firstLine = false; - } - desc.append( thisString ); + lines->at(0).color = item->getRarity()->color; } - strings->clear(); - delete strings; - return desc; + + return lines; } + +void IUIScene_TradingMenu::HandleInventoryUpdated() +{ + updateDisplay(); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/IUIScene_TradingMenu.h b/Minecraft.Client/Common/UI/IUIScene_TradingMenu.h index c8edda67..726f13c7 100644 --- a/Minecraft.Client/Common/UI/IUIScene_TradingMenu.h +++ b/Minecraft.Client/Common/UI/IUIScene_TradingMenu.h @@ -40,16 +40,19 @@ protected: virtual void setRequest2RedBox(bool show) = 0; virtual void setTradeRedBox(int index, bool show) = 0; - virtual void setOfferDescription(const wstring &name, vector &unformattedStrings) = 0; + virtual void setOfferDescription(vector *description) = 0; virtual void setRequest1Item(shared_ptr item); virtual void setRequest2Item(shared_ptr item); virtual void setTradeItem(int index, shared_ptr item); -private: void updateDisplay(); + void HandleInventoryUpdated(); + +private: bool canMake(MerchantRecipe *recipe); - wstring GetItemDescription(shared_ptr item, vector &unformattedStrings); + + vector *GetItemDescription(shared_ptr item); public: shared_ptr getMerchant(); diff --git a/Minecraft.Client/Common/UI/UI.h b/Minecraft.Client/Common/UI/UI.h index 622ccf84..428b3b90 100644 --- a/Minecraft.Client/Common/UI/UI.h +++ b/Minecraft.Client/Common/UI/UI.h @@ -31,10 +31,12 @@ #include "UIControl_HTMLLabel.h" #include "UIControl_DynamicLabel.h" #include "UIControl_MinecraftPlayer.h" +#include "UIControl_MinecraftHorse.h" #include "UIControl_PlayerSkinPreview.h" #include "UIControl_EnchantmentButton.h" #include "UIControl_EnchantmentBook.h" #include "UIControl_SpaceIndicatorBar.h" +#include "UIControl_BeaconEffectButton.h" #ifdef __PSVITA__ #include "UIControl_Touch.h" @@ -85,6 +87,7 @@ #include "UIScene_SettingsUIMenu.h" #include "UIScene_SkinSelectMenu.h" #include "UIScene_HowToPlayMenu.h" +#include "UIScene_LanguageSelector.h" #include "UIScene_HowToPlay.h" #include "UIScene_ControlsMenu.h" #include "UIScene_Credits.h" @@ -101,6 +104,10 @@ #include "UIScene_CreativeMenu.h" #include "UIScene_TradingMenu.h" #include "UIScene_AnvilMenu.h" +#include "UIScene_HorseInventoryMenu.h" +#include "UIScene_HopperMenu.h" +#include "UIScene_BeaconMenu.h" +#include "UIScene_FireworksMenu.h" #include "UIScene_CraftingMenu.h" #include "UIScene_SignEntryMenu.h" @@ -116,3 +123,4 @@ #include "UIScene_TeleportMenu.h" #include "UIScene_EndPoem.h" #include "UIScene_EULA.h" +#include "UIScene_NewUpdateMessage.h" \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIBitmapFont.cpp b/Minecraft.Client/Common/UI/UIBitmapFont.cpp index ec49eea3..afc2b139 100644 --- a/Minecraft.Client/Common/UI/UIBitmapFont.cpp +++ b/Minecraft.Client/Common/UI/UIBitmapFont.cpp @@ -39,16 +39,16 @@ UIAbstractBitmapFont::UIAbstractBitmapFont(const string &fontname) void UIAbstractBitmapFont::registerFont() { - if(m_registered) + if (!m_registered) { - return; + // 4J-JEV: These only need registering the once when we first use this font in Iggy. + m_bitmapFontProvider->num_glyphs = m_numGlyphs; + IggyFontInstallBitmapUTF8( m_bitmapFontProvider, m_fontname.c_str(), -1, IGGY_FONTFLAG_none ); + m_registered = true; } - m_bitmapFontProvider->num_glyphs = m_numGlyphs; - - IggyFontInstallBitmapUTF8( m_bitmapFontProvider,m_fontname.c_str(),-1,IGGY_FONTFLAG_none ); - IggyFontSetIndirectUTF8( m_fontname.c_str(),-1 ,IGGY_FONTFLAG_all ,m_fontname.c_str() ,-1 ,IGGY_FONTFLAG_none ); - m_registered = true; + // 4J-JEV: Reset the font redirect to these fonts (we must do this everytime in-case we switched away elsewhere). + IggyFontSetIndirectUTF8( m_fontname.c_str(), -1, IGGY_FONTFLAG_all, m_fontname.c_str(), -1, IGGY_FONTFLAG_none ); } IggyFontMetrics * RADLINK UIAbstractBitmapFont::GetFontMetrics_Callback(void *user_context,IggyFontMetrics *metrics) @@ -357,7 +357,7 @@ rrbool UIBitmapFont::GetGlyphBitmap(S32 glyph,F32 pixel_scale,IggyBitmapCharacte } //Callback function type for freeing a bitmap shape returned by GetGlyphBitmap -void RADLINK UIBitmapFont::FreeGlyphBitmap(S32 glyph,F32 pixel_scale,IggyBitmapCharacter *bitmap) +void UIBitmapFont::FreeGlyphBitmap(S32 glyph,F32 pixel_scale,IggyBitmapCharacter *bitmap) { // We don't need to free anything,it just comes from the archive. //app.DebugPrintf("Free bitmap for glyph %d at scale %f\n",glyph,pixel_scale); diff --git a/Minecraft.Client/Common/UI/UIComponent_Panorama.cpp b/Minecraft.Client/Common/UI/UIComponent_Panorama.cpp index a418fcda..cb6443a1 100644 --- a/Minecraft.Client/Common/UI/UIComponent_Panorama.cpp +++ b/Minecraft.Client/Common/UI/UIComponent_Panorama.cpp @@ -51,7 +51,7 @@ void UIComponent_Panorama::tick() // are we in the Nether? - Leave the time as 0 if we are, so we show daylight if(pMinecraft->level->dimension->id==0) { - i64TimeOfDay = pMinecraft->level->getLevelData()->getTime() % 24000; + i64TimeOfDay = pMinecraft->level->getLevelData()->getGameTime() % 24000; } if(i64TimeOfDay>14000) diff --git a/Minecraft.Client/Common/UI/UIComponent_PressStartToPlay.cpp b/Minecraft.Client/Common/UI/UIComponent_PressStartToPlay.cpp index 2feb94c1..9af43df4 100644 --- a/Minecraft.Client/Common/UI/UIComponent_PressStartToPlay.cpp +++ b/Minecraft.Client/Common/UI/UIComponent_PressStartToPlay.cpp @@ -21,18 +21,15 @@ UIComponent_PressStartToPlay::UIComponent_PressStartToPlay(int iPad, void *initD m_labelTrialTimer.init(L""); m_labelTrialTimer.setVisible(false); + // 4J-JEV: This object is persistent, so this string needs to be able to handle language changes. #ifdef __ORBIS__ - wstring text = app.GetString(IDS_PRESS_X_TO_JOIN); - text = replaceAll(text, L"{*CONTROLLER_VK_A*}", app.GetVKReplacement(VK_PAD_A) ); - - m_labelPressStart.init(text.c_str()); + m_labelPressStart.init( (UIString) [] { return replaceAll(app.GetString(IDS_PRESS_X_TO_JOIN), L"{*CONTROLLER_VK_A*}", app.GetVKReplacement(VK_PAD_A) ); }); #elif defined _XBOX_ONE - wstring text = app.GetString(IDS_PRESS_START_TO_JOIN); - text = replaceAll(text, L"{*CONTROLLER_VK_START*}", app.GetVKReplacement(VK_PAD_START) ); - m_labelPressStart.init(text.c_str()); + m_labelPressStart.init( (UIString) [] { return replaceAll(app.GetString(IDS_PRESS_START_TO_JOIN), L"{*CONTROLLER_VK_START*}", app.GetVKReplacement(VK_PAD_START) ); }); #else - m_labelPressStart.init(app.GetString(IDS_PRESS_START_TO_JOIN)); + m_labelPressStart.init(IDS_PRESS_START_TO_JOIN); #endif + m_controlSaveIcon.setVisible(false); m_controlPressStartPanel.setVisible(false); m_playerDisplayName.setVisible(false); diff --git a/Minecraft.Client/Common/UI/UIComponent_Tooltips.cpp b/Minecraft.Client/Common/UI/UIComponent_Tooltips.cpp index 63eba1a5..255740c9 100644 --- a/Minecraft.Client/Common/UI/UIComponent_Tooltips.cpp +++ b/Minecraft.Client/Common/UI/UIComponent_Tooltips.cpp @@ -177,6 +177,18 @@ void UIComponent_Tooltips::tick() fVal=0.01f*(float)ucAlpha; } setOpacity(fVal); + + bool layoutChanges = false; + for (int i = 0; i < eToolTipNumButtons; i++) + { + if ( !ui.IsReloadingSkin() && m_tooltipValues[i].show && m_tooltipValues[i].label.needsUpdating() ) + { + layoutChanges = true; + _SetTooltip(i, m_tooltipValues[i].label, m_tooltipValues[i].show, true); + m_tooltipValues[i].label.setUpdated(); + } + } + if (layoutChanges) _Relayout(); } void UIComponent_Tooltips::render(S32 width, S32 height, C4JRender::eViewportType viewport) @@ -272,7 +284,7 @@ void UIComponent_Tooltips::ShowTooltip( unsigned int tooltip, bool show ) } } -void UIComponent_Tooltips::SetTooltips( int iA, int iB, int iX, int iY , int iLT, int iRT, int iLB, int iRB, int iLS, bool forceUpdate) +void UIComponent_Tooltips::SetTooltips( int iA, int iB, int iX, int iY , int iLT, int iRT, int iLB, int iRB, int iLS, int iRS, int iBack, bool forceUpdate) { bool needsRelayout = false; needsRelayout = _SetTooltip( eToolTipButtonA, iA ) || needsRelayout; @@ -284,8 +296,10 @@ void UIComponent_Tooltips::SetTooltips( int iA, int iB, int iX, int iY , int iLT needsRelayout = _SetTooltip( eToolTipButtonLB, iLB ) || needsRelayout; needsRelayout = _SetTooltip( eToolTipButtonRB, iRB ) || needsRelayout; needsRelayout = _SetTooltip( eToolTipButtonLS, iLS ) || needsRelayout; - - if(needsRelayout)_Relayout(); + needsRelayout = _SetTooltip( eToolTipButtonRS, iRS ) || needsRelayout; + needsRelayout = _SetTooltip( eToolTipButtonRS, iRS ) || needsRelayout; + needsRelayout = _SetTooltip( eToolTipButtonBack, iBack ) || needsRelayout; + if (needsRelayout) _Relayout(); } void UIComponent_Tooltips::EnableTooltip( unsigned int tooltip, bool enable ) @@ -299,20 +313,21 @@ bool UIComponent_Tooltips::_SetTooltip(unsigned int iToolTip, int iTextID) { m_tooltipValues[iToolTip].iString = iTextID; changed = true; - if(iTextID > -1) _SetTooltip(iToolTip, app.GetString(iTextID), true); - else if(iTextID == -2) _SetTooltip(iToolTip, L"", true); - else _SetTooltip(iToolTip, L"", false); + if(iTextID > -1) _SetTooltip(iToolTip, iTextID, true); + else if(iTextID == -2) _SetTooltip(iToolTip, L"", true); + else _SetTooltip(iToolTip, L"", false); } return changed; } -void UIComponent_Tooltips::_SetTooltip(unsigned int iToolTipId, const wstring &label, bool show, bool force) +void UIComponent_Tooltips::_SetTooltip(unsigned int iToolTipId, UIString label, bool show, bool force) { if(!force && !show && !m_tooltipValues[iToolTipId].show) { return; } m_tooltipValues[iToolTipId].show = show; + m_tooltipValues[iToolTipId].label = label; IggyDataValue result; IggyDataValue value[3]; @@ -330,7 +345,7 @@ void UIComponent_Tooltips::_SetTooltip(unsigned int iToolTipId, const wstring &l value[2].boolval = show; IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetTooltip , 3 , value ); - app.DebugPrintf("Actual tooltip update!\n"); + //app.DebugPrintf("Actual tooltip update!\n"); } void UIComponent_Tooltips::_Relayout() @@ -350,6 +365,10 @@ void UIComponent_Tooltips::handleTouchInput(unsigned int iPad, S32 x, S32 y, int //app.DebugPrintf("ToolTip Touch ID = %i\n", iId); bool handled = false; + // 4J - TomK no tooltips no touch! + if((!ui.GetMenuDisplayed(ProfileManager.GetPrimaryPad())) && (app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_Tooltips) == 0)) + return; + // perform action on release if(bReleased) { @@ -357,11 +376,17 @@ void UIComponent_Tooltips::handleTouchInput(unsigned int iPad, S32 x, S32 y, int { case ETouchInput_Touch_A: app.DebugPrintf("ToolTip Map Touch to _PSV_JOY_BUTTON_X\n", iId); - InputManager.MapTouchInput(iPad, _PSV_JOY_BUTTON_X); + if(InputManager.IsCircleCrossSwapped()) + InputManager.MapTouchInput(iPad, _PSV_JOY_BUTTON_O); + else + InputManager.MapTouchInput(iPad, _PSV_JOY_BUTTON_X); break; case ETouchInput_Touch_B: app.DebugPrintf("ToolTip Map Touch to _PSV_JOY_BUTTON_O\n", iId); - InputManager.MapTouchInput(iPad, _PSV_JOY_BUTTON_O); + if(InputManager.IsCircleCrossSwapped()) + InputManager.MapTouchInput(iPad, _PSV_JOY_BUTTON_X); + else + InputManager.MapTouchInput(iPad, _PSV_JOY_BUTTON_O); break; case ETouchInput_Touch_X: app.DebugPrintf("ToolTip Map Touch to _PSV_JOY_BUTTON_SQUARE\n", iId); @@ -376,8 +401,8 @@ void UIComponent_Tooltips::handleTouchInput(unsigned int iPad, S32 x, S32 y, int app.DebugPrintf("ToolTip no action\n", iId); break; case ETouchInput_Touch_RightTrigger: - app.DebugPrintf("ToolTip Map Touch to _PSV_JOY_BUTTON_SELECT\n", iId); - InputManager.MapTouchInput(iPad, _PSV_JOY_BUTTON_SELECT); + app.DebugPrintf("ToolTip no action\n", iId); + /* no action */ break; case ETouchInput_Touch_LeftBumper: app.DebugPrintf("ToolTip Map Touch to _PSV_JOY_BUTTON_L1\n", iId); @@ -391,6 +416,14 @@ void UIComponent_Tooltips::handleTouchInput(unsigned int iPad, S32 x, S32 y, int app.DebugPrintf("ToolTip no action\n", iId); /* no action */ break; + case ETouchInput_Touch_RightStick: + app.DebugPrintf("ToolTip Map Touch to _PSV_JOY_BUTTON_DPAD_DOWN\n", iId); + InputManager.MapTouchInput(iPad, _PSV_JOY_BUTTON_DPAD_DOWN); + break; + case ETouchInput_Touch_Select: + app.DebugPrintf("ToolTip Map Touch to _PSV_JOY_BUTTON_SELECT\n", iId); + InputManager.MapTouchInput(iPad, _PSV_JOY_BUTTON_SELECT); + break; } } } @@ -413,14 +446,14 @@ void UIComponent_Tooltips::handleReload() for(unsigned int i = 0; i < eToolTipNumButtons; ++i) { - _SetTooltip(i,app.GetString(m_tooltipValues[i].iString), m_tooltipValues[i].show, true); + _SetTooltip(i, m_tooltipValues[i].iString, m_tooltipValues[i].show, true); } _Relayout(); } void UIComponent_Tooltips::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) { - if(m_overrideSFX[iPad][key]) + if( (0 <= iPad) && (iPad <= 3) && m_overrideSFX[iPad][key] ) { // don't play a sound for this action switch(key) diff --git a/Minecraft.Client/Common/UI/UIComponent_Tooltips.h b/Minecraft.Client/Common/UI/UIComponent_Tooltips.h index 4b4c8268..f8db9439 100644 --- a/Minecraft.Client/Common/UI/UIComponent_Tooltips.h +++ b/Minecraft.Client/Common/UI/UIComponent_Tooltips.h @@ -13,6 +13,8 @@ protected: bool show; int iString; + UIString label; + _TooltipValues() { show = false; @@ -23,7 +25,7 @@ protected: TooltipValues m_tooltipValues[eToolTipNumButtons]; IggyName m_funcSetTooltip, m_funcSetOpacity, m_funcSetABSwap, m_funcUpdateLayout; - + #ifdef __PSVITA__ enum ETouchInput { @@ -36,6 +38,8 @@ protected: ETouchInput_Touch_LeftBumper, ETouchInput_Touch_RightBumper, ETouchInput_Touch_LeftStick, + ETouchInput_Touch_RightStick, + ETouchInput_Touch_Select, ETouchInput_Count, }; @@ -53,6 +57,8 @@ protected: UI_MAP_ELEMENT( m_TouchController[ETouchInput_Touch_LeftBumper], "Touch_LeftBumper") UI_MAP_ELEMENT( m_TouchController[ETouchInput_Touch_RightBumper], "Touch_RightBumper") UI_MAP_ELEMENT( m_TouchController[ETouchInput_Touch_LeftStick], "Touch_LeftStick") + UI_MAP_ELEMENT( m_TouchController[ETouchInput_Touch_RightStick], "Touch_RightStick") + UI_MAP_ELEMENT( m_TouchController[ETouchInput_Touch_Select], "Touch_Select") #endif UI_MAP_NAME( m_funcSetTooltip, L"SetToolTip") UI_MAP_NAME( m_funcSetOpacity, L"SetOpacity") @@ -88,7 +94,7 @@ public: virtual void SetTooltipText( unsigned int tooltip, int iTextID ); virtual void SetEnableTooltips( bool bVal ); virtual void ShowTooltip( unsigned int tooltip, bool show ); - virtual void SetTooltips( int iA, int iB=-1, int iX=-1, int iY=-1 , int iLT=-1, int iRT=-1, int iLB=-1, int iRB=-1, int iLS=-1, bool forceUpdate = false); + virtual void SetTooltips( int iA, int iB=-1, int iX=-1, int iY=-1 , int iLT=-1, int iRT=-1, int iLB=-1, int iRB=-1, int iLS=-1, int iRS=-1, int iBack=-1, bool forceUpdate = false); virtual void EnableTooltip( unsigned int tooltip, bool enable ); virtual void handleReload(); @@ -99,7 +105,7 @@ public: private: bool _SetTooltip(unsigned int iToolTip, int iTextID); - void _SetTooltip(unsigned int iToolTipId, const wstring &label, bool show, bool force = false); + void _SetTooltip(unsigned int iToolTipId, UIString label, bool show, bool force = false); void _Relayout(); bool m_overrideSFX[XUSER_MAX_COUNT][ACTION_MAX_MENU]; diff --git a/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.cpp b/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.cpp index 858a8b43..3b4eb097 100644 --- a/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.cpp +++ b/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.cpp @@ -21,6 +21,7 @@ UIComponent_TutorialPopup::UIComponent_TutorialPopup(int iPad, void *initData, U m_bContainerMenuVisible = false; m_bSplitscreenGamertagVisible = false; + m_iconType = e_ICON_TYPE_IGGY; m_labelDescription.init(L""); } @@ -63,6 +64,8 @@ void UIComponent_TutorialPopup::handleReload() value[0].type = IGGY_DATATYPE_boolean; value[0].boolval = (bool)((app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_DisplaySplitscreenGamertags)!=0) && !m_bContainerMenuVisible); // 4J - TomK - Offset for splitscreen gamertag? IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcAdjustLayout, 1 , value ); + + setupIconHolder(m_iconType); } void UIComponent_TutorialPopup::SetTutorialDescription(TutorialPopupInfo *info) @@ -317,7 +320,7 @@ wstring UIComponent_TutorialPopup::_SetIcon(int icon, int iAuxVal, bool isFoil, } else if(temp.find(L"{*StoneIcon*}")!=wstring::npos) { - m_iconItem = shared_ptr(new ItemInstance(Tile::rock_Id,1,0)); + m_iconItem = shared_ptr(new ItemInstance(Tile::stone_Id,1,0)); } else { @@ -428,6 +431,7 @@ void UIComponent_TutorialPopup::UpdateInteractScenePosition(bool visible) bool bAllowAnim=false; bool isCraftingScene = (m_interactScene->getSceneType() == eUIScene_Crafting2x2Menu) || (m_interactScene->getSceneType() == eUIScene_Crafting3x3Menu); bool isCreativeScene = (m_interactScene->getSceneType() == eUIScene_CreativeMenu); + bool isTradingScene = (m_interactScene->getSceneType() == eUIScene_TradingMenu); switch(Minecraft::GetInstance()->localplayers[m_iPad]->m_iScreenSection) { case C4JRender::VIEWPORT_TYPE_FULLSCREEN: @@ -437,7 +441,7 @@ void UIComponent_TutorialPopup::UpdateInteractScenePosition(bool visible) break; default: // anim allowed for everything except the crafting 2x2 and 3x3, and the creative menu - if(!isCraftingScene && !isCreativeScene) + if(!isCraftingScene && !isCreativeScene && !isTradingScene) { bAllowAnim=true; } @@ -536,4 +540,6 @@ void UIComponent_TutorialPopup::setupIconHolder(EIcons icon) value[0].type = IGGY_DATATYPE_number; value[0].number = (F64)icon; IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetupIconHolder , 1 , value ); + + m_iconType = icon; } diff --git a/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.h b/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.h index 36f78300..4e5f4285 100644 --- a/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.h +++ b/Minecraft.Client/Common/UI/UIComponent_TutorialPopup.h @@ -39,6 +39,8 @@ private: e_ICON_TYPE_TRANSPORT = 11, }; + EIcons m_iconType; + public: UIComponent_TutorialPopup(int iPad, void *initData, UILayer *parentLayer); diff --git a/Minecraft.Client/Common/UI/UIControl.h b/Minecraft.Client/Common/UI/UIControl.h index 3b4ef050..e37f04de 100644 --- a/Minecraft.Client/Common/UI/UIControl.h +++ b/Minecraft.Client/Common/UI/UIControl.h @@ -20,6 +20,7 @@ public: eLabel, eLeaderboardList, eMinecraftPlayer, + eMinecraftHorse, ePlayerList, ePlayerSkinPreview, eProgress, diff --git a/Minecraft.Client/Common/UI/UIControl_Base.cpp b/Minecraft.Client/Common/UI/UIControl_Base.cpp index 18af2f63..7a4a24e5 100644 --- a/Minecraft.Client/Common/UI/UIControl_Base.cpp +++ b/Minecraft.Client/Common/UI/UIControl_Base.cpp @@ -7,7 +7,7 @@ UIControl_Base::UIControl_Base() { m_bLabelChanged = false; - m_label = L""; + m_label; m_id = 0; } @@ -27,7 +27,7 @@ void UIControl_Base::tick() { UIControl::tick(); - if(m_bLabelChanged) + if ( m_label.needsUpdating() || m_bLabelChanged ) { //app.DebugPrintf("Calling SetLabel - '%ls'\n", m_label.c_str()); m_bLabelChanged = false; @@ -37,15 +37,17 @@ void UIControl_Base::tick() value[0].type = IGGY_DATATYPE_string_UTF16; IggyStringUTF16 stringVal; - stringVal.string = (IggyUTF16*)m_label.c_str(); + stringVal.string = (IggyUTF16*) m_label.c_str(); stringVal.length = m_label.length(); value[0].string16 = stringVal; IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_setLabelFunc , 1 , value ); + + m_label.setUpdated(); } } -void UIControl_Base::setLabel(const wstring &label, bool instant, bool force) +void UIControl_Base::setLabel(UIString label, bool instant, bool force) { if( force || ((!m_label.empty() || !label.empty()) && m_label.compare(label) != 0) ) m_bLabelChanged = true; m_label = label; @@ -67,20 +69,14 @@ void UIControl_Base::setLabel(const wstring &label, bool instant, bool force) } } -void UIControl_Base::setLabel(const string &label) -{ - wstring wlabel = convStringToWstring(label); - setLabel(wlabel); -} - const wchar_t* UIControl_Base::getLabel() { IggyDataValue result; - IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcGetLabel , 0 , NULL ); + IggyResult out = IggyPlayerCallMethodRS(m_parentScene->getMovie(), &result, getIggyValuePath(), m_funcGetLabel, 0, NULL); if(result.type == IGGY_DATATYPE_string_UTF16) { - m_label = wstring( (wchar_t *)result.string16.string, result.string16.length); + m_label = wstring((wchar_t *)result.string16.string, result.string16.length); } return m_label.c_str(); diff --git a/Minecraft.Client/Common/UI/UIControl_Base.h b/Minecraft.Client/Common/UI/UIControl_Base.h index e70997c3..73ecac5a 100644 --- a/Minecraft.Client/Common/UI/UIControl_Base.h +++ b/Minecraft.Client/Common/UI/UIControl_Base.h @@ -1,6 +1,7 @@ #pragma once #include "UIControl.h" +#include "UIString.h" // This class maps to the FJ_Base class in actionscript class UIControl_Base : public UIControl @@ -12,7 +13,8 @@ protected: IggyName m_funcCheckLabelWidths; bool m_bLabelChanged; - wstring m_label; + UIString m_label; + public: UIControl_Base(); @@ -20,8 +22,9 @@ public: virtual void tick(); - virtual void setLabel(const wstring &label, bool instant = false, bool force = false); - virtual void setLabel(const string &label); + virtual void setLabel(UIString label, bool instant = false, bool force = false); + //virtual void setLabel(wstring label, bool instant = false, bool force = false) { this->setLabel(UIString::CONSTANT(label), instant, force); } + const wchar_t* getLabel(); virtual void setAllPossibleLabels(int labelCount, wchar_t labels[][256]); int getId() { return m_id; } diff --git a/Minecraft.Client/Common/UI/UIControl_BeaconEffectButton.cpp b/Minecraft.Client/Common/UI/UIControl_BeaconEffectButton.cpp new file mode 100644 index 00000000..7ee79307 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_BeaconEffectButton.cpp @@ -0,0 +1,121 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIControl_BeaconEffectButton.h" + +UIControl_BeaconEffectButton::UIControl_BeaconEffectButton() +{ + m_data = 0; + m_icon = 0; + m_selected = false; + m_active = false; + m_focus = false; +} + +bool UIControl_BeaconEffectButton::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) +{ + bool success = UIControl::setupControl(scene,parent,controlName); + + m_funcChangeState = registerFastName(L"ChangeState"); + m_funcSetIcon = registerFastName(L"SetIcon"); + + return success; +} + +void UIControl_BeaconEffectButton::SetData(int data, int icon, bool active, bool selected) +{ + m_data = data; + m_active = active; + m_selected = selected; + + SetIcon(icon); + UpdateButtonState(); +} + +int UIControl_BeaconEffectButton::GetData() +{ + return m_data; +} + +void UIControl_BeaconEffectButton::SetButtonSelected(bool selected) +{ + if(selected != m_selected) + { + m_selected = selected; + + UpdateButtonState(); + } +} + +bool UIControl_BeaconEffectButton::IsButtonSelected() +{ + return m_selected; +} + +void UIControl_BeaconEffectButton::SetButtonActive(bool active) +{ + if(m_active != active) + { + m_active = active; + + UpdateButtonState(); + } +} + +void UIControl_BeaconEffectButton::setFocus(bool focus) +{ + if(m_focus != focus) + { + m_focus = focus; + + UpdateButtonState(); + } +} + +void UIControl_BeaconEffectButton::SetIcon(int icon) +{ + if(icon != m_icon) + { + m_icon = icon; + + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = m_icon; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcSetIcon , 1 , value ); + } +} + +void UIControl_BeaconEffectButton::UpdateButtonState() +{ + EState state = eState_Disabled; + + if(!m_active) + { + state = eState_Disabled; + } + else if(m_selected) + { + state = eState_Pressed; + } + else if(m_focus) + { + state = eState_Enabled_Selected; + } + else + { + state = eState_Enabled_Unselected; + } + + if(state != m_lastState) + { + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = state; + IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_funcChangeState , 1 , value ); + + if(out == IGGY_RESULT_SUCCESS) m_lastState = state; + } +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_BeaconEffectButton.h b/Minecraft.Client/Common/UI/UIControl_BeaconEffectButton.h new file mode 100644 index 00000000..788213da --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_BeaconEffectButton.h @@ -0,0 +1,49 @@ +#pragma once + +#include "UIControl.h" + +class UIControl_BeaconEffectButton : public UIControl +{ +private: + static const int BUTTON_DISABLED = 0; + static const int BUTTON_ENABLED_UNSELECTED = 1; + static const int BUTTON_ENABLED_SELECTED = 2; + static const int BUTTON_PRESSED = 3; + + enum EState + { + eState_Disabled, + eState_Enabled_Unselected, + eState_Enabled_Selected, + eState_Pressed + }; + EState m_lastState; + + int m_data; + int m_icon; + bool m_selected; + bool m_active; + bool m_focus; + + IggyName m_funcChangeState, m_funcSetIcon; + +public: + UIControl_BeaconEffectButton(); + + virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + void SetData(int data, int icon, bool active, bool selected); + int GetData(); + + void SetButtonSelected(bool selected); + bool IsButtonSelected(); + + void SetButtonActive(bool active); + + virtual void setFocus(bool focus); + + void SetIcon(int icon); + +private: + void UpdateButtonState(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_Button.cpp b/Minecraft.Client/Common/UI/UIControl_Button.cpp index 96ddb8eb..70adb6b1 100644 --- a/Minecraft.Client/Common/UI/UIControl_Button.cpp +++ b/Minecraft.Client/Common/UI/UIControl_Button.cpp @@ -17,7 +17,7 @@ bool UIControl_Button::setupControl(UIScene *scene, IggyValuePath *parent, const return success; } -void UIControl_Button::init(const wstring &label, int id) +void UIControl_Button::init(UIString label, int id) { m_label = label; m_id = id; diff --git a/Minecraft.Client/Common/UI/UIControl_Button.h b/Minecraft.Client/Common/UI/UIControl_Button.h index 367a48d7..7369e8a0 100644 --- a/Minecraft.Client/Common/UI/UIControl_Button.h +++ b/Minecraft.Client/Common/UI/UIControl_Button.h @@ -12,7 +12,9 @@ public: virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); - void init(const wstring &label, int id); + void init(UIString label, int id); + //void init(const wstring &label, int id) { init(UIString::CONSTANT(label), id); } + virtual void ReInit(); void setEnable(bool enable); diff --git a/Minecraft.Client/Common/UI/UIControl_ButtonList.cpp b/Minecraft.Client/Common/UI/UIControl_ButtonList.cpp index 32db4843..68a3d655 100644 --- a/Minecraft.Client/Common/UI/UIControl_ButtonList.cpp +++ b/Minecraft.Client/Common/UI/UIControl_ButtonList.cpp @@ -195,3 +195,47 @@ bool UIControl_ButtonList::CanTouchTrigger(S32 iX, S32 iY) return bCanTouchTrigger; } #endif + + +void UIControl_DynamicButtonList::tick() +{ + UIControl_ButtonList::tick(); + + int buttonIndex = 0; + vector::iterator itr; + for (itr = m_labels.begin(); itr != m_labels.end(); itr++) + { + if ( itr->needsUpdating() ) + { + setButtonLabel(buttonIndex, itr->getString()); + itr->setUpdated(); + } + buttonIndex++; + } +} + +void UIControl_DynamicButtonList::addItem(UIString label, int data) +{ + if (data < 0) data = m_itemCount; + + if (data < m_labels.size()) + { + m_labels[data] = label; + } + else + { + while (data > m_labels.size()) + { + m_labels.push_back(UIString()); + } + m_labels.push_back(label); + } + + UIControl_ButtonList::addItem(label.getString(), data); +} + +void UIControl_DynamicButtonList::removeItem(int index) +{ + m_labels.erase( m_labels.begin() + index ); + UIControl_ButtonList::removeItem(index); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_ButtonList.h b/Minecraft.Client/Common/UI/UIControl_ButtonList.h index a3c5da3a..44484ac3 100644 --- a/Minecraft.Client/Common/UI/UIControl_ButtonList.h +++ b/Minecraft.Client/Common/UI/UIControl_ButtonList.h @@ -41,4 +41,18 @@ public: void SetTouchFocus(S32 iX, S32 iY, bool bRepeat); bool CanTouchTrigger(S32 iX, S32 iY); #endif + }; + +class UIControl_DynamicButtonList : public UIControl_ButtonList +{ +protected: + vector m_labels; + +public: + virtual void tick(); + + virtual void addItem(UIString label, int data = -1); + + virtual void removeItem(int index); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_CheckBox.cpp b/Minecraft.Client/Common/UI/UIControl_CheckBox.cpp index d3bdf758..1c3e8afe 100644 --- a/Minecraft.Client/Common/UI/UIControl_CheckBox.cpp +++ b/Minecraft.Client/Common/UI/UIControl_CheckBox.cpp @@ -21,7 +21,7 @@ bool UIControl_CheckBox::setupControl(UIScene *scene, IggyValuePath *parent, con return success; } -void UIControl_CheckBox::init(const wstring &label, int id, bool checked) +void UIControl_CheckBox::init(UIString label, int id, bool checked) { m_label = label; m_id = id; diff --git a/Minecraft.Client/Common/UI/UIControl_CheckBox.h b/Minecraft.Client/Common/UI/UIControl_CheckBox.h index 924e9c68..f8c0284b 100644 --- a/Minecraft.Client/Common/UI/UIControl_CheckBox.h +++ b/Minecraft.Client/Common/UI/UIControl_CheckBox.h @@ -14,7 +14,7 @@ public: virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); - void init(const wstring &label, int id, bool checked); + void init(UIString label, int id, bool checked); bool IsChecked(); bool IsEnabled(); diff --git a/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.cpp b/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.cpp index ef7c0e94..9664dbf4 100644 --- a/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.cpp +++ b/Minecraft.Client/Common/UI/UIControl_EnchantmentBook.cpp @@ -34,9 +34,7 @@ void UIControl_EnchantmentBook::render(IggyCustomDrawCallbackRegion *region) glTranslatef(m_width/2, m_height/2, 50.0f); // Add a uniform scale - glScalef(1/ssX, 1/ssX, 1.0f); - - glScalef(50.0f,50.0f,1.0f); + glScalef(-57/ssX, 57/ssX, 360.0f); glRotatef(45 + 90, 0, 1, 0); Lighting::turnOn(); diff --git a/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.cpp b/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.cpp index e1490e0b..37f8fcf6 100644 --- a/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.cpp +++ b/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.cpp @@ -35,6 +35,18 @@ void UIControl_EnchantmentButton::init(int index) m_index = index; } + +void UIControl_EnchantmentButton::ReInit() +{ + UIControl_Button::ReInit(); + + + m_lastState = eState_Inactive; + m_lastCost = 0; + m_bHasFocus = false; + updateState(); +} + void UIControl_EnchantmentButton::tick() { updateState(); diff --git a/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.h b/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.h index 9b8a3c8f..f7a703b3 100644 --- a/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.h +++ b/Minecraft.Client/Common/UI/UIControl_EnchantmentButton.h @@ -46,7 +46,7 @@ public: virtual void tick(); void init(int index); - + virtual void ReInit(); void render(IggyCustomDrawCallbackRegion *region); void updateState(); diff --git a/Minecraft.Client/Common/UI/UIControl_Label.cpp b/Minecraft.Client/Common/UI/UIControl_Label.cpp index 1481fea1..47374d21 100644 --- a/Minecraft.Client/Common/UI/UIControl_Label.cpp +++ b/Minecraft.Client/Common/UI/UIControl_Label.cpp @@ -5,6 +5,7 @@ UIControl_Label::UIControl_Label() { + m_reinitEnabled = true; } bool UIControl_Label::setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName) @@ -17,7 +18,7 @@ bool UIControl_Label::setupControl(UIScene *scene, IggyValuePath *parent, const return success; } -void UIControl_Label::init(const wstring &label) +void UIControl_Label::init(UIString label) { m_label = label; @@ -32,22 +33,13 @@ void UIControl_Label::init(const wstring &label) IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_initFunc , 1 , value ); } -void UIControl_Label::init(const string &label) -{ - m_label = convStringToWstring(label); - IggyDataValue result; - IggyDataValue value[1]; - value[0].type = IGGY_DATATYPE_string_UTF8; - IggyStringUTF8 stringVal; - - stringVal.string = (char *)label.c_str(); - stringVal.length = label.length(); - value[0].string8 = stringVal; - IggyResult out = IggyPlayerCallMethodRS ( m_parentScene->getMovie() , &result, getIggyValuePath() , m_initFunc , 1 , value ); -} - void UIControl_Label::ReInit() { UIControl_Base::ReInit(); - init(m_label); + + // 4J-JEV: This can't be reinitialised. + if (m_reinitEnabled) + { + init(m_label); + } } diff --git a/Minecraft.Client/Common/UI/UIControl_Label.h b/Minecraft.Client/Common/UI/UIControl_Label.h index aa0f3f14..21eb35a6 100644 --- a/Minecraft.Client/Common/UI/UIControl_Label.h +++ b/Minecraft.Client/Common/UI/UIControl_Label.h @@ -4,12 +4,16 @@ class UIControl_Label : public UIControl_Base { +private: + bool m_reinitEnabled; + public: UIControl_Label(); virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); - void init(const wstring &label); - void init(const string &label); + void init(UIString label); virtual void ReInit(); + + void disableReinitialisation() { m_reinitEnabled = false; } }; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_MinecraftHorse.cpp b/Minecraft.Client/Common/UI/UIControl_MinecraftHorse.cpp new file mode 100644 index 00000000..457e2028 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_MinecraftHorse.cpp @@ -0,0 +1,103 @@ +#include "stdafx.h" +#include "..\..\Minecraft.h" +#include "..\..\ScreenSizeCalculator.h" +#include "..\..\EntityRenderDispatcher.h" + +#include "..\..\PlayerRenderer.h" +#include "..\..\HorseRenderer.h" + +#include "..\..\HumanoidModel.h" +#include "..\..\ModelHorse.h" + +#include "..\..\Lighting.h" +#include "..\..\ModelPart.h" +#include "..\..\Options.h" + +#include "..\..\..\Minecraft.World\net.minecraft.world.entity.player.h" +//#include "..\..\..\Minecraft.World\net.minecraft.world.entity.animal.EntityHorse.h" + +#include "..\..\MultiplayerLocalPlayer.h" +#include "UI.h" +#include "UIControl_MinecraftHorse.h" + +UIControl_MinecraftHorse::UIControl_MinecraftHorse() +{ + UIControl::setControlType(UIControl::eMinecraftHorse); + + Minecraft *pMinecraft=Minecraft::GetInstance(); + + ScreenSizeCalculator ssc(pMinecraft->options, pMinecraft->width_phys, pMinecraft->height_phys); + m_fScreenWidth=(float)pMinecraft->width_phys; + m_fRawWidth=(float)ssc.rawWidth; + m_fScreenHeight=(float)pMinecraft->height_phys; + m_fRawHeight=(float)ssc.rawHeight; +} + +void UIControl_MinecraftHorse::render(IggyCustomDrawCallbackRegion *region) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + glEnable(GL_RESCALE_NORMAL); + glEnable(GL_COLOR_MATERIAL); + glPushMatrix(); + + float width = region->x1 - region->x0; + float height = region->y1 - region->y0; + float xo = width/2; + float yo = height; + + // dynamic y offset according to region height + glTranslatef(xo, yo - (height / 7.5f), 50.0f); + + //UIScene_InventoryMenu *containerMenu = (UIScene_InventoryMenu *)m_parentScene; + UIScene_HorseInventoryMenu *containerMenu = (UIScene_HorseInventoryMenu *)m_parentScene; + + shared_ptr entityHorse = containerMenu->m_horse; + + // Base scale on height of this control + // Potentially we might want separate x & y scales here + float ss = width / (m_fScreenWidth / m_fScreenHeight) * 0.71f; + + glScalef(-ss, ss, ss); + glRotatef(180, 0, 0, 1); + + float oybr = entityHorse->yBodyRot; + float oyr = entityHorse->yRot; + float oxr = entityHorse->xRot; + float oyhr = entityHorse->yHeadRot; + + //float xd = ( matrix._41 + ( (bwidth*matrix._11)/2) ) - m_pointerPos.x; + float xd = (m_x + m_width/2) - containerMenu->m_pointerPos.x; + + // Need to base Y on head position, not centre of mass + //float yd = ( matrix._42 + ( (bheight*matrix._22) / 2) - 40 ) - m_pointerPos.y; + float yd = (m_y + m_height/2 - 40) - containerMenu->m_pointerPos.y; + + glRotatef(45 + 90, 0, 1, 0); + Lighting::turnOn(); + glRotatef(-45 - 90, 0, 1, 0); + + glRotatef(-(float) atan(yd / 40.0f) * 20, 1, 0, 0); + + entityHorse->yBodyRot = (float) atan(xd / 40.0f) * 20; + entityHorse->yRot = (float) atan(xd / 40.0f) * 40; + entityHorse->xRot = -(float) atan(yd / 40.0f) * 20; + entityHorse->yHeadRot = entityHorse->yRot; + //entityHorse->glow = 1; + glTranslatef(0, entityHorse->heightOffset, 0); + EntityRenderDispatcher::instance->playerRotY = 180; + + // 4J Stu - Turning on hideGui while we do this stops the name rendering in split-screen + bool wasHidingGui = pMinecraft->options->hideGui; + pMinecraft->options->hideGui = true; + EntityRenderDispatcher::instance->render(entityHorse, 0, 0, 0, 0, 1, false, false); + pMinecraft->options->hideGui = wasHidingGui; + //entityHorse->glow = 0; + + entityHorse->yBodyRot = oybr; + entityHorse->yRot = oyr; + entityHorse->xRot = oxr; + entityHorse->yHeadRot = oyhr; + glPopMatrix(); + Lighting::turnOff(); + glDisable(GL_RESCALE_NORMAL); +} diff --git a/Minecraft.Client/Common/UI/UIControl_MinecraftHorse.h b/Minecraft.Client/Common/UI/UIControl_MinecraftHorse.h new file mode 100644 index 00000000..ec355527 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIControl_MinecraftHorse.h @@ -0,0 +1,15 @@ +#pragma once + +#include "UIControl.h" + +class UIControl_MinecraftHorse : public UIControl +{ +private: + float m_fScreenWidth,m_fScreenHeight; + float m_fRawWidth,m_fRawHeight; + +public: + UIControl_MinecraftHorse(); + + void render(IggyCustomDrawCallbackRegion *region); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIControl_MinecraftPlayer.cpp b/Minecraft.Client/Common/UI/UIControl_MinecraftPlayer.cpp index 3a18ed53..d0625bce 100644 --- a/Minecraft.Client/Common/UI/UIControl_MinecraftPlayer.cpp +++ b/Minecraft.Client/Common/UI/UIControl_MinecraftPlayer.cpp @@ -37,7 +37,8 @@ void UIControl_MinecraftPlayer::render(IggyCustomDrawCallbackRegion *region) float xo = width/2; float yo = height; - glTranslatef(xo, yo - 7.0f, 50.0f); + // dynamic y offset according to region height + glTranslatef(xo, yo - (height / 9.0f), 50.0f); float ss; diff --git a/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp b/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp index 544b4da1..2d7c0224 100644 --- a/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp +++ b/Minecraft.Client/Common/UI/UIControl_PlayerSkinPreview.cpp @@ -217,7 +217,7 @@ void UIControl_PlayerSkinPreview::render(IggyCustomDrawCallbackRegion *region) pMinecraft->options->hideGui = true; //EntityRenderDispatcher::instance->render(pMinecraft->localplayers[0], 0, 0, 0, 0, 1); - EntityRenderer *renderer = EntityRenderDispatcher::instance->getRenderer(eTYPE_PLAYER); + EntityRenderer *renderer = EntityRenderDispatcher::instance->getRenderer(eTYPE_LOCALPLAYER); if (renderer != NULL) { // 4J-PB - any additional parts to turn on for this player (skin dependent) @@ -335,7 +335,12 @@ void UIControl_PlayerSkinPreview::render(EntityRenderer *renderer, double x, dou float s = 15 / 16.0f; glScalef(s, s, s); + // 4J - TomK - pull up character a bit more to make sure extra geo around feet doesn't cause rendering problems on PSVita +#ifdef __PSVITA__ + glTranslatef(0, -24 * _scale - 1.0f / 16.0f, 0); +#else glTranslatef(0, -24 * _scale - 0.125f / 16.0f, 0); +#endif #ifdef SKIN_PREVIEW_WALKING_ANIM m_walkAnimSpeedO = m_walkAnimSpeed; diff --git a/Minecraft.Client/Common/UI/UIControl_Progress.cpp b/Minecraft.Client/Common/UI/UIControl_Progress.cpp index e2ab817d..78e7c1d0 100644 --- a/Minecraft.Client/Common/UI/UIControl_Progress.cpp +++ b/Minecraft.Client/Common/UI/UIControl_Progress.cpp @@ -23,7 +23,7 @@ bool UIControl_Progress::setupControl(UIScene *scene, IggyValuePath *parent, con return success; } -void UIControl_Progress::init(const wstring &label, int id, int min, int max, int current) +void UIControl_Progress::init(UIString label, int id, int min, int max, int current) { m_label = label; m_id = id; diff --git a/Minecraft.Client/Common/UI/UIControl_Progress.h b/Minecraft.Client/Common/UI/UIControl_Progress.h index 8398a188..10601237 100644 --- a/Minecraft.Client/Common/UI/UIControl_Progress.h +++ b/Minecraft.Client/Common/UI/UIControl_Progress.h @@ -17,7 +17,7 @@ public: virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); - void init(const wstring &label, int id, int min, int max, int current); + void init(UIString label, int id, int min, int max, int current); virtual void ReInit(); void setProgress(int current); diff --git a/Minecraft.Client/Common/UI/UIControl_Slider.cpp b/Minecraft.Client/Common/UI/UIControl_Slider.cpp index bd3b1ada..c2168002 100644 --- a/Minecraft.Client/Common/UI/UIControl_Slider.cpp +++ b/Minecraft.Client/Common/UI/UIControl_Slider.cpp @@ -22,7 +22,7 @@ bool UIControl_Slider::setupControl(UIScene *scene, IggyValuePath *parent, const return success; } -void UIControl_Slider::init(const wstring &label, int id, int min, int max, int current) +void UIControl_Slider::init(UIString label, int id, int min, int max, int current) { m_label = label; m_id = id; @@ -104,6 +104,7 @@ S32 UIControl_Slider::GetRealWidth() void UIControl_Slider::setAllPossibleLabels(int labelCount, wchar_t labels[][256]) { + m_allPossibleLabels.clear(); for(unsigned int i = 0; i < labelCount; ++i) { m_allPossibleLabels.push_back(labels[i]); diff --git a/Minecraft.Client/Common/UI/UIControl_Slider.h b/Minecraft.Client/Common/UI/UIControl_Slider.h index 0b57c2f1..505f6dd2 100644 --- a/Minecraft.Client/Common/UI/UIControl_Slider.h +++ b/Minecraft.Client/Common/UI/UIControl_Slider.h @@ -21,7 +21,7 @@ public: virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); - void init(const wstring &label, int id, int min, int max, int current); + void init(UIString label, int id, int min, int max, int current); void handleSliderMove(int newValue); void SetSliderTouchPos(float fTouchPos); diff --git a/Minecraft.Client/Common/UI/UIControl_SlotList.cpp b/Minecraft.Client/Common/UI/UIControl_SlotList.cpp index e2130431..01d7b9e5 100644 --- a/Minecraft.Client/Common/UI/UIControl_SlotList.cpp +++ b/Minecraft.Client/Common/UI/UIControl_SlotList.cpp @@ -22,6 +22,13 @@ bool UIControl_SlotList::setupControl(UIScene *scene, IggyValuePath *parent, con return success; } +void UIControl_SlotList::ReInit() +{ + UIControl_Base::ReInit(); + + m_lastHighlighted = -1; +} + void UIControl_SlotList::addSlot(int id) { IggyDataValue result; diff --git a/Minecraft.Client/Common/UI/UIControl_SlotList.h b/Minecraft.Client/Common/UI/UIControl_SlotList.h index ee741c4d..5bc1dc9a 100644 --- a/Minecraft.Client/Common/UI/UIControl_SlotList.h +++ b/Minecraft.Client/Common/UI/UIControl_SlotList.h @@ -14,6 +14,8 @@ public: UIControl_SlotList(); virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); + + virtual void ReInit(); void addSlot(int id); void addSlots(int iStartValue, int iCount); diff --git a/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.cpp b/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.cpp index dfdea93e..74683a62 100644 --- a/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.cpp +++ b/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.cpp @@ -24,7 +24,7 @@ bool UIControl_SpaceIndicatorBar::setupControl(UIScene *scene, IggyValuePath *pa return success; } -void UIControl_SpaceIndicatorBar::init(const wstring &label, int id, __int64 min, __int64 max) +void UIControl_SpaceIndicatorBar::init(UIString label, int id, __int64 min, __int64 max) { m_label = label; m_id = id; diff --git a/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.h b/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.h index 39f9a746..8eed3944 100644 --- a/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.h +++ b/Minecraft.Client/Common/UI/UIControl_SpaceIndicatorBar.h @@ -18,7 +18,7 @@ public: virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); - void init(const wstring &label, int id, __int64 min, __int64 max); + void init(UIString label, int id, __int64 min, __int64 max); virtual void ReInit(); void reset(); diff --git a/Minecraft.Client/Common/UI/UIControl_TextInput.cpp b/Minecraft.Client/Common/UI/UIControl_TextInput.cpp index 4cb78d50..dc7bc532 100644 --- a/Minecraft.Client/Common/UI/UIControl_TextInput.cpp +++ b/Minecraft.Client/Common/UI/UIControl_TextInput.cpp @@ -20,7 +20,7 @@ bool UIControl_TextInput::setupControl(UIScene *scene, IggyValuePath *parent, co return success; } -void UIControl_TextInput::init(const wstring &label, int id) +void UIControl_TextInput::init(UIString label, int id) { m_label = label; m_id = id; diff --git a/Minecraft.Client/Common/UI/UIControl_TextInput.h b/Minecraft.Client/Common/UI/UIControl_TextInput.h index d4023884..98032d85 100644 --- a/Minecraft.Client/Common/UI/UIControl_TextInput.h +++ b/Minecraft.Client/Common/UI/UIControl_TextInput.h @@ -13,7 +13,7 @@ public: virtual bool setupControl(UIScene *scene, IggyValuePath *parent, const string &controlName); - void init(const wstring &label, int id); + void init(UIString label, int id); void ReInit(); virtual void setFocus(bool focus); diff --git a/Minecraft.Client/Common/UI/UIController.cpp b/Minecraft.Client/Common/UI/UIController.cpp index 87c495d2..8b38bbb3 100644 --- a/Minecraft.Client/Common/UI/UIController.cpp +++ b/Minecraft.Client/Common/UI/UIController.cpp @@ -163,11 +163,17 @@ UIController::UIController() { m_uiDebugConsole = NULL; m_reloadSkinThread = NULL; + m_navigateToHomeOnReload = false; - m_mcTTFFont= NULL; + + m_bCleanupOnReload = false; + m_mcTTFFont = NULL; m_moj7 = NULL; m_moj11 = NULL; + // 4J-JEV: It's important that these remain the same, unless updateCurrentLanguage is going to be called. + m_eCurrentFont = m_eTargetFont = eFont_NotLoaded; + #ifdef ENABLE_IGGY_ALLOCATOR InitializeCriticalSection(&m_Allocatorlock); #endif @@ -211,6 +217,7 @@ UIController::UIController() m_bCustomRenderPosition = false; m_winUserIndex = 0; m_accumulatedTicks = 0; + m_lastUiSfx = 0; InitializeCriticalSection(&m_navigationLock); InitializeCriticalSection(&m_registeredCallbackScenesCS); @@ -303,79 +310,149 @@ void UIController::postInit() NavigateToScene(0, eUIScene_Intro); } -void UIController::SetupFont() -{ - bool bBitmapFont=false; - if(m_mcTTFFont!=NULL) +UIController::EFont UIController::getFontForLanguage(int language) { - delete m_mcTTFFont; + switch(language) + { + case XC_LANGUAGE_JAPANESE: return eFont_Japanese; +#ifdef _DURANGO + case XC_LANGUAGE_SCHINESE: return eFont_SimpChinese; +#endif + case XC_LANGUAGE_TCHINESE: return eFont_TradChinese; + case XC_LANGUAGE_KOREAN: return eFont_Korean; + default: return eFont_Bitmap; } +} - switch(XGetLanguage()) +UITTFFont *UIController::createFont(EFont fontLanguage) + { + switch(fontLanguage) { #if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) - case XC_LANGUAGE_JAPANESE: - m_mcTTFFont = new UITTFFont("Common/Media/font/JPN/DF-DotDotGothic16.ttf", 0x203B); // JPN - break; - case XC_LANGUAGE_SCHINESE: //TODO - case XC_LANGUAGE_TCHINESE: - m_mcTTFFont = new UITTFFont("Common/Media/font/CHT/DFTT_R5.TTC", 0x203B); // CHT - break; - case XC_LANGUAGE_KOREAN: - m_mcTTFFont = new UITTFFont("Common/Media/font/KOR/candadite2.ttf", 0x203B); // KOR - break; - // 4J-JEV, Cyrillic characters have been added to this font now, (4/July/14) - //case XC_LANGUAGE_RUSSIAN: - //case XC_LANGUAGE_GREEK: + case eFont_Japanese: return new UITTFFont("Mojangles_TTF_jaJP", "Common/Media/font/JPN/DF-DotDotGothic16.ttf", 0x203B); // JPN + // case eFont_SimpChinese: Simplified Chinese is unsupported. + case eFont_TradChinese: return new UITTFFont("Mojangles_TTF_cnTD", "Common/Media/font/CHT/DFTT_R5.TTC", 0x203B); // CHT + case eFont_Korean: return new UITTFFont("Mojangles_TTF_koKR", "Common/Media/font/KOR/candadite2.ttf", 0x203B); // KOR #else - case XC_LANGUAGE_JAPANESE: - m_mcTTFFont = new UITTFFont("Common/Media/font/JPN/DFGMaruGothic-Md.ttf", 0x2022); // JPN - break; - case XC_LANGUAGE_SCHINESE: //TODO - case XC_LANGUAGE_TCHINESE: - m_mcTTFFont = new UITTFFont("Common/Media/font/CHT/DFHeiMedium-B5.ttf", 0x2022); // CHT - break; - case XC_LANGUAGE_KOREAN: - m_mcTTFFont = new UITTFFont("Common/Media/font/KOR/BOKMSD.ttf", 0x2022); // KOR - break; + case eFont_Japanese: return new UITTFFont("Mojangles_TTF_jaJP", "Common/Media/font/JPN/DFGMaruGothic-Md.ttf", 0x2022); // JPN +#ifdef _DURANGO + case eFont_SimpChinese: return new UITTFFont("Mojangled_TTF_cnCN", "Common/Media/font/CHS/MSYH.ttf", 0x2022); // CHS #endif - default: - bBitmapFont=true; - // m_mcTTFFont = new UITTFFont("Common/Media/font/Mojangles.ttf", 0x2022); // 4J-JEV: Shouldn't be using this. - break; + case eFont_TradChinese: return new UITTFFont("Mojangles_TTF_cnTD", "Common/Media/font/CHT/DFHeiMedium-B5.ttf", 0x2022); // CHT + case eFont_Korean: return new UITTFFont("Mojangles_TTF_koKR", "Common/Media/font/KOR/BOKMSD.ttf", 0x2022); // KOR +#endif + // 4J-JEV, Cyrillic characters have been added to this font now, (4/July/14) + // XC_LANGUAGE_RUSSIAN and XC_LANGUAGE_GREEK: + default: return NULL; + } +} + +void UIController::SetupFont() +{ + // 4J-JEV: Language hasn't changed or is already changing. + if ( (m_eCurrentFont != m_eTargetFont) || !UIString::setCurrentLanguage() ) return; + + DWORD nextLanguage = UIString::getCurrentLanguage(); + m_eTargetFont = getFontForLanguage(nextLanguage); + + // flag a language change to reload the string tables in the DLC + app.m_dlcManager.LanguageChanged(); + + app.loadStringTable(); // Switch to use new string table, + + if (m_eTargetFont == m_eCurrentFont) + { + // 4J-JEV: If we're ingame, reload the font to update all the text. + if (app.GetGameStarted()) app.SetAction(ProfileManager.GetPrimaryPad(), eAppAction_ReloadFont); + return; } - if(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();) @@ -562,11 +636,12 @@ void UIController::ReloadSkin() // 4J Stu - Don't load on a thread on windows. I haven't investigated this in detail, so a quick fix reloadSkinThreadProc(this); #else - // Navigate to the timer scene so that we can display something while the loading is happening - ui.NavigateToScene(0,eUIScene_Timer,(void *)1,eUILayer_Tooltips,eUIGroup_Fullscreen); m_reloadSkinThread = new C4JThread(reloadSkinThreadProc, (void*)this, "Reload skin thread"); m_reloadSkinThread->SetProcessor(CPU_CORE_UI_SCENE); + + // Navigate to the timer scene so that we can display something while the loading is happening + ui.NavigateToScene(0,eUIScene_Timer,(void *)1,eUILayer_Tooltips,eUIGroup_Fullscreen); //m_reloadSkinThread->Run(); //// Load new skin @@ -620,7 +695,7 @@ bool UIController::IsReloadingSkin() bool UIController::IsExpectingOrReloadingSkin() { - return Minecraft::GetInstance()->skins->getSelected()->isLoadingData() || Minecraft::GetInstance()->skins->needsUIUpdate() || IsReloadingSkin(); + return Minecraft::GetInstance()->skins->getSelected()->isLoadingData() || Minecraft::GetInstance()->skins->needsUIUpdate() || IsReloadingSkin() || PendingFontChange(); } void UIController::CleanUpSkinReload() @@ -1431,6 +1506,15 @@ void UIController::unregisterSubstitutionTexture(const wstring &textureName, boo // NAVIGATION bool UIController::NavigateToScene(int iPad, EUIScene scene, void *initData, EUILayer layer, EUIGroup group) { + static bool bSeenUpdateTextThisSession = false; + // If you're navigating to the multigamejoinload, and the player hasn't seen the updates message yet, display it now + // display this message the first 3 times + if((scene==eUIScene_LoadOrJoinMenu) && (bSeenUpdateTextThisSession==false) && ( app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_DisplayUpdateMessage)!=0)) + { + scene=eUIScene_NewUpdateMessage; + bSeenUpdateTextThisSession=true; + } + // if you're trying to navigate to the inventory,the crafting, pause or game info or any of the trigger scenes and there's already a menu up (because you were pressing a few buttons at the same time) then ignore the navigate if(GetMenuDisplayed(iPad)) { @@ -1451,6 +1535,8 @@ bool UIController::NavigateToScene(int iPad, EUIScene scene, void *initData, EUI case eUIScene_BrewingStandMenu: case eUIScene_AnvilMenu: case eUIScene_TradingMenu: + case eUIScene_BeaconMenu: + case eUIScene_HorseMenu: app.DebugPrintf("IGNORING NAVIGATE - we're trying to navigate to a user selected scene when there's already a scene up: pad:%d, scene:%d\n", iPad, scene); return false; break; @@ -1941,7 +2027,7 @@ void UIController::ShowTooltip( unsigned int iPad, unsigned int tooltip, bool sh if(m_groups[(int)group]->getTooltips()) m_groups[(int)group]->getTooltips()->ShowTooltip(tooltip,show); } -void UIController::SetTooltips( unsigned int iPad, int iA, int iB, int iX, int iY, int iLT, int iRT, int iLB, int iRB, int iLS, bool forceUpdate) +void UIController::SetTooltips( unsigned int iPad, int iA, int iB, int iX, int iY, int iLT, int iRT, int iLB, int iRB, int iLS, int iRS, int iBack, bool forceUpdate) { EUIGroup group; @@ -1967,7 +2053,7 @@ void UIController::SetTooltips( unsigned int iPad, int iA, int iB, int iX, int i { group = eUIGroup_Fullscreen; } - if(m_groups[(int)group]->getTooltips()) m_groups[(int)group]->getTooltips()->SetTooltips(iA, iB, iX, iY, iLT, iRT, iLB, iRB, iLS, forceUpdate); + if(m_groups[(int)group]->getTooltips()) m_groups[(int)group]->getTooltips()->SetTooltips(iA, iB, iX, iY, iLT, iRT, iLB, iRB, iLS, iRS, iBack, forceUpdate); } void UIController::EnableTooltip( unsigned int iPad, unsigned int tooltip, bool enable ) @@ -2033,6 +2119,13 @@ void UIController::OverrideSFX(int iPad, int iAction,bool bVal) void UIController::PlayUISFX(ESoundEffect eSound) { + __uint64 time = System::currentTimeMillis(); + + // Don't play multiple SFX on the same tick + // (prevents horrible sounds when programmatically setting multiple checkboxes) + if (time - m_lastUiSfx < 10) { return; } + m_lastUiSfx = time; + Minecraft::GetInstance()->soundEngine->playUI(eSound,1.0f,1.0f); } @@ -2118,7 +2211,13 @@ void UIController::HandleTMSBanFileRetrieved(int iPad) void UIController::HandleInventoryUpdated(int iPad) { - app.DebugPrintf(app.USER_SR, "UIController::HandleInventoryUpdated not implemented\n"); + EUIGroup group = eUIGroup_Fullscreen; + if( app.GetGameStarted() && ( iPad != 255 ) && ( iPad >= 0 ) ) + { + group = (EUIGroup)(iPad+1); + } + + m_groups[group]->HandleMessage(eUIMessage_InventoryUpdated, NULL); } void UIController::HandleGameTick() @@ -2173,16 +2272,8 @@ void UIController::SetTutorialDescription(int iPad, TutorialPopupInfo *info) void UIController::RemoveInteractSceneReference(int iPad, UIScene *scene) { EUIGroup group; - if( app.GetGameStarted() ) - { - // If the game isn't running treat as user 0, otherwise map index directly from pad - if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); - else group = eUIGroup_Fullscreen; - } - else - { - group = eUIGroup_Fullscreen; - } + if( ( iPad != 255 ) && ( iPad >= 0 ) ) group = (EUIGroup)(iPad+1); + else group = eUIGroup_Fullscreen; if(m_groups[(int)group]->getTutorialPopup()) m_groups[(int)group]->getTutorialPopup()->RemoveInteractSceneReference(scene); } #endif @@ -2438,14 +2529,19 @@ void UIController::ClearPressStart() m_iPressStartQuadrantsMask = 0; } -// 4J Stu - For the different StringTable classes. Should really fix the libraries. -#ifndef __PS3__ +C4JStorage::EMessageResult UIController::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 +2549,7 @@ C4JStorage::EMessageResult UIController::RequestMessageBox(UINT uiTitle, UINT ui param.uiOptionA = uiOptionA; param.uiOptionC = uiOptionC; param.dwPad = dwPad; - param.Func = Func;\ + param.Func = Func; param.lpParam = lpParam; param.pwchFormatString = pwchFormatString; param.dwFocusButton = dwFocusButton; @@ -2512,11 +2608,11 @@ C4JStorage::EMessageResult UIController::RequestUGCMessageBox(UINT title/* = -1 ProfileManager.ShowSystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION, iPad ); UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - return ui.RequestMessageBox( title, IDS_CHAT_RESTRICTION_UGC, uiIDA, 1, iPad, Func, lpParam, app.GetStringTable(), NULL, 0, false); + return ui.RequestAlertMessage( title, IDS_CHAT_RESTRICTION_UGC, uiIDA, 1, iPad, Func, lpParam); #else UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - return ui.RequestMessageBox( title, message, uiIDA, 1, iPad, Func, lpParam, app.GetStringTable(), NULL, 0, false); + return ui.RequestAlertMessage( title, message, uiIDA, 1, iPad, Func, lpParam); #endif } @@ -2551,7 +2647,7 @@ C4JStorage::EMessageResult UIController::RequestContentRestrictedMessageBox(UINT #else UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - return ui.RequestMessageBox( title, message, uiIDA, 1, iPad, Func, lpParam, app.GetStringTable(), NULL, 0, false); + return ui.RequestAlertMessage( title, message, uiIDA, 1, iPad, Func, lpParam); #endif } @@ -2705,10 +2801,13 @@ void UIController::TouchBoxRebuild(UIScene *pUIScene) control->getControlType() == UIControl::eLeaderboardList || control->getControlType() == UIControl::eTouchControl) { - // 4J-TomK update the control (it might have been moved by flash / AS) - control->UpdateControl(); + if(control->getVisible()) + { + // 4J-TomK update the control (it might have been moved by flash / AS) + control->UpdateControl(); - ui.TouchBoxAdd(control,eUIGroup,eUILayer,eUIscene, pUIScene->GetMainPanel()); + ui.TouchBoxAdd(control,eUIGroup,eUILayer,eUIscene, pUIScene->GetMainPanel()); + } } } } @@ -2960,7 +3059,8 @@ void UIController::HandleTouchInput(unsigned int iPad, unsigned int key, bool bP if(m_HighlightedUIElement && m_ActiveUIElement->pControl == m_HighlightedUIElement->pControl) { UIControl_CheckBox *pCheckbox=(UIControl_CheckBox *)m_ActiveUIElement->pControl; - pCheckbox->TouchSetCheckbox(!pCheckbox->IsChecked()); + if(pCheckbox->IsEnabled()) // only proceed if checkbox is enabled! + pCheckbox->TouchSetCheckbox(!pCheckbox->IsChecked()); } bReleased = false; break; diff --git a/Minecraft.Client/Common/UI/UIController.h b/Minecraft.Client/Common/UI/UIController.h index ef064f80..49c78032 100644 --- a/Minecraft.Client/Common/UI/UIController.h +++ b/Minecraft.Client/Common/UI/UIController.h @@ -38,10 +38,37 @@ private: S32 m_tileOriginX, m_tileOriginY; + enum EFont + { + eFont_NotLoaded = 0, + + eFont_Bitmap, + eFont_Japanese, + eFont_SimpChinese, + eFont_TradChinese, + eFont_Korean, + + }; + + // 4J-JEV: It's important that currentFont == targetFont, unless updateCurrentLanguage is going to be called. + EFont m_eCurrentFont, m_eTargetFont; + + // 4J-JEV: Behaves like navigateToHome when not ingame. When in-game, it closes all player scenes instead. + bool m_bCleanupOnReload; + + EFont getFontForLanguage(int language); + UITTFFont *createFont(EFont fontLanguage); + UIAbstractBitmapFont *m_mcBitmapFont; UITTFFont *m_mcTTFFont; UIBitmapFont *m_moj7, *m_moj11; +public: + void setCleanupOnReload(); + void updateCurrentFont(); + + +private: // 4J-PB - ui element type for PSVita touch control #ifdef __PSVITA__ @@ -136,6 +163,7 @@ private: C4JThread *m_reloadSkinThread; bool m_navigateToHomeOnReload; int m_accumulatedTicks; + __uint64 m_lastUiSfx; // Tracks time (ms) of last UI sound effect D3D11_RECT m_customRenderingClearRect; @@ -182,6 +210,9 @@ protected: public: CRITICAL_SECTION m_Allocatorlock; void SetupFont(); + bool PendingFontChange(); + bool UsingBitmapFont(); + public: // TICKING virtual void tick(); @@ -295,7 +326,7 @@ public: virtual void SetTooltipText( unsigned int iPad, unsigned int tooltip, int iTextID ); virtual void SetEnableTooltips( unsigned int iPad, BOOL bVal ); virtual void ShowTooltip( unsigned int iPad, unsigned int tooltip, bool show ); - virtual void SetTooltips( unsigned int iPad, int iA, int iB=-1, int iX=-1, int iY=-1 , int iLT=-1, int iRT=-1, int iLB=-1, int iRB=-1, int iLS=-1, bool forceUpdate = false); + virtual void SetTooltips( unsigned int iPad, int iA, int iB=-1, int iX=-1, int iY=-1 , int iLT=-1, int iRT=-1, int iLB=-1, int iRB=-1, int iLS=-1, int iRS=-1, int iBack=-1, bool forceUpdate = false); virtual void EnableTooltip( unsigned int iPad, unsigned int tooltip, bool enable ); virtual void RefreshTooltips(unsigned int iPad); @@ -341,15 +372,12 @@ public: virtual void HidePressStart(); void ClearPressStart(); - // 4J Stu - Only because of the different StringTable type, should really fix the libraries -#ifndef __PS3__ - virtual C4JStorage::EMessageResult RequestMessageBox(UINT uiTitle, UINT uiText, UINT *uiOptionA,UINT uiOptionC, DWORD dwPad=XUSER_INDEX_ANY, - int( *Func)(LPVOID,int,const C4JStorage::EMessageResult)=NULL,LPVOID lpParam=NULL, C4JStringTable *pStringTable=NULL, WCHAR *pwchFormatString=NULL,DWORD dwFocusButton=0, bool bIsError = true); -#else - virtual C4JStorage::EMessageResult RequestMessageBox(UINT uiTitle, UINT uiText, UINT *uiOptionA,UINT uiOptionC, DWORD dwPad=XUSER_INDEX_ANY, - int( *Func)(LPVOID,int,const C4JStorage::EMessageResult)=NULL,LPVOID lpParam=NULL, StringTable *pStringTable=NULL, WCHAR *pwchFormatString=NULL,DWORD dwFocusButton=0, bool bIsError = true); -#endif + virtual C4JStorage::EMessageResult RequestAlertMessage(UINT uiTitle, UINT uiText, UINT *uiOptionA,UINT uiOptionC, DWORD dwPad=XUSER_INDEX_ANY, int( *Func)(LPVOID,int,const C4JStorage::EMessageResult)=NULL,LPVOID lpParam=NULL, WCHAR *pwchFormatString=NULL); + virtual C4JStorage::EMessageResult RequestErrorMessage(UINT uiTitle, UINT uiText, UINT *uiOptionA,UINT uiOptionC, DWORD dwPad=XUSER_INDEX_ANY, int( *Func)(LPVOID,int,const C4JStorage::EMessageResult)=NULL,LPVOID lpParam=NULL, WCHAR *pwchFormatString=NULL); +private: + virtual C4JStorage::EMessageResult RequestMessageBox(UINT uiTitle, UINT uiText, UINT *uiOptionA,UINT uiOptionC, DWORD dwPad,int( *Func)(LPVOID,int,const C4JStorage::EMessageResult),LPVOID lpParam, WCHAR *pwchFormatString,DWORD dwFocusButton, bool bIsError); +public: C4JStorage::EMessageResult RequestUGCMessageBox(UINT title = -1, UINT message = -1, int iPad = -1, int( *Func)(LPVOID,int,const C4JStorage::EMessageResult) = NULL, LPVOID lpParam = NULL); C4JStorage::EMessageResult RequestContentRestrictedMessageBox(UINT title = -1, UINT message = -1, int iPad = -1, int( *Func)(LPVOID,int,const C4JStorage::EMessageResult) = NULL, LPVOID lpParam = NULL); diff --git a/Minecraft.Client/Common/UI/UIEnums.h b/Minecraft.Client/Common/UI/UIEnums.h index c68b6740..45aff87d 100644 --- a/Minecraft.Client/Common/UI/UIEnums.h +++ b/Minecraft.Client/Common/UI/UIEnums.h @@ -54,7 +54,7 @@ enum EUIScene eUIScene_DebugOptions, eUIScene_DebugTips, eUIScene_HelpAndOptionsMenu, - eUIScene_HowToPlay, + eUIScene_HowToPlay, eUIScene_HowToPlayMenu, eUIScene_ControlsMenu, eUIScene_SettingsOptionsMenu, @@ -94,13 +94,23 @@ enum EUIScene eUIScene_TradingMenu, eUIScene_AnvilMenu, eUIScene_TeleportMenu, + eUIScene_HopperMenu, + eUIScene_BeaconMenu, + eUIScene_HorseMenu, + eUIScene_FireworksMenu, #ifdef _XBOX // eUIScene_TransferToXboxOne, #endif + // **************************************** + // **************************************** + // ********** IMPORTANT ****************** + // **************************************** + // **************************************** // When adding new scenes here, you must also update the switches in CConsoleMinecraftApp::NavigateToScene // There are quite a few so you need to check them all + // Also update UILayer::updateFocusState #ifndef _XBOX // Anything non-xbox should be added here. The ordering of scenes above is required for sentient reporting on xbox 360 to continue to be accurate @@ -117,6 +127,7 @@ enum EUIScene eUIScene_Timer, eUIScene_EULA, eUIScene_InGameSaveManagementMenu, + eUIScene_LanguageSelector, #endif // ndef _XBOX #ifdef _DEBUG_MENUS_ENABLED @@ -154,6 +165,8 @@ enum EToolTipButton eToolTipButtonLB, eToolTipButtonRB, eToolTipButtonLS, + eToolTipButtonRS, + eToolTipButtonBack, eToolTipNumButtons }; @@ -209,6 +222,12 @@ enum EHowToPlayPage eHowToPlay_Breeding, eHowToPlay_Trading, + eHowToPlay_Horses, + eHowToPlay_Beacons, + eHowToPlay_Fireworks, + eHowToPlay_Hoppers, + eHowToPlay_Droppers, + eHowToPlay_NetherPortal, eHowToPlay_TheEnd, #ifdef _XBOX @@ -229,6 +248,13 @@ enum ECreditTextTypes eNumTextTypes }; +enum EUIMessage +{ + eUIMessage_InventoryUpdated, + + eUIMessage_COUNT, +}; + #define NO_TRANSLATED_STRING ( -1 ) // String ID used to indicate that we are using non localised string. #define CONNECTING_PROGRESS_CHECK_TIME 500 diff --git a/Minecraft.Client/Common/UI/UIGroup.cpp b/Minecraft.Client/Common/UI/UIGroup.cpp index 1899d05b..e8bb9fe6 100644 --- a/Minecraft.Client/Common/UI/UIGroup.cpp +++ b/Minecraft.Client/Common/UI/UIGroup.cpp @@ -13,6 +13,8 @@ UIGroup::UIGroup(EUIGroup group, int iPad) m_updateFocusStateCountdown = 0; + m_viewportType = C4JRender::VIEWPORT_TYPE_FULLSCREEN; + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) { m_layers[i] = new UILayer(this); @@ -39,8 +41,6 @@ UIGroup::UIGroup(EUIGroup group, int iPad) m_pressStartToPlay = (UIComponent_PressStartToPlay *)m_layers[(int)eUILayer_Tooltips]->addComponent(0, eUIComponent_PressStartToPlay); } - m_viewportType = C4JRender::VIEWPORT_TYPE_FULLSCREEN; - // 4J Stu - Pre-allocate this for cached rendering in scenes. It's horribly slow to do dynamically, but we should only need one // per group as we will only be displaying one of these types of scenes at a time m_commandBufferList = MemoryTracker::genLists(1); @@ -318,6 +318,16 @@ void UIGroup::HandleDLCLicenseChange() } #endif +void UIGroup::HandleMessage(EUIMessage message, void *data) +{ + // Ignore this group if the player isn't signed in + if(m_iPad >= 0 && !ProfileManager.IsSignedIn(m_iPad)) return; + for(unsigned int i = 0; i < eUILayer_COUNT; ++i) + { + m_layers[i]->HandleMessage(message, data); + } +} + bool UIGroup::IsFullscreenGroup() { return m_group == eUIGroup_Fullscreen; diff --git a/Minecraft.Client/Common/UI/UIGroup.h b/Minecraft.Client/Common/UI/UIGroup.h index e20fbb02..0ffee0ca 100644 --- a/Minecraft.Client/Common/UI/UIGroup.h +++ b/Minecraft.Client/Common/UI/UIGroup.h @@ -96,6 +96,8 @@ public: #ifdef _XBOX_ONE virtual void HandleDLCLicenseChange(); #endif + virtual void HandleMessage(EUIMessage message, void *data); + bool IsFullscreenGroup(); void handleUnlockFullVersion(); diff --git a/Minecraft.Client/Common/UI/UILayer.cpp b/Minecraft.Client/Common/UI/UILayer.cpp index 15bde2fa..13b26c84 100644 --- a/Minecraft.Client/Common/UI/UILayer.cpp +++ b/Minecraft.Client/Common/UI/UILayer.cpp @@ -189,7 +189,7 @@ void UILayer::ReloadAll(bool force) int lowestRenderable = 0; for(;lowestRenderable < m_sceneStack.size(); ++lowestRenderable) { - m_sceneStack[lowestRenderable]->reloadMovie(); + m_sceneStack[lowestRenderable]->reloadMovie(force); } } } @@ -253,6 +253,18 @@ bool UILayer::NavigateToScene(int iPad, EUIScene scene, void *initData) case eUIScene_AnvilMenu: newScene = new UIScene_AnvilMenu(iPad, initData, this); break; + case eUIScene_HopperMenu: + newScene = new UIScene_HopperMenu(iPad, initData, this); + break; + case eUIScene_BeaconMenu: + newScene = new UIScene_BeaconMenu(iPad, initData, this); + break; + case eUIScene_HorseMenu: + newScene = new UIScene_HorseInventoryMenu(iPad, initData, this); + break; + case eUIScene_FireworksMenu: + newScene = new UIScene_FireworksMenu(iPad, initData, this); + break; // Help and Options case eUIScene_HelpAndOptionsMenu: @@ -282,6 +294,9 @@ bool UILayer::NavigateToScene(int iPad, EUIScene scene, void *initData) case eUIScene_HowToPlayMenu: newScene = new UIScene_HowToPlayMenu(iPad, initData, this); break; + case eUIScene_LanguageSelector: + newScene = new UIScene_LanguageSelector(iPad, initData, this); + break; case eUIScene_HowToPlay: newScene = new UIScene_HowToPlay(iPad, initData, this); break; @@ -386,6 +401,9 @@ bool UILayer::NavigateToScene(int iPad, EUIScene scene, void *initData) case eUIScene_EULA: newScene = new UIScene_EULA(iPad, initData, this); break; + case eUIScene_NewUpdateMessage: + newScene = new UIScene_NewUpdateMessage(iPad, initData, this); + break; // Other case eUIScene_Keyboard: @@ -700,6 +718,12 @@ bool UILayer::updateFocusState(bool allowedFocus /* = false */) m_scenesToDestroy.push_back(scene); #endif } + + if (scene->getSceneType() == eUIScene_SettingsOptionsMenu) + { + scene->loseFocus(); + m_scenesToDestroy.push_back(scene); + } } /// UPDATE STACK STATES @@ -723,6 +747,12 @@ bool UILayer::updateFocusState(bool allowedFocus /* = false */) case eUIScene_DispenserMenu: case eUIScene_BrewingStandMenu: case eUIScene_EnchantingMenu: + case eUIScene_TradingMenu: + case eUIScene_HopperMenu: + case eUIScene_HorseMenu: + case eUIScene_FireworksMenu: + case eUIScene_BeaconMenu: + case eUIScene_AnvilMenu: m_bContainerMenuDisplayed=true; // Intentional fall-through @@ -786,7 +816,7 @@ void UILayer::handleInput(int iPad, int key, bool repeat, bool pressed, bool rel } // Fix for PS3 #444 - [IN GAME] If the user keeps pressing CROSS while on the 'Save Game' screen the title will crash. - handled = handled || scene->hidesLowerScenes(); + handled = handled || scene->hidesLowerScenes() || scene->blocksInput(); if(handled ) break; } @@ -823,6 +853,15 @@ void UILayer::HandleDLCLicenseChange() } #endif +void UILayer::HandleMessage(EUIMessage message, void *data) +{ + for(AUTO_VAR(it,m_sceneStack.rbegin()); it != m_sceneStack.rend(); ++it) + { + UIScene *topScene = *it; + topScene->HandleMessage(message, data); + } +} + bool UILayer::IsFullscreenGroup() { return m_parentGroup->IsFullscreenGroup(); diff --git a/Minecraft.Client/Common/UI/UILayer.h b/Minecraft.Client/Common/UI/UILayer.h index 2840f23f..47c776ab 100644 --- a/Minecraft.Client/Common/UI/UILayer.h +++ b/Minecraft.Client/Common/UI/UILayer.h @@ -83,6 +83,8 @@ public: #ifdef _XBOX_ONE virtual void HandleDLCLicenseChange(); #endif + virtual void HandleMessage(EUIMessage message, void *data); + void handleUnlockFullVersion(); UIScene *FindScene(EUIScene sceneType); diff --git a/Minecraft.Client/Common/UI/UIScene.cpp b/Minecraft.Client/Common/UI/UIScene.cpp index e7d907ec..ba253643 100644 --- a/Minecraft.Client/Common/UI/UIScene.cpp +++ b/Minecraft.Client/Common/UI/UIScene.cpp @@ -93,6 +93,7 @@ void UIScene::reloadMovie(bool force) (*it)->ReInit(); } + updateComponents(); handleReload(); IggyDataValue result; @@ -740,6 +741,9 @@ void UIScene::_customDrawSlotControl(CustomDrawData *region, int iPad, shared_pt PIXBeginNamedEvent(0,"Render and decorate"); if(m_pItemRenderer == NULL) m_pItemRenderer = new ItemRenderer(); + RenderManager.StateSetBlendEnable(true); + RenderManager.StateSetBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + RenderManager.StateSetBlendFactor(0xffffffff); m_pItemRenderer->renderAndDecorateItem(pMinecraft->font, pMinecraft->textures, item, x, y,scaleX,scaleY,fAlpha,isFoil,false, !usingCommandBuffer); PIXEndNamedEvent(); @@ -827,7 +831,7 @@ void UIScene::gainFocus() app.DebugPrintf("Sent gain focus event to scene\n"); */ bHasFocus = true; - if(app.GetGameStarted() && needsReloaded()) + if(needsReloaded()) { reloadMovie(); } @@ -882,7 +886,8 @@ void UIScene::handleGainFocus(bool navBack) void UIScene::updateTooltips() { - ui.SetTooltips(m_iPad, -1); + if(!ui.IsReloadingSkin()) + ui.SetTooltips(m_iPad, -1); } void UIScene::sendInputToMovie(int key, bool repeat, bool pressed, bool released) @@ -906,6 +911,7 @@ void UIScene::sendInputToMovie(int key, bool repeat, bool pressed, bool released int UIScene::convertGameActionToIggyKeycode(int action) { + // TODO: This action to key mapping should probably use the control mapping int keycode = -1; switch(action) { @@ -946,7 +952,16 @@ int UIScene::convertGameActionToIggyKeycode(int action) keycode = IGGY_KEYCODE_PAGE_UP; break; case ACTION_MENU_PAGEDOWN: - keycode = IGGY_KEYCODE_PAGE_DOWN; +#ifdef __PSVITA__ + if (!InputManager.IsVitaTV()) + { + keycode = IGGY_KEYCODE_F6; + } + else +#endif + { + keycode = IGGY_KEYCODE_PAGE_DOWN; + } break; case ACTION_MENU_RIGHT_SCROLL: keycode = IGGY_KEYCODE_F3; @@ -957,6 +972,7 @@ int UIScene::convertGameActionToIggyKeycode(int action) case ACTION_MENU_STICK_PRESS: break; case ACTION_MENU_OTHER_STICK_PRESS: + keycode = IGGY_KEYCODE_F5; break; case ACTION_MENU_OTHER_STICK_UP: keycode = IGGY_KEYCODE_F11; @@ -1233,6 +1249,10 @@ void UIScene::UpdateSceneControls() } #endif +void UIScene::HandleMessage(EUIMessage message, void *data) +{ +} + size_t UIScene::GetCallbackUniqueId() { if( m_callbackUniqueId == 0) diff --git a/Minecraft.Client/Common/UI/UIScene.h b/Minecraft.Client/Common/UI/UIScene.h index 823c510c..8c20aaae 100644 --- a/Minecraft.Client/Common/UI/UIScene.h +++ b/Minecraft.Client/Common/UI/UIScene.h @@ -169,6 +169,9 @@ public: // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden virtual bool hidesLowerScenes() { return m_hasTickedOnce; } + // Returns true if this scene should block input to lower scenes (works like hidesLowerScenes but doesn't interfere with rendering) + virtual bool blocksInput() { return false; } + // returns main panel if controls are not living in the root virtual UIControl* GetMainPanel(); @@ -251,6 +254,9 @@ public: #ifdef _XBOX_ONE virtual void HandleDLCLicenseChange() {} #endif + + virtual void HandleMessage(EUIMessage message, void *data); + void registerSubstitutionTexture(const wstring &textureName, PBYTE pbData, DWORD dwLength, bool deleteData = false); bool hasRegisteredSubstitutionTexture(const wstring &textureName); @@ -260,6 +266,7 @@ public: protected: + #ifdef _DURANGO virtual long long getDefaultGtcButtons() { return _360_GTC_BACK; } #endif diff --git a/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp index 7823fb4e..0ee92eef 100644 --- a/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp @@ -50,7 +50,10 @@ void UIScene_AbstractContainerMenu::handleDestroy() // 4J Stu - Fix for #11302 - TCR 001: Network Connectivity: Host crashed after being killed by the client while accessing a chest during burst packet loss. // We need to make sure that we call closeContainer() anytime this menu is closed, even if it is forced to close by some other reason (like the player dying) - if(pMinecraft->localplayers[m_iPad] != NULL) pMinecraft->localplayers[m_iPad]->closeContainer(); + if(pMinecraft->localplayers[m_iPad] != NULL && pMinecraft->localplayers[m_iPad]->containerMenu->containerId == m_menu->containerId) + { + pMinecraft->localplayers[m_iPad]->closeContainer(); + } ui.OverrideSFX(m_iPad,ACTION_MENU_A,false); ui.OverrideSFX(m_iPad,ACTION_MENU_OK,false); @@ -311,7 +314,7 @@ void UIScene_AbstractContainerMenu::render(S32 width, S32 height, C4JRender::eVi if(m_needsCacheRendered) { - m_expectedCachedSlotCount = 0; + m_expectedCachedSlotCount = GetBaseSlotCount(); unsigned int count = m_menu->getSize(); for(unsigned int i = 0; i < count; ++i) { @@ -333,6 +336,7 @@ void UIScene_AbstractContainerMenu::customDraw(IggyCustomDrawCallbackRegion *reg if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localgameModes[m_iPad] == NULL) return; shared_ptr item = nullptr; + int slotId = -1; if(wcscmp((wchar_t *)region->name,L"pointerIcon")==0) { m_cacheSlotRenders = false; @@ -340,7 +344,6 @@ void UIScene_AbstractContainerMenu::customDraw(IggyCustomDrawCallbackRegion *reg } else { - int slotId = -1; swscanf((wchar_t*)region->name,L"slot_%d",&slotId); if (slotId == -1) { @@ -354,7 +357,7 @@ void UIScene_AbstractContainerMenu::customDraw(IggyCustomDrawCallbackRegion *reg } } - if(item != NULL) customDrawSlotControl(region,m_iPad,item,1.0f,item->isFoil(),true); + if(item != NULL) customDrawSlotControl(region,m_iPad,item,m_menu->isValidIngredient(item, slotId)?1.0f:0.5f,item->isFoil(),true); } void UIScene_AbstractContainerMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) @@ -370,21 +373,24 @@ void UIScene_AbstractContainerMenu::handleInput(int iPad, int key, bool repeat, } } -void UIScene_AbstractContainerMenu::SetPointerText(const wstring &description, vector &unformattedStrings, bool newSlot) +void UIScene_AbstractContainerMenu::SetPointerText(vector *description, bool newSlot) { - //app.DebugPrintf("Setting pointer text\n"); - m_cursorPath.setLabel(description,false,newSlot); + m_cursorPath.setLabel(HtmlString::Compose(description), false, newSlot); } void UIScene_AbstractContainerMenu::setSectionFocus(ESceneSection eSection, int iPad) { + UIControl *newFocus = getSection(eSection); + if(newFocus) newFocus->setFocus(true); + if(m_focusSection != eSectionNone) { UIControl *currentFocus = getSection(m_focusSection); - if(currentFocus) currentFocus->setFocus(false); + // 4J-TomK only set current focus to false if it differs from last (previously this continuously fired iggy functions when they were identical! + if(currentFocus != newFocus) + if(currentFocus) currentFocus->setFocus(false); } - UIControl *newFocus = getSection(eSection); - if(newFocus) newFocus->setFocus(true); + m_focusSection = eSection; } @@ -405,6 +411,13 @@ shared_ptr UIScene_AbstractContainerMenu::getSlotItem(ESceneSectio else return nullptr; } +Slot *UIScene_AbstractContainerMenu::getSlot(ESceneSection eSection, int iSlot) +{ + Slot *slot = m_menu->getSlot( getSectionStartOffset(eSection) + iSlot ); + if(slot) return slot; + else return NULL; +} + bool UIScene_AbstractContainerMenu::isSlotEmpty(ESceneSection eSection, int iSlot) { Slot *slot = m_menu->getSlot( getSectionStartOffset(eSection) + iSlot ); diff --git a/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.h b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.h index 26688dc5..8afa44f7 100644 --- a/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.h @@ -48,15 +48,20 @@ protected: virtual bool doesSectionTreeHaveFocus(ESceneSection eSection) { return false; } virtual void setSectionFocus(ESceneSection eSection, int iPad); void setFocusToPointer(int iPad); - void SetPointerText(const wstring &description, vector &unformattedStrings, bool newSlot); + void SetPointerText(vector *description, bool newSlot); virtual shared_ptr getSlotItem(ESceneSection eSection, int iSlot); + virtual Slot *getSlot(ESceneSection eSection, int iSlot); virtual bool isSlotEmpty(ESceneSection eSection, int iSlot); virtual void adjustPointerForSafeZone(); virtual UIControl *getSection(ESceneSection eSection) { return NULL; } + virtual int GetBaseSlotCount() { return 0; } public: virtual void tick(); + + // 4J - TomK If update tooltips is called then make sure the correct parent is invoked! (both UIScene AND IUIScene_AbstractContainerMenu have an instance of said function!) + virtual void updateTooltips() { IUIScene_AbstractContainerMenu::UpdateTooltips(); } virtual void render(S32 width, S32 height, C4JRender::eViewportType viewpBort); virtual void customDraw(IggyCustomDrawCallbackRegion *region); diff --git a/Minecraft.Client/Common/UI/UIScene_AnvilMenu.cpp b/Minecraft.Client/Common/UI/UIScene_AnvilMenu.cpp index 7b9886bc..c810ad45 100644 --- a/Minecraft.Client/Common/UI/UIScene_AnvilMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_AnvilMenu.cpp @@ -27,14 +27,14 @@ UIScene_AnvilMenu::UIScene_AnvilMenu(int iPad, void *_initData, UILayer *parentL gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Anvil_Menu, this); } - m_repairMenu = new RepairMenu( initData->inventory, initData->level, initData->x, initData->y, initData->z, pMinecraft->localplayers[iPad] ); + m_repairMenu = new AnvilMenu( initData->inventory, initData->level, initData->x, initData->y, initData->z, pMinecraft->localplayers[iPad] ); m_repairMenu->addSlotListener(this); - Initialize( iPad, m_repairMenu, true, RepairMenu::INV_SLOT_START, eSectionAnvilUsing, eSectionAnvilMax ); + Initialize( iPad, m_repairMenu, true, AnvilMenu::INV_SLOT_START, eSectionAnvilUsing, eSectionAnvilMax ); - m_slotListItem1.addSlots(RepairMenu::INPUT_SLOT, 1); - m_slotListItem2.addSlots(RepairMenu::ADDITIONAL_SLOT, 1); - m_slotListResult.addSlots(RepairMenu::RESULT_SLOT, 1); + m_slotListItem1.addSlots(AnvilMenu::INPUT_SLOT, 1); + m_slotListItem2.addSlots(AnvilMenu::ADDITIONAL_SLOT, 1); + m_slotListResult.addSlots(AnvilMenu::RESULT_SLOT, 1); bool expensive = false; wstring m_costString = L""; @@ -46,7 +46,7 @@ UIScene_AnvilMenu::UIScene_AnvilMenu(int iPad, void *_initData, UILayer *parentL m_costString = app.GetString(IDS_REPAIR_EXPENSIVE); expensive = true; } - else if(!m_repairMenu->getSlot(RepairMenu::RESULT_SLOT)->hasItem()) + else if(!m_repairMenu->getSlot(AnvilMenu::RESULT_SLOT)->hasItem()) { // Do nothing } @@ -56,7 +56,7 @@ UIScene_AnvilMenu::UIScene_AnvilMenu(int iPad, void *_initData, UILayer *parentL wchar_t temp[256]; swprintf(temp, 256, costString, m_repairMenu->cost); m_costString = temp; - if(!m_repairMenu->getSlot(RepairMenu::RESULT_SLOT)->mayPickup(dynamic_pointer_cast(m_inventory->player->shared_from_this()))) + if(!m_repairMenu->getSlot(AnvilMenu::RESULT_SLOT)->mayPickup(dynamic_pointer_cast(m_inventory->player->shared_from_this()))) { expensive = true; } @@ -85,11 +85,11 @@ wstring UIScene_AnvilMenu::getMoviePath() void UIScene_AnvilMenu::handleReload() { - Initialize( m_iPad, m_menu, true, RepairMenu::INV_SLOT_START, eSectionAnvilUsing, eSectionAnvilMax ); + Initialize( m_iPad, m_menu, true, AnvilMenu::INV_SLOT_START, eSectionAnvilUsing, eSectionAnvilMax ); - m_slotListItem1.addSlots(RepairMenu::INPUT_SLOT, 1); - m_slotListItem2.addSlots(RepairMenu::ADDITIONAL_SLOT, 1); - m_slotListResult.addSlots(RepairMenu::RESULT_SLOT, 1); + m_slotListItem1.addSlots(AnvilMenu::INPUT_SLOT, 1); + m_slotListItem2.addSlots(AnvilMenu::ADDITIONAL_SLOT, 1); + m_slotListResult.addSlots(AnvilMenu::RESULT_SLOT, 1); } void UIScene_AnvilMenu::tick() diff --git a/Minecraft.Client/Common/UI/UIScene_BeaconMenu.cpp b/Minecraft.Client/Common/UI/UIScene_BeaconMenu.cpp new file mode 100644 index 00000000..e70397d6 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_BeaconMenu.cpp @@ -0,0 +1,519 @@ +#include "stdafx.h" +#include "UI.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\Minecraft.h" +#include "UIScene_BeaconMenu.h" + +UIScene_BeaconMenu::UIScene_BeaconMenu(int iPad, void *_initData, UILayer *parentLayer) : UIScene_AbstractContainerMenu(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + m_labelPrimary.init(IDS_CONTAINER_BEACON_PRIMARY_POWER); + m_labelSecondary.init(IDS_CONTAINER_BEACON_SECONDARY_POWER); + + m_buttonsPowers[eControl_Primary1].setVisible(false); + m_buttonsPowers[eControl_Primary2].setVisible(false); + m_buttonsPowers[eControl_Primary3].setVisible(false); + m_buttonsPowers[eControl_Primary4].setVisible(false); + m_buttonsPowers[eControl_Primary5].setVisible(false); + m_buttonsPowers[eControl_Secondary1].setVisible(false); + m_buttonsPowers[eControl_Secondary2].setVisible(false); + + BeaconScreenInput *initData = (BeaconScreenInput *)_initData; + + Minecraft *pMinecraft = Minecraft::GetInstance(); + if( pMinecraft->localgameModes[initData->iPad] != NULL ) + { + TutorialMode *gameMode = (TutorialMode *)pMinecraft->localgameModes[initData->iPad]; + m_previousTutorialState = gameMode->getTutorial()->getCurrentState(); + gameMode->getTutorial()->changeTutorialState(e_Tutorial_State_Beacon_Menu, this); + } + + m_beacon = initData->beacon; + + BeaconMenu *menu = new BeaconMenu(initData->inventory, initData->beacon); + + Initialize( initData->iPad, menu, true, BeaconMenu::INV_SLOT_START, eSectionBeaconUsing, eSectionBeaconMax ); + + m_slotListActivator.addSlots(BeaconMenu::PAYMENT_SLOT, 1); + + m_slotListActivatorIcons.addSlots(m_menu->getSize(),4); + + //app.SetRichPresenceContext(m_iPad,CONTEXT_GAME_STATE_BEACON); + + delete initData; +} + +wstring UIScene_BeaconMenu::getMoviePath() +{ + if(app.GetLocalPlayerCount() > 1) + { + return L"BeaconMenuSplit"; + } + else + { + return L"BeaconMenu"; + } +} + +void UIScene_BeaconMenu::handleReload() +{ + Initialize( m_iPad, m_menu, true, BeaconMenu::INV_SLOT_START, eSectionBeaconUsing, eSectionBeaconMax ); + + m_slotListActivator.addSlots(BeaconMenu::PAYMENT_SLOT, 1); + + m_slotListActivatorIcons.addSlots(m_menu->getSize(),4); +} + +void UIScene_BeaconMenu::tick() +{ + UIScene_AbstractContainerMenu::tick(); + + handleTick(); +} + +int UIScene_BeaconMenu::getSectionColumns(ESceneSection eSection) +{ + int cols = 0; + switch( eSection ) + { + case eSectionBeaconItem: + cols = 1; + break; + case eSectionBeaconInventory: + cols = 9; + break; + case eSectionBeaconUsing: + cols = 9; + break; + default: + assert( false ); + break; + }; + return cols; +} + +int UIScene_BeaconMenu::getSectionRows(ESceneSection eSection) +{ + int rows = 0; + switch( eSection ) + { + case eSectionBeaconItem: + rows = 1; + break; + case eSectionBeaconInventory: + rows = 3; + break; + case eSectionBeaconUsing: + rows = 1; + break; + default: + assert( false ); + break; + }; + return rows; +} + +void UIScene_BeaconMenu::GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ) +{ + switch( eSection ) + { + case eSectionBeaconItem: + pPosition->x = m_slotListActivator.getXPos(); + pPosition->y = m_slotListActivator.getYPos(); + break; + case eSectionBeaconInventory: + pPosition->x = m_slotListInventory.getXPos(); + pPosition->y = m_slotListInventory.getYPos(); + break; + case eSectionBeaconUsing: + pPosition->x = m_slotListHotbar.getXPos(); + pPosition->y = m_slotListHotbar.getYPos(); + break; + + case eSectionBeaconPrimaryTierOneOne: + pPosition->x = m_buttonsPowers[eControl_Primary1].getXPos(); + pPosition->y = m_buttonsPowers[eControl_Primary1].getYPos(); + break; + case eSectionBeaconPrimaryTierOneTwo: + pPosition->x = m_buttonsPowers[eControl_Primary2].getXPos(); + pPosition->y = m_buttonsPowers[eControl_Primary2].getYPos(); + break; + case eSectionBeaconPrimaryTierTwoOne: + pPosition->x = m_buttonsPowers[eControl_Primary3].getXPos(); + pPosition->y = m_buttonsPowers[eControl_Primary3].getYPos(); + break; + case eSectionBeaconPrimaryTierTwoTwo: + pPosition->x = m_buttonsPowers[eControl_Primary4].getXPos(); + pPosition->y = m_buttonsPowers[eControl_Primary4].getYPos(); + break; + case eSectionBeaconPrimaryTierThree: + pPosition->x = m_buttonsPowers[eControl_Primary5].getXPos(); + pPosition->y = m_buttonsPowers[eControl_Primary5].getYPos(); + break; + case eSectionBeaconSecondaryOne: + pPosition->x = m_buttonsPowers[eControl_Secondary1].getXPos(); + pPosition->y = m_buttonsPowers[eControl_Secondary1].getYPos(); + break; + case eSectionBeaconSecondaryTwo: + pPosition->x = m_buttonsPowers[eControl_Secondary2].getXPos(); + pPosition->y = m_buttonsPowers[eControl_Secondary2].getYPos(); + break; + case eSectionBeaconConfirm: + pPosition->x = m_buttonConfirm.getXPos(); + pPosition->y = m_buttonConfirm.getYPos(); + break; + default: + assert( false ); + break; + }; +} + +void UIScene_BeaconMenu::GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ) +{ + UIVec2D sectionSize; + switch( eSection ) + { + case eSectionBeaconItem: + sectionSize.x = m_slotListActivator.getWidth(); + sectionSize.y = m_slotListActivator.getHeight(); + break; + case eSectionBeaconInventory: + sectionSize.x = m_slotListInventory.getWidth(); + sectionSize.y = m_slotListInventory.getHeight(); + break; + case eSectionBeaconUsing: + sectionSize.x = m_slotListHotbar.getWidth(); + sectionSize.y = m_slotListHotbar.getHeight(); + break; + + case eSectionBeaconPrimaryTierOneOne: + sectionSize.x = m_buttonsPowers[eControl_Primary1].getWidth(); + sectionSize.y = m_buttonsPowers[eControl_Primary1].getHeight(); + break; + case eSectionBeaconPrimaryTierOneTwo: + sectionSize.x = m_buttonsPowers[eControl_Primary2].getWidth(); + sectionSize.y = m_buttonsPowers[eControl_Primary2].getHeight(); + break; + case eSectionBeaconPrimaryTierTwoOne: + sectionSize.x = m_buttonsPowers[eControl_Primary3].getWidth(); + sectionSize.y = m_buttonsPowers[eControl_Primary3].getHeight(); + break; + case eSectionBeaconPrimaryTierTwoTwo: + sectionSize.x = m_buttonsPowers[eControl_Primary4].getWidth(); + sectionSize.y = m_buttonsPowers[eControl_Primary4].getHeight(); + break; + case eSectionBeaconPrimaryTierThree: + sectionSize.x = m_buttonsPowers[eControl_Primary5].getWidth(); + sectionSize.y = m_buttonsPowers[eControl_Primary5].getHeight(); + break; + case eSectionBeaconSecondaryOne: + sectionSize.x = m_buttonsPowers[eControl_Secondary1].getWidth(); + sectionSize.y = m_buttonsPowers[eControl_Secondary1].getHeight(); + break; + case eSectionBeaconSecondaryTwo: + sectionSize.x = m_buttonsPowers[eControl_Secondary2].getWidth(); + sectionSize.y = m_buttonsPowers[eControl_Secondary2].getHeight(); + break; + case eSectionBeaconConfirm: + sectionSize.x = m_buttonConfirm.getWidth(); + sectionSize.y = m_buttonConfirm.getHeight(); + break; + default: + assert( false ); + break; + }; + + if(IsSectionSlotList(eSection)) + { + int rows = getSectionRows(eSection); + int cols = getSectionColumns(eSection); + + pSize->x = sectionSize.x/cols; + pSize->y = sectionSize.y/rows; + + int itemCol = iItemIndex % cols; + int itemRow = iItemIndex/cols; + + pPosition->x = itemCol * pSize->x; + pPosition->y = itemRow * pSize->y; + } + else + { + GetPositionOfSection(eSection, pPosition); + pSize->x = sectionSize.x; + pSize->y = sectionSize.y; + } +} + +void UIScene_BeaconMenu::setSectionSelectedSlot(ESceneSection eSection, int x, int y) +{ + int cols = getSectionColumns(eSection); + + int index = (y * cols) + x; + + UIControl_SlotList *slotList = NULL; + switch( eSection ) + { + case eSectionBeaconItem: + slotList = &m_slotListActivator; + break; + case eSectionBeaconInventory: + slotList = &m_slotListInventory; + break; + case eSectionBeaconUsing: + slotList = &m_slotListHotbar; + break; + default: + assert( false ); + break; + }; + + slotList->setHighlightSlot(index); +} + +UIControl *UIScene_BeaconMenu::getSection(ESceneSection eSection) +{ + UIControl *control = NULL; + switch( eSection ) + { + case eSectionBeaconItem: + control = &m_slotListActivator; + break; + case eSectionBeaconInventory: + control = &m_slotListInventory; + break; + case eSectionBeaconUsing: + control = &m_slotListHotbar; + break; + + case eSectionBeaconPrimaryTierOneOne: + control = &m_buttonsPowers[eControl_Primary1]; + break; + case eSectionBeaconPrimaryTierOneTwo: + control = &m_buttonsPowers[eControl_Primary2]; + break; + case eSectionBeaconPrimaryTierTwoOne: + control = &m_buttonsPowers[eControl_Primary3]; + break; + case eSectionBeaconPrimaryTierTwoTwo: + control = &m_buttonsPowers[eControl_Primary4]; + break; + case eSectionBeaconPrimaryTierThree: + control = &m_buttonsPowers[eControl_Primary5]; + break; + case eSectionBeaconSecondaryOne: + control = &m_buttonsPowers[eControl_Secondary1]; + break; + case eSectionBeaconSecondaryTwo: + control = &m_buttonsPowers[eControl_Secondary2]; + break; + case eSectionBeaconConfirm: + control = &m_buttonConfirm; + break; + + default: + assert( false ); + break; + }; + return control; +} + +void UIScene_BeaconMenu::customDraw(IggyCustomDrawCallbackRegion *region) +{ + Minecraft *pMinecraft = Minecraft::GetInstance(); + if(pMinecraft->localplayers[m_iPad] == NULL || pMinecraft->localgameModes[m_iPad] == NULL) return; + + shared_ptr item = nullptr; + int slotId = -1; + swscanf((wchar_t*)region->name,L"slot_%d",&slotId); + + if(slotId >= 0 && slotId >= m_menu->getSize() ) + { + int icon = slotId - m_menu->getSize(); + switch(icon) + { + case 0: + item = shared_ptr(new ItemInstance(Item::emerald) ); + break; + case 1: + item = shared_ptr(new ItemInstance(Item::diamond) ); + break; + case 2: + item = shared_ptr(new ItemInstance(Item::goldIngot) ); + break; + case 3: + item = shared_ptr(new ItemInstance(Item::ironIngot) ); + break; + default: + assert(false); + break; + }; + if(item != NULL) customDrawSlotControl(region,m_iPad,item,1.0f,item->isFoil(),true); + } + else + { + UIScene_AbstractContainerMenu::customDraw(region); + } +} + +void UIScene_BeaconMenu::SetConfirmButtonEnabled(bool enabled) +{ + m_buttonConfirm.SetButtonActive(enabled); +} + +void UIScene_BeaconMenu::AddPowerButton(int id, int icon, int tier, int count, bool active, bool selected) +{ + switch(tier) + { + case 0: + if(count == 0) + { + m_buttonsPowers[eControl_Primary1].SetData(id, icon,active,selected); + m_buttonsPowers[eControl_Primary1].setVisible(true); + } + else + { + m_buttonsPowers[eControl_Primary2].SetData(id, icon,active,selected); + m_buttonsPowers[eControl_Primary2].setVisible(true); + } + break; + case 1: + if(count == 0) + { + m_buttonsPowers[eControl_Primary3].SetData(id, icon,active,selected); + m_buttonsPowers[eControl_Primary3].setVisible(true); + } + else + { + m_buttonsPowers[eControl_Primary4].SetData(id, icon,active,selected); + m_buttonsPowers[eControl_Primary4].setVisible(true); + } + break; + case 2: + m_buttonsPowers[eControl_Primary5].SetData(id, icon,active,selected); + m_buttonsPowers[eControl_Primary5].setVisible(true); + break; + case 3: + if(count == 0) + { + m_buttonsPowers[eControl_Secondary1].SetData(id, icon,active,selected); + m_buttonsPowers[eControl_Secondary1].setVisible(true); + } + else + { + m_buttonsPowers[eControl_Secondary2].SetData(id, icon,active,selected); + m_buttonsPowers[eControl_Secondary2].setVisible(true); + } + break; + }; +} + +int UIScene_BeaconMenu::GetPowerButtonId(ESceneSection eSection) +{ + switch(eSection) + { + case eSectionBeaconPrimaryTierOneOne: + return m_buttonsPowers[eControl_Primary1].GetData(); + break; + case eSectionBeaconPrimaryTierOneTwo: + return m_buttonsPowers[eControl_Primary2].GetData(); + break; + case eSectionBeaconPrimaryTierTwoOne: + return m_buttonsPowers[eControl_Primary3].GetData(); + break; + case eSectionBeaconPrimaryTierTwoTwo: + return m_buttonsPowers[eControl_Primary4].GetData(); + break; + case eSectionBeaconPrimaryTierThree: + return m_buttonsPowers[eControl_Primary5].GetData(); + break; + case eSectionBeaconSecondaryOne: + return m_buttonsPowers[eControl_Secondary1].GetData(); + break; + case eSectionBeaconSecondaryTwo: + return m_buttonsPowers[eControl_Secondary2].GetData(); + break; + }; + return 0; +} + +bool UIScene_BeaconMenu::IsPowerButtonSelected(ESceneSection eSection) +{ + switch(eSection) + { + case eSectionBeaconPrimaryTierOneOne: + return m_buttonsPowers[eControl_Primary1].IsButtonSelected(); + break; + case eSectionBeaconPrimaryTierOneTwo: + return m_buttonsPowers[eControl_Primary2].IsButtonSelected(); + break; + case eSectionBeaconPrimaryTierTwoOne: + return m_buttonsPowers[eControl_Primary3].IsButtonSelected(); + break; + case eSectionBeaconPrimaryTierTwoTwo: + return m_buttonsPowers[eControl_Primary4].IsButtonSelected(); + break; + case eSectionBeaconPrimaryTierThree: + return m_buttonsPowers[eControl_Primary5].IsButtonSelected(); + break; + case eSectionBeaconSecondaryOne: + return m_buttonsPowers[eControl_Secondary1].IsButtonSelected(); + break; + case eSectionBeaconSecondaryTwo: + return m_buttonsPowers[eControl_Secondary2].IsButtonSelected(); + break; + }; + return false; +} + +void UIScene_BeaconMenu::SetPowerButtonSelected(ESceneSection eSection) +{ + switch(eSection) + { + case eSectionBeaconPrimaryTierOneOne: + case eSectionBeaconPrimaryTierOneTwo: + case eSectionBeaconPrimaryTierTwoOne: + case eSectionBeaconPrimaryTierTwoTwo: + case eSectionBeaconPrimaryTierThree: + m_buttonsPowers[eControl_Primary1].SetButtonSelected(false); + m_buttonsPowers[eControl_Primary2].SetButtonSelected(false); + m_buttonsPowers[eControl_Primary3].SetButtonSelected(false); + m_buttonsPowers[eControl_Primary4].SetButtonSelected(false); + m_buttonsPowers[eControl_Primary5].SetButtonSelected(false); + break; + case eSectionBeaconSecondaryOne: + case eSectionBeaconSecondaryTwo: + m_buttonsPowers[eControl_Secondary1].SetButtonSelected(false); + m_buttonsPowers[eControl_Secondary2].SetButtonSelected(false); + break; + }; + + + switch(eSection) + { + case eSectionBeaconPrimaryTierOneOne: + return m_buttonsPowers[eControl_Primary1].SetButtonSelected(true); + break; + case eSectionBeaconPrimaryTierOneTwo: + return m_buttonsPowers[eControl_Primary2].SetButtonSelected(true); + break; + case eSectionBeaconPrimaryTierTwoOne: + return m_buttonsPowers[eControl_Primary3].SetButtonSelected(true); + break; + case eSectionBeaconPrimaryTierTwoTwo: + return m_buttonsPowers[eControl_Primary4].SetButtonSelected(true); + break; + case eSectionBeaconPrimaryTierThree: + return m_buttonsPowers[eControl_Primary5].SetButtonSelected(true); + break; + case eSectionBeaconSecondaryOne: + return m_buttonsPowers[eControl_Secondary1].SetButtonSelected(true); + break; + case eSectionBeaconSecondaryTwo: + return m_buttonsPowers[eControl_Secondary2].SetButtonSelected(true); + break; + }; +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_BeaconMenu.h b/Minecraft.Client/Common/UI/UIScene_BeaconMenu.h new file mode 100644 index 00000000..ccd9366f --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_BeaconMenu.h @@ -0,0 +1,71 @@ +#pragma once + +#include "UIScene_AbstractContainerMenu.h" +#include "UIControl_SlotList.h" +#include "IUIScene_BeaconMenu.h" + +class UIScene_BeaconMenu : public UIScene_AbstractContainerMenu, public IUIScene_BeaconMenu +{ +private: + enum EControls + { + eControl_Primary1, + eControl_Primary2, + eControl_Primary3, + eControl_Primary4, + eControl_Primary5, + eControl_Secondary1, + eControl_Secondary2, + + eControl_EFFECT_COUNT, + }; +public: + UIScene_BeaconMenu(int iPad, void *initData, UILayer *parentLayer); + + virtual EUIScene getSceneType() { return eUIScene_BeaconMenu;} + +protected: + UIControl_SlotList m_slotListActivator; + UIControl_SlotList m_slotListActivatorIcons; + UIControl_Label m_labelPrimary, m_labelSecondary; + UIControl_BeaconEffectButton m_buttonsPowers[eControl_EFFECT_COUNT]; + UIControl_BeaconEffectButton m_buttonConfirm; + + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene_AbstractContainerMenu) + UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) + UI_MAP_ELEMENT( m_slotListActivator, "ActivatorSlot") + UI_MAP_ELEMENT( m_slotListActivatorIcons, "ActivatorList") + UI_MAP_ELEMENT( m_buttonsPowers[eControl_Primary1], "Primary_Slot_01") + UI_MAP_ELEMENT( m_buttonsPowers[eControl_Primary2], "Primary_Slot_02") + UI_MAP_ELEMENT( m_buttonsPowers[eControl_Primary3], "Primary_Slot_03") + UI_MAP_ELEMENT( m_buttonsPowers[eControl_Primary4], "Primary_Slot_04") + UI_MAP_ELEMENT( m_buttonsPowers[eControl_Primary5], "Primary_Slot_05") + UI_MAP_ELEMENT( m_buttonsPowers[eControl_Secondary1], "Secondary_Slot_01") + UI_MAP_ELEMENT( m_buttonsPowers[eControl_Secondary2], "Secondary_Slot_02") + UI_MAP_ELEMENT( m_buttonConfirm, "ConfirmButton") + UI_MAP_ELEMENT( m_labelPrimary, "PrimaryPowerLabel") + UI_MAP_ELEMENT( m_labelSecondary, "SecondaryPowerLabel") + UI_END_MAP_CHILD_ELEMENTS() + UI_END_MAP_ELEMENTS_AND_NAMES() + + virtual wstring getMoviePath(); + virtual void handleReload(); + virtual void tick(); + virtual int GetBaseSlotCount() { return 4; } + + virtual int getSectionColumns(ESceneSection eSection); + virtual int getSectionRows(ESceneSection eSection); + virtual void GetPositionOfSection( ESceneSection eSection, UIVec2D* pPosition ); + virtual void GetItemScreenData( ESceneSection eSection, int iItemIndex, UIVec2D* pPosition, UIVec2D* pSize ); + virtual void handleSectionClick(ESceneSection eSection) {} + virtual void setSectionSelectedSlot(ESceneSection eSection, int x, int y); + + virtual UIControl *getSection(ESceneSection eSection); + virtual void customDraw(IggyCustomDrawCallbackRegion *region); + + virtual void SetConfirmButtonEnabled(bool enabled); + virtual void AddPowerButton(int id, int icon, int tier, int count, bool active, bool selected); + virtual int GetPowerButtonId(ESceneSection eSection); + virtual bool IsPowerButtonSelected(ESceneSection eSection); + virtual void SetPowerButtonSelected(ESceneSection eSection); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_BrewingStandMenu.cpp b/Minecraft.Client/Common/UI/UIScene_BrewingStandMenu.cpp index cd56bd84..8563054c 100644 --- a/Minecraft.Client/Common/UI/UIScene_BrewingStandMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_BrewingStandMenu.cpp @@ -14,11 +14,11 @@ UIScene_BrewingStandMenu::UIScene_BrewingStandMenu(int iPad, void *_initData, UI m_progressBrewingArrow.init(L"",0,0,PotionBrewing::BREWING_TIME_SECONDS * SharedConstants::TICKS_PER_SECOND,0); m_progressBrewingBubbles.init(L"",0,0,30,0); - m_labelBrewingStand.init( app.GetString(IDS_BREWING_STAND) ); - BrewingScreenInput *initData = (BrewingScreenInput *)_initData; m_brewingStand = initData->brewingStand; + m_labelBrewingStand.init( m_brewingStand->getName() ); + Minecraft *pMinecraft = Minecraft::GetInstance(); if( pMinecraft->localgameModes[initData->iPad] != NULL ) { diff --git a/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.cpp b/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.cpp index 0ea99a36..968072a8 100644 --- a/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.cpp +++ b/Minecraft.Client/Common/UI/UIScene_ConnectingProgress.cpp @@ -188,7 +188,7 @@ void UIScene_ConnectingProgress::handleTimerComplete(int id) { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox( IDS_CONNECTION_FAILED, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_CONNECTION_FAILED, exitReasonStringId, uiIDA,1,ProfileManager.GetPrimaryPad()); exitReasonStringId = -1; //app.NavigateToHomeMenu(); diff --git a/Minecraft.Client/Common/UI/UIScene_ContainerMenu.cpp b/Minecraft.Client/Common/UI/UIScene_ContainerMenu.cpp index a0b25d18..9e48a57b 100644 --- a/Minecraft.Client/Common/UI/UIScene_ContainerMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_ContainerMenu.cpp @@ -19,7 +19,7 @@ UIScene_ContainerMenu::UIScene_ContainerMenu(int iPad, void *_initData, UILayer // Setup all the Iggy references we need for this scene initialiseMovie(); - m_labelChest.init(app.GetString(initData->container->getName())); + m_labelChest.init(initData->container->getName()); ContainerMenu* menu = new ContainerMenu( initData->inventory, initData->container ); diff --git a/Minecraft.Client/Common/UI/UIScene_ControlsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_ControlsMenu.cpp index c05b502e..57567248 100644 --- a/Minecraft.Client/Common/UI/UIScene_ControlsMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_ControlsMenu.cpp @@ -37,7 +37,7 @@ UIScene_ControlsMenu::UIScene_ControlsMenu(int iPad, void *initData, UILayer *pa // 4J-PB - stop the label showing in the in-game controls menu else { - m_labelVersion.init(" "); + m_labelVersion.init(L" "); } m_bCreativeMode = !bNotInGame && Minecraft::GetInstance()->localplayers[m_iPad] && Minecraft::GetInstance()->localplayers[m_iPad]->abilities.mayfly; diff --git a/Minecraft.Client/Common/UI/UIScene_CraftingMenu.cpp b/Minecraft.Client/Common/UI/UIScene_CraftingMenu.cpp index 5b729069..66d8c41e 100644 --- a/Minecraft.Client/Common/UI/UIScene_CraftingMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_CraftingMenu.cpp @@ -197,7 +197,10 @@ void UIScene_CraftingMenu::handleDestroy() } // We need to make sure that we call closeContainer() anytime this menu is closed, even if it is forced to close by some other reason (like the player dying) - if(Minecraft::GetInstance()->localplayers[m_iPad] != NULL) Minecraft::GetInstance()->localplayers[m_iPad]->closeContainer(); + if(Minecraft::GetInstance()->localplayers[m_iPad] != NULL && Minecraft::GetInstance()->localplayers[m_iPad]->containerMenu->containerId == m_menu->containerId) + { + Minecraft::GetInstance()->localplayers[m_iPad]->closeContainer(); + } ui.OverrideSFX(m_iPad,ACTION_MENU_A,false); ui.OverrideSFX(m_iPad,ACTION_MENU_OK,false); @@ -763,6 +766,21 @@ void UIScene_CraftingMenu::updateHighlightAndScrollPositions() } } +void UIScene_CraftingMenu::HandleMessage(EUIMessage message, void *data) +{ + switch(message) + { + case eUIMessage_InventoryUpdated: + handleInventoryUpdated(data); + break; + }; +} + +void UIScene_CraftingMenu::handleInventoryUpdated(LPVOID data) +{ + HandleInventoryUpdated(); +} + void UIScene_CraftingMenu::updateVSlotPositions(int iSlots, int i) { // Not needed diff --git a/Minecraft.Client/Common/UI/UIScene_CraftingMenu.h b/Minecraft.Client/Common/UI/UIScene_CraftingMenu.h index 44a39d61..84c9ba65 100644 --- a/Minecraft.Client/Common/UI/UIScene_CraftingMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_CraftingMenu.h @@ -202,4 +202,10 @@ protected: virtual void updateVSlotPositions(int iSlots, int i); virtual void UpdateMultiPanel(); + + virtual void HandleMessage(EUIMessage message, void *data); + void handleInventoryUpdated(LPVOID data); + + // 4J - TomK If update tooltips is called then make sure the correct parent is invoked! (both UIScene AND IUIScene_CraftingMenu have an instance of said function!) + virtual void updateTooltips() { IUIScene_CraftingMenu::UpdateTooltips(); } }; diff --git a/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.cpp b/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.cpp index 6be67bed..f7cca84b 100644 --- a/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.cpp @@ -45,11 +45,8 @@ UIScene_CreateWorldMenu::UIScene_CreateWorldMenu(int iPad, void *initData, UILay m_iPad=iPad; m_labelWorldName.init(app.GetString(IDS_WORLD_NAME)); - m_labelSeed.init(app.GetString(IDS_CREATE_NEW_WORLD_SEED)); - m_labelRandomSeed.init(app.GetString(IDS_CREATE_NEW_WORLD_RANDOM_SEED)); m_editWorldName.init(m_worldName, eControl_EditWorldName); - m_editSeed.init(L"", eControl_EditSeed); m_buttonGamemode.init(app.GetString(IDS_GAMEMODE_SURVIVAL),eControl_GameModeToggle); m_buttonMoreOptions.init(app.GetString(IDS_MORE_OPTIONS),eControl_MoreOptions); @@ -75,7 +72,16 @@ UIScene_CreateWorldMenu::UIScene_CreateWorldMenu(int iPad, void *initData, UILay m_MoreOptionsParams.bTNT = TRUE; m_MoreOptionsParams.iPad = iPad; - m_bGameModeSurvival=true; + m_MoreOptionsParams.bMobGriefing = true; + m_MoreOptionsParams.bKeepInventory = false; + m_MoreOptionsParams.bDoMobSpawning = true; + m_MoreOptionsParams.bDoMobLoot = true; + m_MoreOptionsParams.bDoTileDrops = true; + m_MoreOptionsParams.bNaturalRegeneration = true; + m_MoreOptionsParams.bDoDaylightCycle = true; + + m_bGameModeCreative = false; + m_iGameModeId = GameType::SURVIVAL->getId(); m_pDLCPack = NULL; m_bRebuildTouchBoxes = false; @@ -121,28 +127,23 @@ UIScene_CreateWorldMenu::UIScene_CreateWorldMenu(int iPad, void *initData, UILay } } -#if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 - if(getSceneResolution() == eSceneResolution_1080) + // Set up online game checkbox + bool bOnlineGame = m_MoreOptionsParams.bOnlineGame; + m_checkboxOnline.SetEnable(true); + + // 4J-PB - to stop an offline game being able to select the online flag + if(ProfileManager.IsSignedInLive(m_iPad) == false) { - // 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! @@ -1164,7 +1139,7 @@ void UIScene_CreateWorldMenu::CreateGame(UIScene_CreateWorldMenu* pClass, DWORD app.SetGameHostOption(eGameHostOption_BedrockFog,app.GetGameSettings(pClass->m_iPad,eGameSetting_BedrockFog)?1:0); - app.SetGameHostOption(eGameHostOption_GameType,pClass->m_bGameModeSurvival?GameType::SURVIVAL->getId():GameType::CREATIVE->getId() ); + app.SetGameHostOption(eGameHostOption_GameType,pClass->m_iGameModeId ); app.SetGameHostOption(eGameHostOption_LevelType,pClass->m_MoreOptionsParams.bFlatWorld ); app.SetGameHostOption(eGameHostOption_Structures,pClass->m_MoreOptionsParams.bStructures ); app.SetGameHostOption(eGameHostOption_BonusChest,pClass->m_MoreOptionsParams.bBonusChest ); @@ -1176,6 +1151,21 @@ void UIScene_CreateWorldMenu::CreateGame(UIScene_CreateWorldMenu* pClass, DWORD app.SetGameHostOption(eGameHostOption_HostCanFly,pClass->m_MoreOptionsParams.bHostPrivileges); app.SetGameHostOption(eGameHostOption_HostCanChangeHunger,pClass->m_MoreOptionsParams.bHostPrivileges); app.SetGameHostOption(eGameHostOption_HostCanBeInvisible,pClass->m_MoreOptionsParams.bHostPrivileges ); + + app.SetGameHostOption(eGameHostOption_MobGriefing, pClass->m_MoreOptionsParams.bMobGriefing); + app.SetGameHostOption(eGameHostOption_KeepInventory, pClass->m_MoreOptionsParams.bKeepInventory); + app.SetGameHostOption(eGameHostOption_DoMobSpawning, pClass->m_MoreOptionsParams.bDoMobSpawning); + app.SetGameHostOption(eGameHostOption_DoMobLoot, pClass->m_MoreOptionsParams.bDoMobLoot); + app.SetGameHostOption(eGameHostOption_DoTileDrops, pClass->m_MoreOptionsParams.bDoTileDrops); + app.SetGameHostOption(eGameHostOption_NaturalRegeneration, pClass->m_MoreOptionsParams.bNaturalRegeneration); + app.SetGameHostOption(eGameHostOption_DoDaylightCycle, pClass->m_MoreOptionsParams.bDoDaylightCycle); + + app.SetGameHostOption(eGameHostOption_WasntSaveOwner, false); +#ifdef _LARGE_WORLDS + app.SetGameHostOption(eGameHostOption_WorldSize, pClass->m_MoreOptionsParams.worldSize+1 ); // 0 is GAME_HOST_OPTION_WORLDSIZE_UNKNOWN + pClass->m_MoreOptionsParams.currentWorldSize = (EGameHostOptionWorldSize)(pClass->m_MoreOptionsParams.worldSize+1); + pClass->m_MoreOptionsParams.newWorldSize = (EGameHostOptionWorldSize)(pClass->m_MoreOptionsParams.worldSize+1); +#endif g_NetworkManager.HostGame(dwLocalUsersMask,isClientSide,isPrivate,MINECRAFT_NET_MAX_PLAYERS,0); @@ -1186,26 +1176,23 @@ void UIScene_CreateWorldMenu::CreateGame(UIScene_CreateWorldMenu* pClass, DWORD { case 0: // Classic - param->xzSize = 1 * 54; - param->hellScale = 3; + param->xzSize = LEVEL_WIDTH_CLASSIC; + param->hellScale = HELL_LEVEL_SCALE_CLASSIC; // hellsize = 54/3 = 18 break; case 1: // Small - param->xzSize = 1 * 64; - param->hellScale = 3; + param->xzSize = LEVEL_WIDTH_SMALL; + param->hellScale = HELL_LEVEL_SCALE_SMALL; // hellsize = ceil(64/3) = 22 break; case 2: // Medium - param->xzSize = 3 * 64; - param->hellScale = 6; + param->xzSize = LEVEL_WIDTH_MEDIUM; + param->hellScale = HELL_LEVEL_SCALE_MEDIUM; // hellsize= ceil(3*64/6) = 32 break; case 3: - //param->xzSize = 5 * 64; - //param->hellScale = 8; - // Large - param->xzSize = LEVEL_MAX_WIDTH; - param->hellScale = HELL_LEVEL_MAX_SCALE; + param->xzSize = LEVEL_WIDTH_LARGE; + param->hellScale = HELL_LEVEL_SCALE_LARGE; // hellsize = ceil(5*64/8) = 40 break; }; #else @@ -1283,7 +1270,7 @@ int UIScene_CreateWorldMenu::StartGame_SignInReturned(void *pParam,bool bContinu // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive if the npAvailability isn't SCE_OK UINT uiIDA[1]; uiIDA[0]=IDS_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive, NULL, NULL, app.GetStringTable()); + ui.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive); } else { @@ -1291,14 +1278,14 @@ int UIScene_CreateWorldMenu::StartGame_SignInReturned(void *pParam,bool bContinu UINT uiIDA[2]; uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; uiIDA[1] = IDS_CANCEL; - ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPadNotSignedInLive, &UIScene_CreateWorldMenu::MustSignInReturnedPSN, pClass, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPadNotSignedInLive, &UIScene_CreateWorldMenu::MustSignInReturnedPSN, pClass); } return 0; #else pClass->m_bIgnoreInput=false; UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); return 0; #endif } @@ -1318,14 +1305,14 @@ int UIScene_CreateWorldMenu::StartGame_SignInReturned(void *pParam,bool bContinu pClass->m_bIgnoreInput = false; UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE, uiIDA,1,ProfileManager.GetPrimaryPad()); } else { pClass->m_bIgnoreInput = false; UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_HOST_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_HOST_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); } } else @@ -1389,7 +1376,7 @@ int UIScene_CreateWorldMenu::ConfirmCreateReturned(void *pParam,int iPad,C4JStor pClass->m_bIgnoreInput = false; UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE, uiIDA,1,ProfileManager.GetPrimaryPad()); } else { diff --git a/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.h b/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.h index ebb383e8..d6ae1c04 100644 --- a/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_CreateWorldMenu.h @@ -8,7 +8,6 @@ private: enum EControls { eControl_EditWorldName, - eControl_EditSeed, eControl_TexturePackList, eControl_GameModeToggle, eControl_Difficulty, @@ -24,14 +23,11 @@ private: wstring m_seed; UIControl m_controlMainPanel; - UIControl_Label m_labelWorldName, m_labelSeed, m_labelRandomSeed; + UIControl_Label m_labelWorldName; UIControl_Button m_buttonGamemode, m_buttonMoreOptions, m_buttonCreateWorld; - UIControl_TextInput m_editWorldName, m_editSeed; + UIControl_TextInput m_editWorldName; UIControl_Slider m_sliderDifficulty; - -#if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 UIControl_CheckBox m_checkboxOnline; -#endif UIControl_BitmapIcon m_bitmapIcon, m_bitmapComparison; @@ -40,22 +36,17 @@ private: UI_BEGIN_MAP_CHILD_ELEMENTS( m_controlMainPanel ) UI_MAP_ELEMENT( m_labelWorldName, "WorldName") UI_MAP_ELEMENT( m_editWorldName, "EditWorldName") - UI_MAP_ELEMENT( m_labelSeed, "Seed") - UI_MAP_ELEMENT( m_editSeed, "EditSeed") - UI_MAP_ELEMENT( m_labelRandomSeed, "RandomSeed") UI_MAP_ELEMENT( m_texturePackList, "TexturePackSelector") UI_MAP_ELEMENT( m_buttonGamemode, "GameModeToggle") - -#if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 UI_MAP_ELEMENT( m_checkboxOnline, "CheckboxOnline") -#endif UI_MAP_ELEMENT( m_buttonMoreOptions, "MoreOptions") UI_MAP_ELEMENT( m_buttonCreateWorld, "NewWorld") UI_MAP_ELEMENT( m_sliderDifficulty, "Difficulty") UI_END_MAP_CHILD_ELEMENTS() UI_END_MAP_ELEMENTS_AND_NAMES() - bool m_bGameModeSurvival; + bool m_bGameModeCreative; + int m_iGameModeId; bool m_bMultiplayerAllowed; DLCPack * m_pDLCPack; bool m_bRebuildTouchBoxes; @@ -97,7 +88,6 @@ private: protected: static int KeyboardCompleteWorldNameCallback(LPVOID lpParam,const bool bRes); - static int KeyboardCompleteSeedCallback(LPVOID lpParam,const bool bRes); void handlePress(F64 controlId, F64 childId); void handleSliderMove(F64 sliderId, F64 currentValue); diff --git a/Minecraft.Client/Common/UI/UIScene_CreativeMenu.cpp b/Minecraft.Client/Common/UI/UIScene_CreativeMenu.cpp index 569cc8ba..0895cdff 100644 --- a/Minecraft.Client/Common/UI/UIScene_CreativeMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_CreativeMenu.cpp @@ -21,7 +21,7 @@ UIScene_CreativeMenu::UIScene_CreativeMenu(int iPad, void *_initData, UILayer *p InventoryScreenInput *initData = (InventoryScreenInput *)_initData; - shared_ptr creativeContainer = shared_ptr(new SimpleContainer( 0, TabSpec::MAX_SIZE )); + shared_ptr creativeContainer = shared_ptr(new SimpleContainer( 0, L"", false, TabSpec::MAX_SIZE )); itemPickerMenu = new ItemPickerMenu(creativeContainer, initData->player->inventory); Initialize( initData->iPad, itemPickerMenu, false, -1, eSectionInventoryCreativeUsing, eSectionInventoryCreativeMax, initData->bNavigateBack); @@ -158,26 +158,6 @@ void UIScene_CreativeMenu::handleOtherClicked(int iPad, ESceneSection eSection, } } -void UIScene_CreativeMenu::ScrollBar(UIVec2D pointerPos) -{ - float fPosition = ((float)pointerPos.y - (float)m_TouchInput[ETouchInput_TouchSlider].getYPos()) / (float)m_TouchInput[ETouchInput_TouchSlider].getHeight(); - - // clamp - if(fPosition > 1) - fPosition = 1.0f; - else if(fPosition < 0) - fPosition = 0.0f; - - // calculate page position according to page count - int iCurrentPage = Math::round(fPosition * (specs[m_curTab]->getPageCount() - 1)); - - // set tab page - m_tabPage[m_curTab] = iCurrentPage; - - // update tab - switchTab(m_curTab); -} - void UIScene_CreativeMenu::handleReload() { Initialize( m_iPad, m_menu, false, -1, eSectionInventoryCreativeUsing, eSectionInventoryCreativeMax, m_bNavigateBack ); @@ -191,6 +171,10 @@ void UIScene_CreativeMenu::handleReload() { m_slotListHotbar.addSlot(i); } + + ECreativeInventoryTabs lastTab = m_curTab; + m_curTab = eCreativeInventoryTab_COUNT; + switchTab(lastTab); } void UIScene_CreativeMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) diff --git a/Minecraft.Client/Common/UI/UIScene_CreativeMenu.h b/Minecraft.Client/Common/UI/UIScene_CreativeMenu.h index 6fbec2ba..530a7512 100644 --- a/Minecraft.Client/Common/UI/UIScene_CreativeMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_CreativeMenu.h @@ -80,7 +80,6 @@ public: virtual void handleTouchBoxRebuild(); virtual void handleTimerComplete(int id); #endif - virtual void ScrollBar(UIVec2D pointerPos); private: // IUIScene_CreativeMenu diff --git a/Minecraft.Client/Common/UI/UIScene_Credits.cpp b/Minecraft.Client/Common/UI/UIScene_Credits.cpp index 11558598..75ddf92f 100644 --- a/Minecraft.Client/Common/UI/UIScene_Credits.cpp +++ b/Minecraft.Client/Common/UI/UIScene_Credits.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "UI.h" +#include "..\Minecraft.World\StringHelpers.h" #include "UIScene_Credits.h" #define CREDIT_ICON -2 @@ -50,7 +51,16 @@ SCreditTextItemDef UIScene_Credits::gs_aCreditDefs[MAX_CREDIT_STRINGS] = { L"Patrick Geuder", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, { L"%ls", IDS_CREDITS_MUSICANDSOUNDS, NO_TRANSLATED_STRING,eLargeText }, { L"Daniel Rosenfeld (C418)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, - { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + +// Added credit for horses + { L"Developers of Mo' Creatures:", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eExtraLargeText }, + { L"John Olarte (DrZhark)", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Kent Christian Jensen", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"Dan Roque", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, + { L"", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, // extra blank line + + { L"4J Studios", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eExtraLargeText }, { L"%ls", IDS_CREDITS_PROGRAMMING, NO_TRANSLATED_STRING,eLargeText }, { L"Paddy Burns", NO_TRANSLATED_STRING, NO_TRANSLATED_STRING,eSmallText }, @@ -584,27 +594,38 @@ void UIScene_Credits::tick() // Set up the new text element. if(pDef->m_Text!=NULL) // 4J-PB - think the RAD logo ones aren't set up yet and are coming is as null - { - + { if ( pDef->m_iStringID[0] == CREDIT_ICON ) { addImage((ECreditIcons)pDef->m_iStringID[1]); - } - else if ( pDef->m_iStringID[0] == NO_TRANSLATED_STRING ) - { - setNextLabel(pDef->m_Text,pDef->m_eType); - } + } else // using additional translated string. { - 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 1c07e540..d4d83228 100644 --- a/Minecraft.Client/Common/UI/UIScene_LoadMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_LoadMenu.cpp @@ -33,24 +33,27 @@ int UIScene_LoadMenu::m_iDifficultyTitleSettingA[4]= int UIScene_LoadMenu::LoadSaveDataThumbnailReturned(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes) { - UIScene_LoadMenu *pClass= (UIScene_LoadMenu *)lpParam; + UIScene_LoadMenu *pClass= (UIScene_LoadMenu *)ui.GetSceneFromCallbackId((size_t)lpParam); - app.DebugPrintf("Received data for a thumbnail\n"); - - if(pbThumbnail && dwThumbnailBytes) + if(pClass) { - pClass->registerSubstitutionTexture(pClass->m_thumbnailName,pbThumbnail,dwThumbnailBytes); + app.DebugPrintf("Received data for a thumbnail\n"); - pClass->m_pbThumbnailData = pbThumbnail; - pClass->m_uiThumbnailSize = dwThumbnailBytes; - pClass->m_bSaveThumbnailReady = true; + 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 } @@ -457,6 +466,26 @@ void UIScene_LoadMenu::tick() m_MoreOptionsParams.bTNT = app.GetGameHostOption(uiHostOptions,eGameHostOption_TNT)>0?TRUE:FALSE; m_MoreOptionsParams.bHostPrivileges = app.GetGameHostOption(uiHostOptions,eGameHostOption_CheatsEnabled)>0?TRUE:FALSE; m_MoreOptionsParams.bDisableSaving = app.GetGameHostOption(uiHostOptions,eGameHostOption_DisableSaving)>0?TRUE:FALSE; + m_MoreOptionsParams.currentWorldSize = (EGameHostOptionWorldSize)app.GetGameHostOption(uiHostOptions,eGameHostOption_WorldSize); + m_MoreOptionsParams.newWorldSize = m_MoreOptionsParams.currentWorldSize; + + m_MoreOptionsParams.bMobGriefing = app.GetGameHostOption(uiHostOptions, eGameHostOption_MobGriefing); + m_MoreOptionsParams.bKeepInventory = app.GetGameHostOption(uiHostOptions, eGameHostOption_KeepInventory); + m_MoreOptionsParams.bDoMobSpawning = app.GetGameHostOption(uiHostOptions, eGameHostOption_DoMobSpawning); + m_MoreOptionsParams.bDoMobLoot = app.GetGameHostOption(uiHostOptions, eGameHostOption_DoMobLoot); + m_MoreOptionsParams.bDoTileDrops = app.GetGameHostOption(uiHostOptions, eGameHostOption_DoTileDrops); + m_MoreOptionsParams.bNaturalRegeneration = app.GetGameHostOption(uiHostOptions, eGameHostOption_NaturalRegeneration); + m_MoreOptionsParams.bDoDaylightCycle = app.GetGameHostOption(uiHostOptions, eGameHostOption_DoDaylightCycle); + + bool cheatsOn = m_MoreOptionsParams.bHostPrivileges; + if (!cheatsOn) + { + // Set defaults + m_MoreOptionsParams.bMobGriefing = true; + m_MoreOptionsParams.bKeepInventory = false; + m_MoreOptionsParams.bDoMobSpawning = true; + m_MoreOptionsParams.bDoDaylightCycle = true; + } // turn off creative mode on the save // #ifdef _DEBUG @@ -464,6 +493,11 @@ void UIScene_LoadMenu::tick() // app.SetGameHostOption(eGameHostOption_HasBeenInCreative, 0); // #endif + if(app.GetGameHostOption(uiHostOptions,eGameHostOption_WasntSaveOwner)>0) + { + m_bIsSaveOwner = false; + } + m_bHasBeenInCreative = app.GetGameHostOption(uiHostOptions,eGameHostOption_HasBeenInCreative)>0; if(app.GetGameHostOption(uiHostOptions,eGameHostOption_HasBeenInCreative)>0) { @@ -474,11 +508,27 @@ void UIScene_LoadMenu::tick() m_labelCreatedMode.setLabel( app.GetString(IDS_CREATED_IN_SURVIVAL) ); } - if(app.GetGameHostOption(uiHostOptions,eGameHostOption_GameType)>0) - { + switch(app.GetGameHostOption(uiHostOptions,eGameHostOption_GameType)) + { + case 1: // Creative m_buttonGamemode.setLabel(app.GetString(IDS_GAMEMODE_CREATIVE)); - m_bGameModeSurvival=false; - } + m_bGameModeCreative=true; + m_iGameModeId = GameType::CREATIVE->getId(); + break; +#ifdef _ADVENTURE_MODE_ENABLED + case 2: // Adventure + m_buttonGamemode.setLabel(app.GetString(IDS_GAMEMODE_ADVENTURE)); + m_bGameModeCreative=false; + m_iGameModeId = GameType::ADVENTURE->getId(); + break; +#endif + case 0: // Survival + default: + m_buttonGamemode.setLabel(app.GetString(IDS_GAMEMODE_SURVIVAL)); + m_bGameModeCreative=false; + m_iGameModeId = GameType::SURVIVAL->getId(); + break; + }; bool bGameSetting_Online=(app.GetGameSettings(m_iPad,eGameSetting_Online)!=0); if(app.GetGameHostOption(uiHostOptions,eGameHostOption_FriendsOfFriends) && !(m_bMultiplayerAllowed && bGameSetting_Online)) @@ -545,7 +595,7 @@ void UIScene_LoadMenu::tick() uiIDA[0]=IDS_PRO_NOTONLINE_DECLINE; // Give the player a warning about the texture pack missing - ui.RequestMessageBox(IDS_PLAY_OFFLINE,IDS_NO_PLAYSTATIONPLUS, uiIDA, 1, ProfileManager.GetPrimaryPad(),&UIScene_LoadMenu::ContinueOffline,this,app.GetStringTable(), 0, 0, false); + ui.RequestAlertMessage(IDS_PLAY_OFFLINE,IDS_NO_PLAYSTATIONPLUS, uiIDA, 1, ProfileManager.GetPrimaryPad(),&UIScene_LoadMenu::ContinueOffline,this); } } break; @@ -599,7 +649,7 @@ void UIScene_LoadMenu::handleInput(int iPad, int key, bool repeat, bool pressed, if ( pressed && controlHasFocus(m_checkboxOnline.getId()) && !m_checkboxOnline.IsEnabled() ) { UINT uiIDA[1] = { IDS_CONFIRM_OK }; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad); } #endif @@ -610,23 +660,19 @@ void UIScene_LoadMenu::handleInput(int iPad, int key, bool repeat, bool pressed, case ACTION_MENU_OTHER_STICK_UP: case ACTION_MENU_OTHER_STICK_DOWN: sendInputToMovie(key, repeat, pressed, released); - -#if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 - if(getSceneResolution() == eSceneResolution_1080) - { - bool bOnlineGame = m_checkboxOnline.IsChecked(); - if (m_MoreOptionsParams.bOnlineGame != bOnlineGame) - { - 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; } @@ -642,16 +688,26 @@ void UIScene_LoadMenu::handlePress(F64 controlId, F64 childId) switch((int)controlId) { case eControl_GameMode: - if(m_bGameModeSurvival) + switch(m_iGameModeId) { + case 0: // Survival m_buttonGamemode.setLabel(app.GetString(IDS_GAMEMODE_CREATIVE)); - m_bGameModeSurvival=false; - } - else - { + m_iGameModeId = GameType::CREATIVE->getId(); + m_bGameModeCreative = true; + break; + case 1: // Creative +#ifdef _ADVENTURE_MODE_ENABLED + m_buttonGamemode.setLabel(app.GetString(IDS_GAMEMODE_ADVENTURE)); + m_iGameModeId = GameType::ADVENTURE->getId(); + m_bGameModeCreative = false; + break; + case 2: // Adventure +#endif m_buttonGamemode.setLabel(app.GetString(IDS_GAMEMODE_SURVIVAL)); - m_bGameModeSurvival=true; - } + m_iGameModeId = GameType::SURVIVAL->getId(); + m_bGameModeCreative = false; + break; + }; break; case eControl_MoreOptions: ui.NavigateToScene(m_iPad, eUIScene_LaunchMoreOptionsMenu, &m_MoreOptionsParams); @@ -729,7 +785,7 @@ void UIScene_LoadMenu::StartSharedLaunchFlow() uiIDA[1]=IDS_CONFIRM_CANCEL; // Give the player a warning about the texture pack missing - ui.RequestMessageBox(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&TexturePackDialogReturned,this,app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&TexturePackDialogReturned,this); return; } } @@ -799,13 +855,13 @@ void UIScene_LoadMenu::StartSharedLaunchFlow() // trial pack warning UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_USING_TRIAL_TEXUREPACK_WARNING, uiIDA, 1, m_iPad,&TrialTexturePackWarningReturned,this,app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_USING_TRIAL_TEXUREPACK_WARNING, uiIDA, 1, m_iPad,&TrialTexturePackWarningReturned,this); #elif defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) // trial pack warning UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_OK; uiIDA[1]=IDS_CONFIRM_CANCEL; - ui.RequestMessageBox(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_USING_TRIAL_TEXUREPACK_WARNING, uiIDA, 2, m_iPad,&TrialTexturePackWarningReturned,this,app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_USING_TRIAL_TEXUREPACK_WARNING, uiIDA, 2, m_iPad,&TrialTexturePackWarningReturned,this); #endif #if defined _XBOX_ONE || defined __ORBIS__ @@ -815,11 +871,45 @@ void UIScene_LoadMenu::StartSharedLaunchFlow() } } } + app.SetGameHostOption(eGameHostOption_WasntSaveOwner, (!m_bIsSaveOwner)); #if defined _XBOX_ONE || defined __ORBIS__ app.SetGameHostOption(eGameHostOption_DisableSaving, m_MoreOptionsParams.bDisableSaving?1:0); - StorageManager.SetSaveDisabled(m_MoreOptionsParams.bDisableSaving); + + int newWorldSize = 0; + int newHellScale = 0; + switch(m_MoreOptionsParams.newWorldSize) + { + case e_worldSize_Unknown: + newWorldSize = 0; + newHellScale = 0; + break; + case e_worldSize_Classic: + newWorldSize = LEVEL_WIDTH_CLASSIC; + newHellScale = HELL_LEVEL_SCALE_CLASSIC; + break; + case e_worldSize_Small: + newWorldSize = LEVEL_WIDTH_SMALL; + newHellScale = HELL_LEVEL_SCALE_SMALL; + break; + case e_worldSize_Medium: + newWorldSize = LEVEL_WIDTH_MEDIUM; + newHellScale = HELL_LEVEL_SCALE_MEDIUM; + break; + case e_worldSize_Large: + newWorldSize = LEVEL_WIDTH_LARGE; + newHellScale = HELL_LEVEL_SCALE_LARGE; + break; + default: + assert(0); + break; + } + bool bUseMoat = !m_MoreOptionsParams.newWorldSizeOverwriteEdges; + app.SetGameNewWorldSize(newWorldSize, bUseMoat); + app.SetGameNewHellScale(newHellScale); + app.SetGameHostOption(eGameHostOption_WorldSize, m_MoreOptionsParams.newWorldSize); + #endif #if TO_BE_IMPLEMENTED @@ -834,7 +924,7 @@ void UIScene_LoadMenu::StartSharedLaunchFlow() uiIDA[0]=IDS_DONT_RESET_NETHER; uiIDA[1]=IDS_RESET_NETHER; - ui.RequestMessageBox(IDS_RESETNETHER_TITLE, IDS_RESETNETHER_TEXT, uiIDA, 2, m_iPad,&UIScene_LoadMenu::CheckResetNetherReturned,this,app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage(IDS_RESETNETHER_TITLE, IDS_RESETNETHER_TEXT, uiIDA, 2, m_iPad,&UIScene_LoadMenu::CheckResetNetherReturned,this); } else { @@ -905,13 +995,9 @@ void UIScene_LoadMenu::handleTimerComplete(int id) m_MoreOptionsParams.bInviteOnly = FALSE; m_MoreOptionsParams.bAllowFriendsOfFriends = FALSE; } -#if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 - if(getSceneResolution() == eSceneResolution_1080) - { - m_checkboxOnline.SetEnable(bMultiplayerAllowed); - m_checkboxOnline.setChecked(m_MoreOptionsParams.bOnlineGame); - } -#endif + + m_checkboxOnline.SetEnable(bMultiplayerAllowed); + m_checkboxOnline.setChecked(m_MoreOptionsParams.bOnlineGame); m_bMultiplayerAllowed = bMultiplayerAllowed; } @@ -988,17 +1074,17 @@ void UIScene_LoadMenu::LaunchGame(void) killTimer(CHECKFORAVAILABLETEXTUREPACKS_TIMER_ID); #endif - if( (m_bGameModeSurvival != true || m_bHasBeenInCreative) || m_MoreOptionsParams.bHostPrivileges == TRUE) + if( (m_bGameModeCreative == true || m_bHasBeenInCreative) || m_MoreOptionsParams.bHostPrivileges == TRUE) { UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_OK; uiIDA[1]=IDS_CONFIRM_CANCEL; - if(m_bGameModeSurvival != true || m_bHasBeenInCreative) + if(m_bGameModeCreative == true || m_bHasBeenInCreative) { // 4J-PB - Need different text for Survival mode with a level that has been saved in Creative - if(m_bGameModeSurvival) + if(!m_bGameModeCreative) { - ui.RequestMessageBox(IDS_TITLE_START_GAME, IDS_CONFIRM_START_SAVEDINCREATIVE, uiIDA, 2, m_iPad,&UIScene_LoadMenu::ConfirmLoadReturned,this,app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage(IDS_TITLE_START_GAME, IDS_CONFIRM_START_SAVEDINCREATIVE, uiIDA, 2, m_iPad,&UIScene_LoadMenu::ConfirmLoadReturned,this); } else // it's creative mode { @@ -1012,7 +1098,8 @@ void UIScene_LoadMenu::LaunchGame(void) if(m_levelGen != NULL) { - LoadLevelGen(m_levelGen); + m_bIsCorrupt = false; + LoadDataComplete(this); } else { @@ -1032,7 +1119,7 @@ void UIScene_LoadMenu::LaunchGame(void) StorageManager.SetSaveDeviceSelected(m_iPad,false); UINT uiIDA[1]; uiIDA[0]=IDS_OK; - ui.RequestMessageBox(IDS_STORAGEDEVICEPROBLEM_TITLE, IDS_FAILED_TO_LOADSAVE_TEXT, uiIDA, 1, m_iPad,&CScene_LoadGameSettings::DeviceRemovedDialogReturned,this); + ui.RequestErrorMessage(IDS_STORAGEDEVICEPROBLEM_TITLE, IDS_FAILED_TO_LOADSAVE_TEXT, uiIDA, 1, m_iPad,&CScene_LoadGameSettings::DeviceRemovedDialogReturned,this); } #endif @@ -1041,20 +1128,21 @@ void UIScene_LoadMenu::LaunchGame(void) else { // ask if they're sure they want to turn this into a creative map - ui.RequestMessageBox(IDS_TITLE_START_GAME, IDS_CONFIRM_START_CREATIVE, uiIDA, 2, m_iPad,&UIScene_LoadMenu::ConfirmLoadReturned,this,app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage(IDS_TITLE_START_GAME, IDS_CONFIRM_START_CREATIVE, uiIDA, 2, m_iPad,&UIScene_LoadMenu::ConfirmLoadReturned,this); } } } else { - ui.RequestMessageBox(IDS_TITLE_START_GAME, IDS_CONFIRM_START_HOST_PRIVILEGES, uiIDA, 2, m_iPad,&UIScene_LoadMenu::ConfirmLoadReturned,this,app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage(IDS_TITLE_START_GAME, IDS_CONFIRM_START_HOST_PRIVILEGES, uiIDA, 2, m_iPad,&UIScene_LoadMenu::ConfirmLoadReturned,this); } } else { if(m_levelGen != NULL) { - LoadLevelGen(m_levelGen); + m_bIsCorrupt = false; + LoadDataComplete(this); } else { @@ -1073,7 +1161,7 @@ void UIScene_LoadMenu::LaunchGame(void) StorageManager.SetSaveDeviceSelected(m_iPad,false); UINT uiIDA[1]; uiIDA[0]=IDS_OK; - ui.RequestMessageBox(IDS_STORAGEDEVICEPROBLEM_TITLE, IDS_FAILED_TO_LOADSAVE_TEXT, uiIDA, 1, m_iPad,&CScene_LoadGameSettings::DeviceRemovedDialogReturned,this); + ui.RequestErrorMessage(IDS_STORAGEDEVICEPROBLEM_TITLE, IDS_FAILED_TO_LOADSAVE_TEXT, uiIDA, 1, m_iPad,&CScene_LoadGameSettings::DeviceRemovedDialogReturned,this); } #endif } @@ -1113,7 +1201,8 @@ int UIScene_LoadMenu::ConfirmLoadReturned(void *pParam,int iPad,C4JStorage::EMes { if(pClass->m_levelGen != NULL) { - pClass->LoadLevelGen(pClass->m_levelGen); + pClass->m_bIsCorrupt = false; + pClass->LoadDataComplete(pClass); } else { @@ -1132,9 +1221,9 @@ int UIScene_LoadMenu::ConfirmLoadReturned(void *pParam,int iPad,C4JStorage::EMes StorageManager.SetSaveDeviceSelected(m_iPad,false); UINT uiIDA[1]; uiIDA[0]=IDS_OK; - ui.RequestMessageBox(IDS_STORAGEDEVICEPROBLEM_TITLE, IDS_FAILED_TO_LOADSAVE_TEXT, uiIDA, 1, m_iPad,&CScene_LoadGameSettings::DeviceRemovedDialogReturned,this); + ui.RequestErrorMessage(IDS_STORAGEDEVICEPROBLEM_TITLE, IDS_FAILED_TO_LOADSAVE_TEXT, uiIDA, 1, m_iPad,&CScene_LoadGameSettings::DeviceRemovedDialogReturned,this); } -#endif +#endif } } else @@ -1183,7 +1272,7 @@ int UIScene_LoadMenu::LoadDataComplete(void *pParam) // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive if the npAvailability isn't SCE_OK UINT uiIDA[1]; uiIDA[0]=IDS_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive); } else { @@ -1191,14 +1280,14 @@ int UIScene_LoadMenu::LoadDataComplete(void *pParam) UINT uiIDA[2]; uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; uiIDA[1] = IDS_CANCEL; - ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPadNotSignedInLive, &UIScene_LoadMenu::MustSignInReturnedPSN, pClass, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPadNotSignedInLive, &UIScene_LoadMenu::MustSignInReturnedPSN, pClass); } return 0; #else pClass->m_bIgnoreInput=false; UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); return 0; #endif } @@ -1257,6 +1346,15 @@ int UIScene_LoadMenu::LoadDataComplete(void *pParam) pClass->setVisible( true ); pClass->m_bIgnoreInput=false; + if(ProfileManager.RequestingPlaystationPlus(iPadWithNoPlaystationPlus)) + { + // MGH - added this so we don't try and upsell when we don't know if the player has PS Plus yet (if it can't connect to the PS Plus server). + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestAlertMessage(IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, ProfileManager.GetPrimaryPad(), NULL, NULL); + return 0; + } + // 4J-PB - we're not allowed to show the text Playstation Plus - have to call the upsell all the time! // upsell psplus int32_t iResult=sceNpCommerceDialogInitialize(); @@ -1317,6 +1415,15 @@ int UIScene_LoadMenu::LoadDataComplete(void *pParam) pClass->setVisible( true ); pClass->m_bIgnoreInput=false; + if(ProfileManager.RequestingPlaystationPlus(iPadWithNoPlaystationPlus)) + { + // MGH - added this so we don't try and upsell when we don't know if the player has PS Plus yet (if it can't connect to the PS Plus server). + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestAlertMessage(IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, ProfileManager.GetPrimaryPad(), NULL, NULL); + return 0; + } + // 4J-PB - we're not allowed to show the text Playstation Plus - have to call the upsell all the time! // upsell psplus int32_t iResult=sceNpCommerceDialogInitialize(); @@ -1357,7 +1464,7 @@ int UIScene_LoadMenu::LoadDataComplete(void *pParam) UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_CORRUPT_OR_DAMAGED_SAVE_TITLE, IDS_CORRUPT_OR_DAMAGED_SAVE_TEXT, uiIDA, 2, pClass->m_iPad,&UIScene_LoadMenu::DeleteSaveDialogReturned,pClass, app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage(IDS_CORRUPT_OR_DAMAGED_SAVE_TITLE, IDS_CORRUPT_OR_DAMAGED_SAVE_TEXT, uiIDA, 2, pClass->m_iPad,&UIScene_LoadMenu::DeleteSaveDialogReturned,pClass); } @@ -1369,6 +1476,14 @@ int UIScene_LoadMenu::LoadSaveDataReturned(void *pParam,bool bIsCorrupt, bool bI UIScene_LoadMenu* pClass = (UIScene_LoadMenu*)pParam; pClass->m_bIsCorrupt=bIsCorrupt; + +#if defined(__PS3__) || defined(__ORBIS__) || defined (__PSVITA__) + if(app.GetGameHostOption(eGameHostOption_WasntSaveOwner)) + { + bIsOwner = false; + } +#endif + if(bIsOwner) { LoadDataComplete(pClass); @@ -1382,8 +1497,9 @@ int UIScene_LoadMenu::LoadSaveDataReturned(void *pParam,bool bIsCorrupt, bool bI // show the message that trophies are disabled UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_SAVEDATA_COPIED_TITLE, IDS_SAVEDATA_COPIED_TEXT, uiIDA, 1, - pClass->m_iPad,&UIScene_LoadMenu::TrophyDialogReturned,pClass, app.GetStringTable()); + ui.RequestErrorMessage(IDS_SAVEDATA_COPIED_TITLE, IDS_SAVEDATA_COPIED_TEXT, uiIDA, 1, + pClass->m_iPad,&UIScene_LoadMenu::TrophyDialogReturned,pClass); + app.SetGameHostOption(eGameHostOption_WasntSaveOwner, true); #endif } @@ -1427,9 +1543,18 @@ int UIScene_LoadMenu::DeleteSaveDataReturned(void *pParam,bool bSuccess) // 4J Stu - Shared functionality that is the same whether we needed a quadrant sign-in or not void UIScene_LoadMenu::StartGameFromSave(UIScene_LoadMenu* pClass, DWORD dwLocalUsersMask) { - INT saveOrCheckpointId = 0; - bool validSave = StorageManager.GetSaveUniqueNumber(&saveOrCheckpointId); - TelemetryManager->RecordLevelResume(pClass->m_iPad, eSen_FriendOrMatch_Playing_With_Invited_Friends, eSen_CompeteOrCoop_Coop_and_Competitive, app.GetGameSettings(pClass->m_iPad,eGameSetting_Difficulty), app.GetLocalPlayerCount(), g_NetworkManager.GetOnlinePlayerCount(), saveOrCheckpointId); + if(pClass->m_levelGen == NULL) + { + INT saveOrCheckpointId = 0; + bool validSave = StorageManager.GetSaveUniqueNumber(&saveOrCheckpointId); + TelemetryManager->RecordLevelResume(pClass->m_iPad, eSen_FriendOrMatch_Playing_With_Invited_Friends, eSen_CompeteOrCoop_Coop_and_Competitive, app.GetGameSettings(pClass->m_iPad,eGameSetting_Difficulty), app.GetLocalPlayerCount(), g_NetworkManager.GetOnlinePlayerCount(), saveOrCheckpointId); + } + else + { + StorageManager.ResetSaveData(); + // Make our next save default to the name of the level + StorageManager.SetSaveTitle(pClass->m_levelGen->getDefaultSaveName().c_str()); + } bool isClientSide = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && pClass->m_MoreOptionsParams.bOnlineGame; #ifdef __PSVITA__ @@ -1446,7 +1571,8 @@ void UIScene_LoadMenu::StartGameFromSave(UIScene_LoadMenu* pClass, DWORD dwLocal NetworkGameInitData *param = new NetworkGameInitData(); param->seed = pClass->m_seed; - param->saveData = NULL; + param->saveData = NULL; + param->levelGen = pClass->m_levelGen; param->texturePackId = pClass->m_MoreOptionsParams.dwTexturePack; Minecraft *pMinecraft = Minecraft::GetInstance(); @@ -1467,12 +1593,26 @@ void UIScene_LoadMenu::StartGameFromSave(UIScene_LoadMenu* pClass, DWORD dwLocal app.SetGameHostOption(eGameHostOption_HostCanChangeHunger,pClass->m_MoreOptionsParams.bHostPrivileges); app.SetGameHostOption(eGameHostOption_HostCanBeInvisible,pClass->m_MoreOptionsParams.bHostPrivileges ); + app.SetGameHostOption(eGameHostOption_MobGriefing, pClass->m_MoreOptionsParams.bMobGriefing); + app.SetGameHostOption(eGameHostOption_KeepInventory, pClass->m_MoreOptionsParams.bKeepInventory); + app.SetGameHostOption(eGameHostOption_DoMobSpawning, pClass->m_MoreOptionsParams.bDoMobSpawning); + app.SetGameHostOption(eGameHostOption_DoMobLoot, pClass->m_MoreOptionsParams.bDoMobLoot); + app.SetGameHostOption(eGameHostOption_DoTileDrops, pClass->m_MoreOptionsParams.bDoTileDrops); + app.SetGameHostOption(eGameHostOption_NaturalRegeneration, pClass->m_MoreOptionsParams.bNaturalRegeneration); + app.SetGameHostOption(eGameHostOption_DoDaylightCycle, pClass->m_MoreOptionsParams.bDoDaylightCycle); + +#ifdef _LARGE_WORLDS + app.SetGameHostOption(eGameHostOption_WorldSize, pClass->m_MoreOptionsParams.worldSize+1 ); // 0 is GAME_HOST_OPTION_WORLDSIZE_UNKNOWN +#endif +// app.SetGameNewWorldSize(64, true ); +// app.SetGameNewWorldSize(0, false ); + // flag if the user wants to reset the Nether to force a Fortress with netherwart etc. app.SetResetNether((pClass->m_MoreOptionsParams.bResetNether==TRUE)?true:false); // clear out the app's terrain features list app.ClearTerrainFeaturePosition(); - app.SetGameHostOption(eGameHostOption_GameType,pClass->m_bGameModeSurvival?GameType::SURVIVAL->getId():GameType::CREATIVE->getId() ); + app.SetGameHostOption(eGameHostOption_GameType,pClass->m_iGameModeId ); g_NetworkManager.HostGame(dwLocalUsersMask,isClientSide,isPrivate,MINECRAFT_NET_MAX_PLAYERS,0); @@ -1508,7 +1648,7 @@ void UIScene_LoadMenu::checkStateAndStartGame() uiIDA[0]=IDS_DONT_RESET_NETHER; uiIDA[1]=IDS_RESET_NETHER; - ui.RequestMessageBox(IDS_RESETNETHER_TITLE, IDS_RESETNETHER_TEXT, uiIDA, 2, m_iPad,&UIScene_LoadMenu::CheckResetNetherReturned,this,app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage(IDS_RESETNETHER_TITLE, IDS_RESETNETHER_TEXT, uiIDA, 2, m_iPad,&UIScene_LoadMenu::CheckResetNetherReturned,this); } else { @@ -1516,113 +1656,6 @@ void UIScene_LoadMenu::checkStateAndStartGame() } } -void UIScene_LoadMenu::LoadLevelGen(LevelGenerationOptions *levelGen) -{ - bool isClientSide = ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && m_MoreOptionsParams.bOnlineGame; - - // 4J Stu - If we only have one controller connected, then don't show the sign-in UI again - DWORD connectedControllers = 0; - for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) - { - if( InputManager.IsPadConnected(i) || ProfileManager.IsSignedIn(i) ) ++connectedControllers; - } - - if(!isClientSide || connectedControllers == 1 || !RenderManager.IsHiDef()) - { - - // Check if user-created content is allowed, as we cannot play multiplayer if it's not - bool noUGC = false; - BOOL pccAllowed = TRUE; - BOOL pccFriendsAllowed = TRUE; - - ProfileManager.AllowedPlayerCreatedContent(ProfileManager.GetPrimaryPad(),false,&pccAllowed,&pccFriendsAllowed); - if(!pccAllowed && !pccFriendsAllowed) noUGC = true; - - if(isClientSide && noUGC ) - { - m_bIgnoreInput=false; - UINT uiIDA[1]; - uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(),NULL,0,false); - return; - } - - } - - DWORD dwLocalUsersMask = 0; - - dwLocalUsersMask |= CGameNetworkManager::GetLocalPlayerMask(ProfileManager.GetPrimaryPad()); - // Load data from disc - //File saveFile( L"Tutorial\\Tutorial" ); - //LoadSaveFromDisk(&saveFile); - - StorageManager.ResetSaveData(); - // Make our next save default to the name of the level - StorageManager.SetSaveTitle(levelGen->getDefaultSaveName().c_str()); - - bool isPrivate = (app.GetGameSettings(m_iPad,eGameSetting_InviteOnly)>0)?true:false; - - g_NetworkManager.HostGame(dwLocalUsersMask,isClientSide,isPrivate,MINECRAFT_NET_MAX_PLAYERS,0); - - NetworkGameInitData *param = new NetworkGameInitData(); - param->seed = 0; - param->saveData = NULL; - param->levelGen = levelGen; - - if(levelGen->requiresTexturePack()) - { - param->texturePackId = levelGen->getRequiredTexturePackId(); - - Minecraft *pMinecraft = Minecraft::GetInstance(); - pMinecraft->skins->selectTexturePackById(param->texturePackId); - //pMinecraft->skins->updateUI(); - } - - - app.SetGameHostOption(eGameHostOption_Difficulty,Minecraft::GetInstance()->options->difficulty); - app.SetGameHostOption(eGameHostOption_FriendsOfFriends,app.GetGameSettings(m_iPad,eGameSetting_FriendsOfFriends)); - app.SetGameHostOption(eGameHostOption_Gamertags,app.GetGameSettings(m_iPad,eGameSetting_GamertagsVisible)); - - app.SetGameHostOption(eGameHostOption_BedrockFog,app.GetGameSettings(m_iPad,eGameSetting_BedrockFog)?1:0); - - app.SetGameHostOption(eGameHostOption_PvP,m_MoreOptionsParams.bPVP); - app.SetGameHostOption(eGameHostOption_TrustPlayers,m_MoreOptionsParams.bTrust ); - app.SetGameHostOption(eGameHostOption_FireSpreads,m_MoreOptionsParams.bFireSpreads ); - app.SetGameHostOption(eGameHostOption_TNT,m_MoreOptionsParams.bTNT ); - app.SetGameHostOption(eGameHostOption_HostCanFly,m_MoreOptionsParams.bHostPrivileges); - app.SetGameHostOption(eGameHostOption_HostCanChangeHunger,m_MoreOptionsParams.bHostPrivileges); - app.SetGameHostOption(eGameHostOption_HostCanBeInvisible,m_MoreOptionsParams.bHostPrivileges ); - - // flag if the user wants to reset the Nether to force a Fortress with netherwart etc. - app.SetResetNether((m_MoreOptionsParams.bResetNether==TRUE)?true:false); - // clear out the app's terrain features list - app.ClearTerrainFeaturePosition(); - - app.SetGameHostOption(eGameHostOption_GameType,m_bGameModeSurvival?GameType::SURVIVAL->getId():GameType::CREATIVE->getId() ); - - param->settings = app.GetGameHostOption( eGameHostOption_All ); - -#ifndef _XBOX - g_NetworkManager.FakeLocalPlayerJoined(); -#endif - - LoadingInputParams *loadingParams = new LoadingInputParams(); - loadingParams->func = &CGameNetworkManager::RunNetworkGameThreadProc; - loadingParams->lpParam = (LPVOID)param; - - // Reset the autosave time - app.SetAutosaveTimerTime(); - - UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData(); - completionData->bShowBackground=TRUE; - completionData->bShowLogo=TRUE; - completionData->type = e_ProgressCompletion_CloseAllPlayersUIScenes; - completionData->iPad = DEFAULT_XUI_MENU_USER; - loadingParams->completionData = completionData; - - ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_FullscreenProgress, loadingParams); -} - int UIScene_LoadMenu::StartGame_SignInReturned(void *pParam,bool bContinue, int iPad) { UIScene_LoadMenu* pClass = (UIScene_LoadMenu*)pParam; @@ -1670,7 +1703,7 @@ int UIScene_LoadMenu::StartGame_SignInReturned(void *pParam,bool bContinue, int // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive if the npAvailability isn't SCE_OK UINT uiIDA[1]; uiIDA[0]=IDS_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive); } else { @@ -1678,14 +1711,14 @@ int UIScene_LoadMenu::StartGame_SignInReturned(void *pParam,bool bContinue, int UINT uiIDA[2]; uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; uiIDA[1] = IDS_CANCEL; - ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPadNotSignedInLive, &UIScene_LoadMenu::MustSignInReturnedPSN, pClass, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPadNotSignedInLive, &UIScene_LoadMenu::MustSignInReturnedPSN, pClass); } return 0; #else pClass->m_bIgnoreInput=false; UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); return 0; #endif } @@ -1706,7 +1739,7 @@ int UIScene_LoadMenu::StartGame_SignInReturned(void *pParam,bool bContinue, int pClass->setVisible( true ); UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage( IDS_FAILED_TO_CREATE_GAME_TITLE, IDS_NO_USER_CREATED_CONTENT_PRIVILEGE_CREATE, uiIDA,1,ProfileManager.GetPrimaryPad()); } else { @@ -1714,7 +1747,7 @@ int UIScene_LoadMenu::StartGame_SignInReturned(void *pParam,bool bContinue, int pClass->setVisible( true ); UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_HOST_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_HOST_TEXT, uiIDA,1,ProfileManager.GetPrimaryPad()); } } else @@ -1754,13 +1787,7 @@ void UIScene_LoadMenu::handleGainFocus(bool navBack) { if(navBack) { - -#if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 - if(getSceneResolution() == eSceneResolution_1080) - { - m_checkboxOnline.setChecked(m_MoreOptionsParams.bOnlineGame == TRUE); - } -#endif + m_checkboxOnline.setChecked(m_MoreOptionsParams.bOnlineGame == TRUE); } } diff --git a/Minecraft.Client/Common/UI/UIScene_LoadMenu.h b/Minecraft.Client/Common/UI/UIScene_LoadMenu.h index e45fa09c..12955151 100644 --- a/Minecraft.Client/Common/UI/UIScene_LoadMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_LoadMenu.h @@ -22,10 +22,8 @@ private: UIControl_Button m_buttonGamemode, m_buttonMoreOptions, m_buttonLoadWorld; UIControl_Slider m_sliderDifficulty; UIControl_BitmapIcon m_bitmapIcon; - -#if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 + UIControl_CheckBox m_checkboxOnline; -#endif UI_BEGIN_MAP_ELEMENTS_AND_NAMES(IUIScene_StartGame) UI_MAP_ELEMENT( m_controlMainPanel, "MainPanel" ) @@ -35,10 +33,7 @@ private: UI_MAP_ELEMENT( m_labelSeed, "Seed") UI_MAP_ELEMENT( m_texturePackList, "TexturePackSelector") UI_MAP_ELEMENT( m_buttonGamemode, "GameModeToggle") - -#if defined _XBOX_ONE || defined __ORBIS__ || defined _WINDOWS64 UI_MAP_ELEMENT( m_checkboxOnline, "CheckboxOnline") -#endif UI_MAP_ELEMENT( m_buttonMoreOptions, "MoreOptions") UI_MAP_ELEMENT( m_buttonLoadWorld, "LoadSettings") UI_MAP_ELEMENT( m_sliderDifficulty, "Difficulty") @@ -51,8 +46,10 @@ private: int m_iSaveGameInfoIndex; int m_CurrentDifficulty; - bool m_bGameModeSurvival; + bool m_bGameModeCreative; + int m_iGameModeId; bool m_bHasBeenInCreative; + bool m_bIsSaveOwner; bool m_bRetrievingSaveThumbnail; bool m_bSaveThumbnailReady; bool m_bMultiplayerAllowed; @@ -104,7 +101,6 @@ protected: private: void StartSharedLaunchFlow(); virtual void checkStateAndStartGame(); - void LoadLevelGen(LevelGenerationOptions *levelGen); void LaunchGame(void); #ifdef _DURANGO diff --git a/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp b/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp index 1d90da77..4e48e395 100644 --- a/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.cpp @@ -8,7 +8,6 @@ #include "..\..\..\Minecraft.World\net.minecraft.world.level.chunk.storage.h" #include "..\..\..\Minecraft.World\ConsoleSaveFile.h" #include "..\..\..\Minecraft.World\ConsoleSaveFileOriginal.h" -#include "..\..\..\Minecraft.World\ConsoleSaveFileSplit.h" #include "..\..\ProgressRenderer.h" #include "..\..\MinecraftServer.h" #include "..\..\TexturePackRepository.h" @@ -17,6 +16,7 @@ #if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) #include "Common\Network\Sony\SonyHttp.h" #include "Common\Network\Sony\SonyRemoteStorage.h" +#include "DLCTexturePack.h" #endif #if defined(__ORBIS__) || defined(__PSVITA__) #include @@ -29,6 +29,7 @@ #ifdef SONY_REMOTE_STORAGE_DOWNLOAD unsigned long UIScene_LoadOrJoinMenu::m_ulFileSize=0L; wstring UIScene_LoadOrJoinMenu::m_wstrStageText=L""; +bool UIScene_LoadOrJoinMenu::m_bSaveTransferRunning = false; #endif @@ -103,9 +104,9 @@ UIScene_LoadOrJoinMenu::UIScene_LoadOrJoinMenu(int iPad, void *initData, UILayer m_buttonListSaves.init(eControl_SavesList); m_buttonListGames.init(eControl_GamesList); - m_labelSavesListTitle.init( app.GetString(IDS_START_GAME) ); - m_labelJoinListTitle.init( app.GetString(IDS_JOIN_GAME) ); - m_labelNoGames.init( app.GetString(IDS_NO_GAMES_FOUND) ); + m_labelSavesListTitle.init( IDS_START_GAME ); + m_labelJoinListTitle.init( IDS_JOIN_GAME ); + m_labelNoGames.init( IDS_NO_GAMES_FOUND ); m_labelNoGames.setVisible( false ); m_controlSavesTimer.setVisible( true ); m_controlJoinTimer.setVisible( true ); @@ -308,6 +309,14 @@ UIScene_LoadOrJoinMenu::~UIScene_LoadOrJoinMenu() void UIScene_LoadOrJoinMenu::updateTooltips() { +#if defined __PS3__ || defined __ORBIS__ || defined __PSVITA__ + if(m_eSaveTransferState!=eSaveTransfer_Idle) + { + // we're in a full screen progress for the save download here, so don't change the tooltips + return; + } +#endif + // update the tooltips // if the saves list has focus, then we should show the Delete Save tooltip // if the games list has focus, then we should the the View Gamercard tooltip @@ -548,6 +557,8 @@ void UIScene_LoadOrJoinMenu::tick() { UIScene::tick(); + + #if (defined __PS3__ || defined __ORBIS__ || defined _DURANGO || defined _WINDOWS64 || defined __PSVITA__) if(m_bExitScene) // navigate forward or back { @@ -560,6 +571,11 @@ void UIScene_LoadOrJoinMenu::tick() // Stop loading thumbnails if we navigate forwards if(hasFocus(m_iPad)) { +#ifdef SONY_REMOTE_STORAGE_DOWNLOAD + // if the loadOrJoin menu has focus again, we can clear the saveTransfer flag now. Added so we can delay the ehternet disconnect till it's cleaned up + if(m_eSaveTransferState == eSaveTransfer_Idle) + m_bSaveTransferRunning = false; +#endif #if defined(_XBOX_ONE) || defined(__ORBIS__) if(m_bUpdateSaveSize) { @@ -775,7 +791,7 @@ void UIScene_LoadOrJoinMenu::tick() { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox( IDS_CONNECTION_FAILED, IDS_IN_PARTY_SESSION_FULL, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_CONNECTION_FAILED, IDS_IN_PARTY_SESSION_FULL, uiIDA,1,ProfileManager.GetPrimaryPad()); } #endif @@ -896,7 +912,7 @@ void UIScene_LoadOrJoinMenu::AddDefaultButtons() m_iMashUpButtonsC=0; m_generators.clear(); - m_buttonListSaves.addItem(app.GetString(IDS_CREATE_NEW_WORLD)); + m_buttonListSaves.addItem(app.GetString(IDS_CREATE_NEW_WORLD)); m_iDefaultButtonsC++; int i = 0; @@ -919,8 +935,10 @@ void UIScene_LoadOrJoinMenu::AddDefaultButtons() } } + // 4J-JEV: For debug. Ignore worlds with no name. + LPCWSTR wstr = levelGen->getWorldName(); + m_buttonListSaves.addItem( wstr ); m_generators.push_back(levelGen); - m_buttonListSaves.addItem(levelGen->getWorldName()); if(uiTexturePackID!=0) { @@ -1005,7 +1023,7 @@ void UIScene_LoadOrJoinMenu::handleInput(int iPad, int key, bool repeat, bool pr { UINT uiIDA[1]; uiIDA[0] = IDS_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); break; } @@ -1018,7 +1036,7 @@ void UIScene_LoadOrJoinMenu::handleInput(int iPad, int key, bool repeat, bool pr UINT uiIDA[2]; uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(), &UIScene_LoadOrJoinMenu::MustSignInReturnedPSN, this, app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(), &UIScene_LoadOrJoinMenu::MustSignInReturnedPSN, this); } else { @@ -1061,7 +1079,7 @@ void UIScene_LoadOrJoinMenu::handleInput(int iPad, int key, bool repeat, bool pr UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_TOOLTIPS_DELETESAVE, IDS_TEXT_DELETE_SAVE, uiIDA, 2, iPad,&UIScene_LoadOrJoinMenu::DeleteSaveDialogReturned,this, app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage(IDS_TOOLTIPS_DELETESAVE, IDS_TEXT_DELETE_SAVE, uiIDA, 2, iPad,&UIScene_LoadOrJoinMenu::DeleteSaveDialogReturned,this); } else { @@ -1083,7 +1101,7 @@ void UIScene_LoadOrJoinMenu::handleInput(int iPad, int key, bool repeat, bool pr numOptions = 4; uiIDA[3]=IDS_COPYSAVE; #endif - ui.RequestMessageBox(IDS_TOOLTIPS_SAVEOPTIONS, IDS_TEXT_SAVEOPTIONS, uiIDA, numOptions, iPad,&UIScene_LoadOrJoinMenu::SaveOptionsDialogReturned,this, app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage(IDS_TOOLTIPS_SAVEOPTIONS, IDS_TEXT_SAVEOPTIONS, uiIDA, numOptions, iPad,&UIScene_LoadOrJoinMenu::SaveOptionsDialogReturned,this); } else { @@ -1092,7 +1110,7 @@ void UIScene_LoadOrJoinMenu::handleInput(int iPad, int key, bool repeat, bool pr UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_TOOLTIPS_DELETESAVE, IDS_TEXT_DELETE_SAVE, uiIDA, 2,iPad,&UIScene_LoadOrJoinMenu::DeleteSaveDialogReturned,this, app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage(IDS_TOOLTIPS_DELETESAVE, IDS_TEXT_DELETE_SAVE, uiIDA, 2,iPad,&UIScene_LoadOrJoinMenu::DeleteSaveDialogReturned,this); } } ui.PlayUISFX(eSFX_Press); @@ -1293,7 +1311,7 @@ void UIScene_LoadOrJoinMenu::handlePress(F64 controlId, F64 childId) UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_CORRUPT_OR_DAMAGED_SAVE_TITLE, IDS_CORRUPT_OR_DAMAGED_SAVE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_LoadOrJoinMenu::DeleteSaveDialogReturned,this, app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage(IDS_CORRUPT_OR_DAMAGED_SAVE_TITLE, IDS_CORRUPT_OR_DAMAGED_SAVE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_LoadOrJoinMenu::DeleteSaveDialogReturned,this); } else @@ -1324,7 +1342,7 @@ void UIScene_LoadOrJoinMenu::handlePress(F64 controlId, F64 childId) uiIDA[1]=IDS_CONFIRM_CANCEL; m_loadMenuInitData = params; - ui.RequestMessageBox(IDS_LOAD_SAVED_WORLD, IDS_CONFIRM_SYNC_REQUIRED, uiIDA, 2, ProfileManager.GetPrimaryPad(),&NeedSyncMessageReturned,this,app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage(IDS_LOAD_SAVED_WORLD, IDS_CONFIRM_SYNC_REQUIRED, uiIDA, 2, ProfileManager.GetPrimaryPad(),&NeedSyncMessageReturned,this); } else #endif @@ -1411,7 +1429,7 @@ void UIScene_LoadOrJoinMenu::CheckAndJoinGame(int gameIndex) UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; // Not allowed to play online - ui.RequestMessageBox(IDS_ONLINE_GAME, IDS_CHAT_RESTRICTION_UGC, uiIDA, 1, m_iPad,NULL,this,app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage(IDS_ONLINE_GAME, IDS_CHAT_RESTRICTION_UGC, uiIDA, 1, m_iPad,NULL,this); #else // Not allowed to play online ProfileManager.ShowSystemMessage( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION, 0 ); @@ -1440,16 +1458,26 @@ void UIScene_LoadOrJoinMenu::CheckAndJoinGame(int gameIndex) { m_bIgnoreInput = false; // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive if the npAvailability isn't SCE_OK - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPadNotSignedInLive); } else { - ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA,1,iPadNotSignedInLive, &UIScene_LoadOrJoinMenu::MustSignInReturnedPSN, this, app.GetStringTable()); + ui.RequestErrorMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA,1,iPadNotSignedInLive, &UIScene_LoadOrJoinMenu::MustSignInReturnedPSN, this); } return; } else if(bPlayStationPlus==false) { + + if(ProfileManager.RequestingPlaystationPlus(iPadWithNoPlaystationPlus)) + { + // MGH - added this so we don't try and upsell when we don't know if the player has PS Plus yet (if it can't connect to the PS Plus server). + UINT uiIDA[1]; + uiIDA[0]=IDS_OK; + ui.RequestAlertMessage(IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, ProfileManager.GetPrimaryPad(), NULL, NULL); + return; + } + // PS Plus upsell // 4J-PB - we're not allowed to show the text Playstation Plus - have to call the upsell all the time! // upsell psplus @@ -1514,10 +1542,19 @@ void UIScene_LoadOrJoinMenu::CheckAndJoinGame(int gameIndex) // Give the player a warning about the texture pack missing - ui.RequestMessageBox(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 2, m_iPad,&UIScene_LoadOrJoinMenu::TexturePackDialogReturned,this,app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage(IDS_DLC_TEXTUREPACK_NOT_PRESENT_TITLE, IDS_DLC_TEXTUREPACK_NOT_PRESENT, uiIDA, 2, m_iPad,&UIScene_LoadOrJoinMenu::TexturePackDialogReturned,this); return; } + +#ifdef __PSVITA__ + if(CGameNetworkManager::usingAdhocMode() && !SQRNetworkManager_AdHoc_Vita::GetAdhocStatus()) + { + // not connected to adhoc anymore, must have connected back to PSN to buy texture pack so sign in again + SQRNetworkManager_AdHoc_Vita::AttemptAdhocSignIn(&UIScene_LoadOrJoinMenu::SignInAdhocReturned, this); + return; + } +#endif } m_controlJoinTimer.setVisible( false ); @@ -2125,7 +2162,7 @@ int UIScene_LoadOrJoinMenu::SaveOptionsDialogReturned(void *pParam,int iPad,C4JS UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_TOOLTIPS_DELETESAVE, IDS_TEXT_DELETE_SAVE, uiIDA, 2, iPad,&UIScene_LoadOrJoinMenu::DeleteSaveDialogReturned,pClass, app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage(IDS_TOOLTIPS_DELETESAVE, IDS_TEXT_DELETE_SAVE, uiIDA, 2, iPad,&UIScene_LoadOrJoinMenu::DeleteSaveDialogReturned,pClass); } break; @@ -2136,7 +2173,7 @@ int UIScene_LoadOrJoinMenu::SaveOptionsDialogReturned(void *pParam,int iPad,C4JS uiIDA[0]=IDS_CONFIRM_OK; uiIDA[1]=IDS_CONFIRM_CANCEL; - ui.RequestMessageBox(IDS_TOOLTIPS_SAVETRANSFER_UPLOAD, IDS_SAVE_TRANSFER_TEXT, uiIDA, 2, iPad,&UIScene_LoadOrJoinMenu::SaveTransferDialogReturned,pClass, app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage(IDS_TOOLTIPS_SAVETRANSFER_UPLOAD, IDS_SAVE_TRANSFER_TEXT, uiIDA, 2, iPad,&UIScene_LoadOrJoinMenu::SaveTransferDialogReturned,pClass); } break; #endif // SONY_REMOTE_STORAGE_UPLOAD @@ -2147,7 +2184,7 @@ int UIScene_LoadOrJoinMenu::SaveOptionsDialogReturned(void *pParam,int iPad,C4JS uiIDA[0]=IDS_CONFIRM_OK; uiIDA[1]=IDS_CONFIRM_CANCEL; - ui.RequestMessageBox(IDS_COPYSAVE, IDS_TEXT_COPY_SAVE, uiIDA, 2, iPad,&UIScene_LoadOrJoinMenu::CopySaveDialogReturned,pClass, app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage(IDS_COPYSAVE, IDS_TEXT_COPY_SAVE, uiIDA, 2, iPad,&UIScene_LoadOrJoinMenu::CopySaveDialogReturned,pClass); } break; #endif @@ -2164,6 +2201,91 @@ int UIScene_LoadOrJoinMenu::SaveOptionsDialogReturned(void *pParam,int iPad,C4JS return 0; } + +#if defined (__PSVITA__) + +int UIScene_LoadOrJoinMenu::SignInAdhocReturned(void *pParam,bool bContinue, int iPad) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)pParam; + pClass->m_bIgnoreInput = false; + return 0; + +} + + + +int UIScene_LoadOrJoinMenu::MustSignInTexturePack(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)pParam; + + if(result==C4JStorage::EMessage_ResultAccept) + { + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_LoadOrJoinMenu::MustSignInReturnedTexturePack, pClass); + } + else + { + pClass->m_bIgnoreInput = false; + } + + return 0; +} + + +int UIScene_LoadOrJoinMenu::MustSignInReturnedTexturePack(void *pParam,bool bContinue, int iPad) +{ + UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu*)pParam; + + int commerceState = app.GetCommerceState(); + while( commerceState != CConsoleMinecraftApp::eCommerce_State_Offline && + commerceState != CConsoleMinecraftApp::eCommerce_State_Online && + commerceState != CConsoleMinecraftApp::eCommerce_State_Error) + { + Sleep(10); + commerceState = app.GetCommerceState(); + } + + if(bContinue==true) + { + SONYDLC *pSONYDLCInfo=app.GetSONYDLCInfo(pClass->m_initData->selectedSession->data.texturePackParentId); + if(pSONYDLCInfo!=NULL) + { + char chName[42]; + char chKeyName[20]; + char chSkuID[SCE_NP_COMMERCE2_SKU_ID_LEN]; + + memset(chSkuID,0,SCE_NP_COMMERCE2_SKU_ID_LEN); + // we have to retrieve the skuid from the store info, it can't be hardcoded since Sony may change it. + // So we assume the first sku for the product is the one we want + // MGH - keyname in the DLC file is 16 chars long, but there's no space for a NULL terminating char + memset(chKeyName, 0, sizeof(chKeyName)); + strncpy(chKeyName, pSONYDLCInfo->chDLCKeyname, 16); + +#ifdef __ORBIS__ + strcpy(chName, chKeyName); +#else + sprintf(chName,"%s-%s",app.GetCommerceCategory(),chKeyName); +#endif + app.GetDLCSkuIDFromProductList(chName,chSkuID); + // 4J-PB - need to check for an empty store + if(app.CheckForEmptyStore(iPad)==false) + { + if(app.DLCAlreadyPurchased(chSkuID)) + { + app.DownloadAlreadyPurchased(chSkuID); + } + else + { + app.Checkout(chSkuID); + } + } + } + } + pClass->m_bIgnoreInput = false; + return 0; +} + +#endif + int UIScene_LoadOrJoinMenu::TexturePackDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) { UIScene_LoadOrJoinMenu *pClass = (UIScene_LoadOrJoinMenu *)pParam; @@ -2173,24 +2295,53 @@ int UIScene_LoadOrJoinMenu::TexturePackDialogReturned(void *pParam,int iPad,C4JS { // we need to enable background downloading for the DLC XBackgroundDownloadSetMode(XBACKGROUND_DOWNLOAD_MODE_ALWAYS_ALLOW); -#if TO_BE_IMPLEMENTED - ULONGLONG ullOfferID_Full; - ULONGLONG ullIndexA[1]; - app.GetDLCFullOfferIDForPackID(pClass->m_initData->selectedSession->data.texturePackParentId,&ullOfferID_Full); +#if defined __PSVITA__ || defined __PS3__ || defined __ORBIS__ +#ifdef __PSVITA__ + if(!ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad()) && CGameNetworkManager::usingAdhocMode()) + { + // get them to sign in to online + UINT uiIDA[2]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; + ui.RequestAlertMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_LoadOrJoinMenu::MustSignInTexturePack,pClass); + return; + } +#endif - if( result==C4JStorage::EMessage_ResultAccept ) // Full version - { - ullIndexA[0]=ullOfferID_Full; - StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); + SONYDLC *pSONYDLCInfo=app.GetSONYDLCInfo(pClass->m_initData->selectedSession->data.texturePackParentId); + if(pSONYDLCInfo!=NULL) + { + char chName[42]; + char chKeyName[20]; + char chSkuID[SCE_NP_COMMERCE2_SKU_ID_LEN]; - } - else // trial version - { - DLC_INFO *pDLCInfo=app.GetDLCInfoForFullOfferID(ullOfferID_Full); - ullIndexA[0]=pDLCInfo->ullOfferID_Trial; - StorageManager.InstallOffer(1,ullIndexA,NULL,NULL); - } + memset(chSkuID,0,SCE_NP_COMMERCE2_SKU_ID_LEN); + // we have to retrieve the skuid from the store info, it can't be hardcoded since Sony may change it. + // So we assume the first sku for the product is the one we want + // MGH - keyname in the DLC file is 16 chars long, but there's no space for a NULL terminating char + memset(chKeyName, 0, sizeof(chKeyName)); + strncpy(chKeyName, pSONYDLCInfo->chDLCKeyname, 16); + +#ifdef __ORBIS__ + strcpy(chName, chKeyName); +#else + sprintf(chName,"%s-%s",app.GetCommerceCategory(),chKeyName); +#endif + app.GetDLCSkuIDFromProductList(chName,chSkuID); + // 4J-PB - need to check for an empty store + if(app.CheckForEmptyStore(iPad)==false) + { + if(app.DLCAlreadyPurchased(chSkuID)) + { + app.DownloadAlreadyPurchased(chSkuID); + } + else + { + app.Checkout(chSkuID); + } + } + } #endif @@ -2208,7 +2359,7 @@ int UIScene_LoadOrJoinMenu::TexturePackDialogReturned(void *pParam,int iPad,C4JS { // 4J-JEV: Fix for XB1: #165863 - XR-074: Compliance: With no active network connection user is unable to convert from Trial to Full texture pack and is not messaged why. UINT uiIDA[1] = { IDS_CONFIRM_OK }; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad); } } #endif @@ -2256,8 +2407,7 @@ int UIScene_LoadOrJoinMenu::PSN_SignInReturned(void *pParam,bool bContinue, int int ret = sceNpBasicRecvMessageCustom(SCE_NP_BASIC_MESSAGE_MAIN_TYPE_INVITE, SCE_NP_BASIC_RECV_MESSAGE_OPTIONS_INCLUDE_BOOTABLE, SYS_MEMORY_CONTAINER_ID_INVALID); app.DebugPrintf("sceNpBasicRecvMessageCustom return %d ( %08x )\n", ret, ret); #elif defined __PSVITA__ - // TO BE IMPLEMENTED FOR VITA - PSVITA_STUBBED; + SQRNetworkManager_Vita::RecvInviteGUI(); #else SQRNetworkManager_Orbis::RecvInviteGUI(); #endif @@ -2377,9 +2527,14 @@ bool g_bForceVitaSaveWipe = false; int UIScene_LoadOrJoinMenu::DownloadSonyCrossSaveThreadProc( LPVOID lpParameter ) { + m_bSaveTransferRunning = true; +#ifdef __PS3__ + StorageManager.SetSaveTransferInProgress(true); +#endif Compression::UseDefaultThreadStorage(); UIScene_LoadOrJoinMenu* pClass = (UIScene_LoadOrJoinMenu *) lpParameter; pClass->m_saveTransferDownloadCancelled = false; + m_bSaveTransferRunning = true; bool bAbortCalled = false; Minecraft *pMinecraft=Minecraft::GetInstance(); bool bSaveFileCreated = false; @@ -2416,14 +2571,24 @@ int UIScene_LoadOrJoinMenu::DownloadSonyCrossSaveThreadProc( LPVOID lpParameter { if(app.getRemoteStorage()->saveIsAvailable()) { - pClass->m_eSaveTransferState = eSaveTransfer_CreateDummyFile; + if(app.getRemoteStorage()->saveVersionSupported()) + { + pClass->m_eSaveTransferState = eSaveTransfer_CreateDummyFile; + } + else + { + // must be a newer version of the save in the cloud that we don't support yet + UINT uiIDA[1]; + uiIDA[0]=IDS_CONFIRM_OK; + ui.RequestAlertMessage(IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD, IDS_SAVE_TRANSFER_WRONG_VERSION, uiIDA, 1, ProfileManager.GetPrimaryPad(),RemoteSaveNotFoundCallback,pClass); + } } - else + else { // no save available, inform the user about the functionality UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD, IDS_SAVE_TRANSFER_NOT_AVAILABLE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),RemoteSaveNotFoundCallback,pClass, app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage(IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD, IDS_SAVE_TRANSFER_NOT_AVAILABLE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),RemoteSaveNotFoundCallback,pClass); } } break; @@ -2446,7 +2611,11 @@ int UIScene_LoadOrJoinMenu::DownloadSonyCrossSaveThreadProc( LPVOID lpParameter BYTE bTextMetadata[88]; ZeroMemory(bTextMetadata,88); - int iTextMetadataBytes = app.CreateImageTextData(bTextMetadata, app.getRemoteStorage()->getSaveSeed(), true, app.getRemoteStorage()->getSaveHostOptions(), app.getRemoteStorage()->getSaveTexturePack() ); + unsigned int hostOptions = app.getRemoteStorage()->getSaveHostOptions(); +#ifdef __ORBIS__ + app.SetGameHostOption(hostOptions, eGameHostOption_WorldSize, e_worldSize_Classic); // force the classic world size on, otherwise it's unknown and we can't expand +#endif + int iTextMetadataBytes = app.CreateImageTextData(bTextMetadata, app.getRemoteStorage()->getSaveSeed(), true, hostOptions, app.getRemoteStorage()->getSaveTexturePack() ); // set the icon and save image StorageManager.SetSaveImages(pbThumbnailData,dwThumbnailDataSize,pbDataSaveImage,dwDataSizeSaveImage,bTextMetadata,iTextMetadataBytes); @@ -2606,7 +2775,9 @@ int UIScene_LoadOrJoinMenu::DownloadSonyCrossSaveThreadProc( LPVOID lpParameter BYTE bTextMetadata[88]; ZeroMemory(bTextMetadata,88); - int iTextMetadataBytes = app.CreateImageTextData(bTextMetadata, app.getRemoteStorage()->getSaveSeed(), true, app.getRemoteStorage()->getSaveHostOptions(), app.getRemoteStorage()->getSaveTexturePack() ); + unsigned int remoteHostOptions = app.getRemoteStorage()->getSaveHostOptions(); + app.SetGameHostOption(eGameHostOption_All, remoteHostOptions ); + int iTextMetadataBytes = app.CreateImageTextData(bTextMetadata, app.getRemoteStorage()->getSaveSeed(), true, remoteHostOptions, app.getRemoteStorage()->getSaveTexturePack() ); // set the icon and save image StorageManager.SetSaveImages(pbThumbnailData,dwThumbnailDataSize,pbDataSaveImage,dwDataSizeSaveImage,bTextMetadata,iTextMetadataBytes); @@ -2668,7 +2839,7 @@ int UIScene_LoadOrJoinMenu::DownloadSonyCrossSaveThreadProc( LPVOID lpParameter UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; app.getRemoteStorage()->waitForStorageManagerIdle(); // wait for everything to complete before we hand control back to the player - ui.RequestMessageBox( IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD, IDS_SAVE_TRANSFER_DOWNLOADCOMPLETE, uiIDA,1,ProfileManager.GetPrimaryPad(),CrossSaveFinishedCallback,pClass, app.GetStringTable()); + ui.RequestErrorMessage( IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD, IDS_SAVE_TRANSFER_DOWNLOADCOMPLETE, uiIDA,1,ProfileManager.GetPrimaryPad(),CrossSaveFinishedCallback,pClass); pClass->m_eSaveTransferState = eSaveTransfer_Finished; } break; @@ -2709,19 +2880,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 { @@ -2743,7 +2914,25 @@ int UIScene_LoadOrJoinMenu::DownloadSonyCrossSaveThreadProc( LPVOID lpParameter { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox( IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD, IDS_SAVE_TRANSFER_DOWNLOADFAILED, uiIDA,1,ProfileManager.GetPrimaryPad(),CrossSaveFinishedCallback,pClass, app.GetStringTable()); + UINT errorMessage = IDS_SAVE_TRANSFER_DOWNLOADFAILED; + if(!ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())) + { + errorMessage = IDS_ERROR_NETWORK; // show "A network error has occurred." +#ifdef __ORBIS__ + if(!ProfileManager.isSignedInPSN(ProfileManager.GetPrimaryPad())) + { + errorMessage = IDS_PRO_NOTONLINE_TEXT; // show "not signed into PSN" + } +#endif +#ifdef __VITA__ + if(!ProfileManager.IsSignedInPSN(ProfileManager.GetPrimaryPad())) + { + errorMessage = IDS_PRO_NOTONLINE_TEXT; // show "not signed into PSN" + } +#endif + + } + ui.RequestErrorMessage( IDS_TOOLTIPS_SAVETRANSFER_DOWNLOAD, errorMessage, uiIDA,1,ProfileManager.GetPrimaryPad(),CrossSaveFinishedCallback,pClass); pClass->m_eSaveTransferState = eSaveTransfer_Finished; } if(bSaveFileCreated) // save file has been created, then deleted. @@ -2755,14 +2944,16 @@ int UIScene_LoadOrJoinMenu::DownloadSonyCrossSaveThreadProc( LPVOID lpParameter break; case eSaveTransfer_Finished: { - } // waiting to dismiss the dialog break; } Sleep(50); } - + m_bSaveTransferRunning = false; +#ifdef __PS3__ + StorageManager.SetSaveTransferInProgress(false); +#endif return 0; } @@ -2887,7 +3078,7 @@ int UIScene_LoadOrJoinMenu::UploadSonyCrossSaveThreadProc( LPVOID lpParameter ) { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox( IDS_TOOLTIPS_SAVETRANSFER_UPLOAD, IDS_SAVE_TRANSFER_UPLOADCOMPLETE, uiIDA,1,ProfileManager.GetPrimaryPad(),CrossSaveUploadFinishedCallback,pClass, app.GetStringTable()); + ui.RequestErrorMessage( IDS_TOOLTIPS_SAVETRANSFER_UPLOAD, IDS_SAVE_TRANSFER_UPLOADCOMPLETE, uiIDA,1,ProfileManager.GetPrimaryPad(),CrossSaveUploadFinishedCallback,pClass); pClass->m_eSaveUploadState = esaveUpload_Finished; } break; @@ -2904,7 +3095,7 @@ int UIScene_LoadOrJoinMenu::UploadSonyCrossSaveThreadProc( LPVOID lpParameter ) { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox( IDS_TOOLTIPS_SAVETRANSFER_UPLOAD, IDS_SAVE_TRANSFER_UPLOADFAILED, uiIDA,1,ProfileManager.GetPrimaryPad(),CrossSaveUploadFinishedCallback,pClass, app.GetStringTable()); + ui.RequestErrorMessage( IDS_TOOLTIPS_SAVETRANSFER_UPLOAD, IDS_SAVE_TRANSFER_UPLOADFAILED, uiIDA,1,ProfileManager.GetPrimaryPad(),CrossSaveUploadFinishedCallback,pClass); pClass->m_eSaveUploadState = esaveUpload_Finished; } } @@ -2927,7 +3118,7 @@ void UIScene_LoadOrJoinMenu::SaveUploadReturned(LPVOID lpParam, SonyRemoteStorag if(pClass->m_saveTransferUploadCancelled) { UINT uiIDA[1] = { IDS_CONFIRM_OK }; - ui.RequestMessageBox( IDS_CANCEL_UPLOAD_TITLE, IDS_CANCEL_UPLOAD_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), CrossSaveUploadFinishedCallback, pClass, app.GetStringTable() ); + ui.RequestErrorMessage( IDS_CANCEL_UPLOAD_TITLE, IDS_CANCEL_UPLOAD_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), CrossSaveUploadFinishedCallback, pClass ); pClass->m_eSaveUploadState=esaveUpload_Finished; } else @@ -3054,8 +3245,18 @@ int UIScene_LoadOrJoinMenu::DownloadXbox360SaveThreadProc( LPVOID lpParameter ) switch(UIScene_LoadOrJoinMenu::s_eSaveTransferFile) { case eSaveTransferFile_Marker: - UIScene_LoadOrJoinMenu::s_eSaveTransferFile = eSaveTransferFile_Metadata; - RequestFileSize( pStateContainer, L"metadata" ); + // MGH - the marker file now contains the save file version number + // if the version is higher than we handle, cancel the download. + if(UIScene_LoadOrJoinMenu::s_transferData[0] > SAVE_FILE_VERSION_NUMBER) + { + pMinecraft->progressRenderer->progressStage(IDS_SAVETRANSFER_NONE_FOUND); + pStateContainer->m_eSaveTransferState=C4JStorage::eSaveTransfer_Idle; + } + else + { + UIScene_LoadOrJoinMenu::s_eSaveTransferFile = eSaveTransferFile_Metadata; + RequestFileSize( pStateContainer, L"metadata" ); + } break; case eSaveTransferFile_Metadata: { @@ -3078,7 +3279,28 @@ int UIScene_LoadOrJoinMenu::DownloadXbox360SaveThreadProc( LPVOID lpParameter ) byteArray ba(thumbnailSize); dis.readFully(ba); - StorageManager.SetSaveImages(ba.data, ba.length, NULL, 0, NULL, 0); + + + // retrieve the seed value from the image metadata, we need to change to host options, then set it back again + bool bHostOptionsRead = false; + unsigned int uiHostOptions = 0; + DWORD dwTexturePack; + __int64 seedVal; + + char szSeed[50]; + ZeroMemory(szSeed,50); + app.GetImageTextData(ba.data,ba.length,(unsigned char *)&szSeed,uiHostOptions,bHostOptionsRead,dwTexturePack); + sscanf_s(szSeed, "%I64d", &seedVal); + + app.SetGameHostOption(uiHostOptions, eGameHostOption_WorldSize, e_worldSize_Classic); // force the classic world size on, otherwise it's unknown and we can't expand + + + BYTE bTextMetadata[88]; + ZeroMemory(bTextMetadata,88); + + int iTextMetadataBytes = app.CreateImageTextData(bTextMetadata, seedVal, true, uiHostOptions, dwTexturePack); + // set the icon and save image + StorageManager.SetSaveImages(ba.data, ba.length, NULL, 0, bTextMetadata, iTextMetadataBytes); delete ba.data; } @@ -3468,12 +3690,12 @@ int UIScene_LoadOrJoinMenu::CopySaveDataReturned(LPVOID lpParam, bool success, C if( stat == C4JStorage::ESaveGame_CopyCompleteFailLocalStorage ) { ui.LeaveCallbackIdCriticalSection(); - ui.RequestMessageBox(IDS_COPYSAVE_FAILED_TITLE, IDS_COPYSAVE_FAILED_LOCAL, uiIDA, 1, ProfileManager.GetPrimaryPad(), CopySaveErrorDialogFinishedCallback, lpParam, app.GetStringTable()); + ui.RequestErrorMessage(IDS_COPYSAVE_FAILED_TITLE, IDS_COPYSAVE_FAILED_LOCAL, uiIDA, 1, ProfileManager.GetPrimaryPad(), CopySaveErrorDialogFinishedCallback, lpParam); } else if( stat == C4JStorage::ESaveGame_CopyCompleteFailQuota ) { ui.LeaveCallbackIdCriticalSection(); - ui.RequestMessageBox(IDS_COPYSAVE_FAILED_TITLE, IDS_COPYSAVE_FAILED_QUOTA, uiIDA, 1, ProfileManager.GetPrimaryPad(), CopySaveErrorDialogFinishedCallback, lpParam, app.GetStringTable()); + ui.RequestErrorMessage(IDS_COPYSAVE_FAILED_TITLE, IDS_COPYSAVE_FAILED_QUOTA, uiIDA, 1, ProfileManager.GetPrimaryPad(), CopySaveErrorDialogFinishedCallback, lpParam); } else { diff --git a/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.h b/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.h index 01d94b05..3599aa37 100644 --- a/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_LoadOrJoinMenu.h @@ -153,6 +153,12 @@ public: static int DeleteSaveDataReturned(LPVOID lpParam,bool bRes); static int RenameSaveDataReturned(LPVOID lpParam,bool bRes); static int KeyboardCompleteWorldNameCallback(LPVOID lpParam,bool bRes); +#ifdef __PSVITA__ + static int MustSignInTexturePack(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int MustSignInReturnedTexturePack(void *pParam,bool bContinue, int iPad); + static int SignInAdhocReturned(void *pParam,bool bContinue, int iPad); +#endif + protected: void handlePress(F64 controlId, F64 childId); void LoadLevelGen(LevelGenerationOptions *levelGen); @@ -250,6 +256,7 @@ private: eSaveTransferState m_eSaveTransferState; static unsigned long m_ulFileSize; static wstring m_wstrStageText; + static bool m_bSaveTransferRunning; int m_iProgress; char m_downloadedUniqueFilename[64];//SCE_SAVE_DATA_DIRNAME_DATA_MAXSIZE]; bool m_saveTransferDownloadCancelled; @@ -265,6 +272,9 @@ private: static ConsoleSaveFile* SonyCrossSaveConvert(); static void CancelSaveTransferCallback(LPVOID lpParam); +public: + static bool isSaveTransferRunning() { return m_bSaveTransferRunning; } +private: #endif #ifdef SONY_REMOTE_STORAGE_UPLOAD diff --git a/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp b/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp index e05b6df8..fe743adc 100644 --- a/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_MainMenu.cpp @@ -12,6 +12,8 @@ Random *UIScene_MainMenu::random = new Random(); +EUIScene UIScene_MainMenu::eNavigateWhenReady = (EUIScene) -1; + UIScene_MainMenu::UIScene_MainMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) { #ifdef __ORBIS @@ -31,31 +33,31 @@ UIScene_MainMenu::UIScene_MainMenu(int iPad, void *initData, UILayer *parentLaye m_bIgnorePress=false; - m_buttons[(int)eControl_PlayGame].init(app.GetString(IDS_PLAY_GAME),eControl_PlayGame); + m_buttons[(int)eControl_PlayGame].init(IDS_PLAY_GAME,eControl_PlayGame); #ifdef _XBOX_ONE - if(!ProfileManager.IsFullVersion()) m_buttons[(int)eControl_PlayGame].setLabel(app.GetString(IDS_PLAY_TRIAL_GAME)); + if(!ProfileManager.IsFullVersion()) m_buttons[(int)eControl_PlayGame].setLabel(IDS_PLAY_TRIAL_GAME); app.SetReachedMainMenu(); #endif - m_buttons[(int)eControl_Leaderboards].init(app.GetString(IDS_LEADERBOARDS),eControl_Leaderboards); - m_buttons[(int)eControl_Achievements].init(app.GetString(IDS_ACHIEVEMENTS),eControl_Achievements); - m_buttons[(int)eControl_HelpAndOptions].init(app.GetString(IDS_HELP_AND_OPTIONS),eControl_HelpAndOptions); + m_buttons[(int)eControl_Leaderboards].init(IDS_LEADERBOARDS,eControl_Leaderboards); + m_buttons[(int)eControl_Achievements].init( (UIString)IDS_ACHIEVEMENTS,eControl_Achievements); + m_buttons[(int)eControl_HelpAndOptions].init(IDS_HELP_AND_OPTIONS,eControl_HelpAndOptions); if(ProfileManager.IsFullVersion()) { m_bTrialVersion=false; - m_buttons[(int)eControl_UnlockOrDLC].init(app.GetString(IDS_DOWNLOADABLECONTENT),eControl_UnlockOrDLC); + m_buttons[(int)eControl_UnlockOrDLC].init(IDS_DOWNLOADABLECONTENT,eControl_UnlockOrDLC); } else { m_bTrialVersion=true; - m_buttons[(int)eControl_UnlockOrDLC].init(app.GetString(IDS_UNLOCK_FULL_GAME),eControl_UnlockOrDLC); + m_buttons[(int)eControl_UnlockOrDLC].init(IDS_UNLOCK_FULL_GAME,eControl_UnlockOrDLC); } #ifndef _DURANGO m_buttons[(int)eControl_Exit].init(app.GetString(IDS_EXIT_GAME),eControl_Exit); #else - m_buttons[(int)eControl_XboxHelp].init(app.GetString(IDS_XBOX_HELP_APP), eControl_XboxHelp); + m_buttons[(int)eControl_XboxHelp].init(IDS_XBOX_HELP_APP, eControl_XboxHelp); #endif #if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) @@ -151,6 +153,11 @@ void UIScene_MainMenu::handleGainFocus(bool navBack) ui.ShowPlayerDisplayname(false); m_bIgnorePress=false; + if (eNavigateWhenReady >= 0) + { + return; + } + // 4J-JEV: This needs to come before SetLockedProfile(-1) as it wipes the XbLive contexts. if (!navBack) { @@ -175,7 +182,7 @@ void UIScene_MainMenu::handleGainFocus(bool navBack) if(navBack && ProfileManager.IsFullVersion()) { // Replace the Unlock Full Game with Downloadable Content - m_buttons[(int)eControl_UnlockOrDLC].setLabel(app.GetString(IDS_DOWNLOADABLECONTENT)); + m_buttons[(int)eControl_UnlockOrDLC].setLabel(IDS_DOWNLOADABLECONTENT); } #if TO_BE_IMPLEMENTED @@ -223,11 +230,25 @@ wstring UIScene_MainMenu::getMoviePath() return L"MainMenu"; } +void UIScene_MainMenu::handleReload() +{ +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + // Not allowed to exit from a PS3 game from the game - have to use the PS button + removeControl( &m_buttons[(int)eControl_Exit], false ); + // We don't have a way to display trophies/achievements, so remove the button + removeControl( &m_buttons[(int)eControl_Achievements], false ); +#endif +#ifdef _DURANGO + // Allowed to not have achievements in the menu + removeControl( &m_buttons[(int)eControl_Achievements], false ); +#endif +} + void UIScene_MainMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) { //app.DebugPrintf("UIScene_DebugOverlay handling input for pad %d, key %d, down- %s, pressed- %s, released- %s\n", iPad, key, down?"TRUE":"FALSE", pressed?"TRUE":"FALSE", released?"TRUE":"FALSE"); - if(m_bIgnorePress) return; + if ( m_bIgnorePress || (eNavigateWhenReady >= 0) ) return; #if defined (__ORBIS__) || defined (__PSVITA__) // ignore all players except player 0 - it's their profile that is currently being used @@ -265,7 +286,7 @@ void UIScene_MainMenu::handleInput(int iPad, int key, bool repeat, bool pressed, UINT uiIDA[2]; uiIDA[0]=IDS__NETWORK_PSN; uiIDA[1]=IDS_NETWORK_ADHOC; - ui.RequestMessageBox(IDS_SELECT_NETWORK_MODE_TITLE, IDS_SELECT_NETWORK_MODE_TEXT, uiIDA, 2, XUSER_INDEX_ANY, &UIScene_MainMenu::SelectNetworkModeReturned,this); + ui.RequestErrorMessage(IDS_SELECT_NETWORK_MODE_TITLE, IDS_SELECT_NETWORK_MODE_TEXT, uiIDA, 2, XUSER_INDEX_ANY, &UIScene_MainMenu::SelectNetworkModeReturned,this); } break; #endif @@ -281,7 +302,11 @@ void UIScene_MainMenu::handlePress(F64 controlId, F64 childId) { int primaryPad = ProfileManager.GetPrimaryPad(); +#ifdef _XBOX_ONE + int (*signInReturnedFunc) (LPVOID,const bool, const int iPad, const int iController) = NULL; +#else int (*signInReturnedFunc) (LPVOID,const bool, const int iPad) = NULL; +#endif switch((int)controlId) { @@ -343,7 +368,7 @@ void UIScene_MainMenu::handlePress(F64 controlId, F64 childId) UINT uiIDA[2]; uiIDA[0]=IDS_CANCEL; uiIDA[1]=IDS_OK; - ui.RequestMessageBox(IDS_WARNING_ARCADE_TITLE, IDS_WARNING_ARCADE_TEXT, uiIDA, 2, XUSER_INDEX_ANY,&UIScene_MainMenu::ExitGameReturned,this); + ui.RequestErrorMessage(IDS_WARNING_ARCADE_TITLE, IDS_WARNING_ARCADE_TEXT, uiIDA, 2, XUSER_INDEX_ANY,&UIScene_MainMenu::ExitGameReturned,this); } else { @@ -390,7 +415,7 @@ void UIScene_MainMenu::handlePress(F64 controlId, F64 childId) UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_OK; uiIDA[1]=IDS_CONFIRM_CANCEL; - ui.RequestMessageBox(IDS_MUST_SIGN_IN_TITLE, IDS_MUST_SIGN_IN_TEXT, uiIDA, 2, primaryPad, &UIScene_MainMenu::MustSignInReturned, this, app.GetStringTable()); + ui.RequestErrorMessage(IDS_MUST_SIGN_IN_TITLE, IDS_MUST_SIGN_IN_TEXT, uiIDA, 2, primaryPad, &UIScene_MainMenu::MustSignInReturned, this); } } } @@ -557,7 +582,15 @@ int UIScene_MainMenu::MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EM SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_MainMenu::Leaderboards_SignInReturned, pClass); break; case eAction_RunGamePSN: - SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_MainMenu::CreateLoad_SignInReturned, pClass); + if(CGameNetworkManager::usingAdhocMode()) + { + SQRNetworkManager_AdHoc_Vita::AttemptAdhocSignIn(&UIScene_MainMenu::CreateLoad_SignInReturned, pClass); + } + else + { + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_MainMenu::CreateLoad_SignInReturned, pClass); + + } break; case eAction_RunUnlockOrDLCPSN: //CD - Must force Ad-Hoc off if they want commerce PSN sign-in @@ -604,7 +637,11 @@ int UIScene_MainMenu::MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EM } #endif +#ifdef _XBOX_ONE +int UIScene_MainMenu::HelpAndOptions_SignInReturned(void *pParam,bool bContinue,int iPad, int iController) +#else int UIScene_MainMenu::HelpAndOptions_SignInReturned(void *pParam,bool bContinue,int iPad) +#endif { UIScene_MainMenu *pClass = (UIScene_MainMenu *)pParam; @@ -621,7 +658,7 @@ int UIScene_MainMenu::HelpAndOptions_SignInReturned(void *pParam,bool bContinue, #ifdef _XBOX_ONE ui.ShowPlayerDisplayname(true); #endif - ui.NavigateToScene(iPad,eUIScene_HelpAndOptionsMenu); + proceedToScene(iPad, eUIScene_HelpAndOptionsMenu); } #if TO_BE_IMPLEMENTED else @@ -662,16 +699,20 @@ int UIScene_MainMenu::HelpAndOptions_SignInReturned(void *pParam,bool bContinue, } #ifdef _XBOX_ONE -int UIScene_MainMenu::ChooseUser_SignInReturned(void *pParam, bool bContinue, int iPad) +int UIScene_MainMenu::ChooseUser_SignInReturned(void *pParam, bool bContinue, int iPad, int iController) { UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam; pClass->m_bIgnorePress = false; - + pClass->updateTooltips(); return 0; } #endif +#ifdef _XBOX_ONE +int UIScene_MainMenu::CreateLoad_SignInReturned(void *pParam, bool bContinue, int iPad, int iController) +#else int UIScene_MainMenu::CreateLoad_SignInReturned(void *pParam, bool bContinue, int iPad) +#endif { UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam; @@ -685,7 +726,7 @@ int UIScene_MainMenu::CreateLoad_SignInReturned(void *pParam, bool bContinue, in if(ProfileManager.IsGuest(ProfileManager.GetPrimaryPad())) { pClass->m_bIgnorePress=false; - ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + ui.RequestErrorMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); } else { @@ -723,7 +764,7 @@ int UIScene_MainMenu::CreateLoad_SignInReturned(void *pParam, bool bContinue, in if(ProfileManager.IsGuest(iPad)) { pClass->m_bIgnorePress=false; - ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + ui.RequestErrorMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); } else { @@ -741,7 +782,7 @@ int UIScene_MainMenu::CreateLoad_SignInReturned(void *pParam, bool bContinue, in #ifdef _XBOX_ONE ui.ShowPlayerDisplayname(true); #endif - ui.NavigateToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); + proceedToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); } else { @@ -804,7 +845,7 @@ int UIScene_MainMenu::CreateLoad_SignInReturned(void *pParam, bool bContinue, in #ifdef _XBOX_ONE ui.ShowPlayerDisplayname(true); #endif - ui.NavigateToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); + proceedToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); #endif } } @@ -818,7 +859,7 @@ int UIScene_MainMenu::CreateLoad_SignInReturned(void *pParam, bool bContinue, in #ifdef _XBOX_ONE ui.ShowPlayerDisplayname(true); #endif - ui.NavigateToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); + proceedToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); #endif } } @@ -869,7 +910,11 @@ int UIScene_MainMenu::CreateLoad_SignInReturned(void *pParam, bool bContinue, in return 0; } +#ifdef _XBOX_ONE +int UIScene_MainMenu::Leaderboards_SignInReturned(void *pParam,bool bContinue,int iPad,int iController) +#else int UIScene_MainMenu::Leaderboards_SignInReturned(void *pParam,bool bContinue,int iPad) +#endif { UIScene_MainMenu *pClass = (UIScene_MainMenu *)pParam; @@ -884,12 +929,12 @@ int UIScene_MainMenu::Leaderboards_SignInReturned(void *pParam,bool bContinue,in if(ProfileManager.IsGuest(ProfileManager.GetPrimaryPad())) { pClass->m_bIgnorePress=false; - ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + ui.RequestErrorMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); } else if(!ProfileManager.IsSignedInLive(ProfileManager.GetPrimaryPad())) { pClass->m_bIgnorePress=false; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); } else { @@ -900,11 +945,11 @@ int UIScene_MainMenu::Leaderboards_SignInReturned(void *pParam,bool bContinue,in if(bContentRestricted) { pClass->m_bIgnorePress=false; -#if !(defined(_XBOX) || defined(_WIN64)) // 4J Stu - Temp to get the win build running, but so we check this for other platforms +#if !(defined(_XBOX) || defined(_WINDOWS64) || defined(_XBOX_ONE) ) // 4J Stu - Temp to get the win build running, but so we check this for other platforms // you can't see leaderboards UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); #endif } else @@ -913,7 +958,7 @@ int UIScene_MainMenu::Leaderboards_SignInReturned(void *pParam,bool bContinue,in #ifdef _XBOX_ONE ui.ShowPlayerDisplayname(true); #endif - ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_LeaderboardsMenu); + proceedToScene(ProfileManager.GetPrimaryPad(), eUIScene_LeaderboardsMenu); } } } @@ -935,7 +980,11 @@ int UIScene_MainMenu::Leaderboards_SignInReturned(void *pParam,bool bContinue,in return 0; } +#ifdef _XBOX_ONE +int UIScene_MainMenu::Achievements_SignInReturned(void *pParam,bool bContinue,int iPad,int iController) +#else int UIScene_MainMenu::Achievements_SignInReturned(void *pParam,bool bContinue,int iPad) +#endif { UIScene_MainMenu *pClass = (UIScene_MainMenu *)pParam; @@ -965,7 +1014,11 @@ int UIScene_MainMenu::Achievements_SignInReturned(void *pParam,bool bContinue,in return 0; } +#ifdef _XBOX_ONE +int UIScene_MainMenu::UnlockFullGame_SignInReturned(void *pParam,bool bContinue,int iPad,int iController) +#else int UIScene_MainMenu::UnlockFullGame_SignInReturned(void *pParam,bool bContinue,int iPad) +#endif { UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam; @@ -995,8 +1048,8 @@ int UIScene_MainMenu::UnlockFullGame_SignInReturned(void *pParam,bool bContinue, return 0; } -#ifdef _DURANGO -int UIScene_MainMenu::XboxHelp_SignInReturned(void *pParam, bool bContinue, int iPad) +#ifdef _XBOX_ONE +int UIScene_MainMenu::XboxHelp_SignInReturned(void *pParam, bool bContinue, int iPad, int iController) { UIScene_MainMenu* pClass = (UIScene_MainMenu*)pParam; @@ -1096,7 +1149,7 @@ void UIScene_MainMenu::RefreshChatAndContentRestrictionsReturned_PlayGame(void * { UINT uiIDA[1]; uiIDA[0]=IDS_PRO_NOTONLINE_DECLINE; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::PlayOfflineReturned, pClass, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::PlayOfflineReturned, pClass); return; } @@ -1123,7 +1176,7 @@ void UIScene_MainMenu::RefreshChatAndContentRestrictionsReturned_PlayGame(void * UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_OK; uiIDA[1]=IDS_CONFIRM_CANCEL; - ui.RequestMessageBox(IDS_MUST_SIGN_IN_TITLE, IDS_MUST_SIGN_IN_TEXT, uiIDA, 2, primaryPad, &UIScene_MainMenu::MustSignInReturned, pClass, app.GetStringTable()); + ui.RequestErrorMessage(IDS_MUST_SIGN_IN_TITLE, IDS_MUST_SIGN_IN_TEXT, uiIDA, 2, primaryPad, &UIScene_MainMenu::MustSignInReturned, pClass); } } } @@ -1188,7 +1241,7 @@ void UIScene_MainMenu::RefreshChatAndContentRestrictionsReturned_Leaderboards(vo { UINT uiIDA[1]; uiIDA[0] = IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(), nullptr, pClass, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(), nullptr, pClass); return; } @@ -1213,7 +1266,7 @@ void UIScene_MainMenu::RefreshChatAndContentRestrictionsReturned_Leaderboards(vo UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_OK; uiIDA[1]=IDS_CONFIRM_CANCEL; - ui.RequestMessageBox(IDS_MUST_SIGN_IN_TITLE, IDS_MUST_SIGN_IN_TEXT, uiIDA, 2, primaryPad, &UIScene_MainMenu::MustSignInReturned, pClass, app.GetStringTable()); + ui.RequestErrorMessage(IDS_MUST_SIGN_IN_TITLE, IDS_MUST_SIGN_IN_TEXT, uiIDA, 2, primaryPad, &UIScene_MainMenu::MustSignInReturned, pClass); } } } @@ -1257,7 +1310,7 @@ void UIScene_MainMenu::RunPlayGame(int iPad) uiIDA[0]=IDS_OK; m_bIgnorePress=false; - ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + ui.RequestErrorMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); } else { @@ -1308,7 +1361,7 @@ void UIScene_MainMenu::RunPlayGame(int iPad) { uiIDA[0]=IDS_NETWORK_ADHOC; // this should be "Connect to adhoc network" - ui.RequestMessageBox(IDS_PRO_NOTADHOCONLINE_TITLE, IDS_PRO_NOTADHOCONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_MainMenu::MustSignInReturnedPSN,this, app.GetStringTable()); + ui.RequestErrorMessage(IDS_PRO_NOTADHOCONLINE_TITLE, IDS_PRO_NOTADHOCONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_MainMenu::MustSignInReturnedPSN,this); } else { @@ -1330,12 +1383,12 @@ void UIScene_MainMenu::RunPlayGame(int iPad) ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPad, &UIScene_MainMenu::MustSignInReturnedPSN, this, app.GetStringTable()); return; } */ - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_MainMenu::MustSignInReturnedPSN,this, app.GetStringTable()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_MainMenu::MustSignInReturnedPSN,this); } #else - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPad, &UIScene_MainMenu::MustSignInReturnedPSN, this, app.GetStringTable()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPad, &UIScene_MainMenu::MustSignInReturnedPSN, this); #endif #elif defined __ORBIS__ @@ -1349,7 +1402,7 @@ void UIScene_MainMenu::RunPlayGame(int iPad) UINT uiIDA[1]; uiIDA[0] = IDS_PRO_NOTONLINE_DECLINE; - ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, UIScene_MainMenu::PlayOfflineReturned, this, app.GetStringTable()); + ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, UIScene_MainMenu::PlayOfflineReturned, this); } else { @@ -1358,7 +1411,7 @@ void UIScene_MainMenu::RunPlayGame(int iPad) UINT uiIDA[2]; uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; uiIDA[1] = IDS_PRO_NOTONLINE_DECLINE; - ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPad, &UIScene_MainMenu::MustSignInReturnedPSN, this, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, iPad, &UIScene_MainMenu::MustSignInReturnedPSN, this); return; } #else @@ -1366,7 +1419,7 @@ void UIScene_MainMenu::RunPlayGame(int iPad) #ifdef _XBOX_ONE ui.ShowPlayerDisplayname(true); #endif - ui.NavigateToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); + proceedToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); #endif } else @@ -1438,7 +1491,7 @@ void UIScene_MainMenu::RunPlayGame(int iPad) #ifdef _XBOX_ONE ui.ShowPlayerDisplayname(true); #endif - ui.NavigateToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); + proceedToScene(ProfileManager.GetPrimaryPad(), eUIScene_LoadOrJoinMenu); #endif } } @@ -1482,7 +1535,7 @@ void UIScene_MainMenu::RunLeaderboards(int iPad) // guests can't look at leaderboards if(ProfileManager.IsGuest(iPad)) { - ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + ui.RequestErrorMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); } else if(!ProfileManager.IsSignedInLive(iPad)) { @@ -1491,7 +1544,7 @@ void UIScene_MainMenu::RunLeaderboards(int iPad) // get them to sign in to online UINT uiIDA[1]; uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),&UIScene_MainMenu::MustSignInReturnedPSN,this, app.GetStringTable()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),&UIScene_MainMenu::MustSignInReturnedPSN,this); /* 4J-PB - Add this after release #elif defined __PSVITA__ @@ -1522,18 +1575,18 @@ void UIScene_MainMenu::RunLeaderboards(int iPad) UINT uiIDA[1]; uiIDA[0] = IDS_OK; - ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad); } else { // Not signed in to PSN UINT uiIDA[1]; uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::MustSignInReturnedPSN, this, app.GetStringTable()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::MustSignInReturnedPSN, this); return; } #else - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); #endif } else @@ -1551,11 +1604,11 @@ void UIScene_MainMenu::RunLeaderboards(int iPad) #endif if(bContentRestricted) { -#if !(defined(_XBOX) || defined(_WIN64)) // 4J Stu - Temp to get the win build running, but so we check this for other platforms +#if !(defined(_XBOX) || defined(_WINDOWS64) || defined(_XBOX_ONE)) // 4J Stu - Temp to get the win build running, but so we check this for other platforms // you can't see leaderboards UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,this, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,this); #endif } else @@ -1567,7 +1620,7 @@ void UIScene_MainMenu::RunLeaderboards(int iPad) #ifdef _XBOX_ONE ui.ShowPlayerDisplayname(true); #endif - ui.NavigateToScene(iPad, eUIScene_LeaderboardsMenu); + proceedToScene(iPad, eUIScene_LeaderboardsMenu); } } } @@ -1626,7 +1679,7 @@ void UIScene_MainMenu::RunUnlockOrDLC(int iPad) m_bIgnorePress=false; UINT uiIDA[1]; uiIDA[0] = IDS_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(), nullptr, this, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(), nullptr, this); return; } @@ -1637,7 +1690,7 @@ void UIScene_MainMenu::RunUnlockOrDLC(int iPad) if(ProfileManager.IsGuest(iPad)) { m_bIgnorePress=false; - ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + ui.RequestErrorMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); } else { @@ -1656,11 +1709,11 @@ void UIScene_MainMenu::RunUnlockOrDLC(int iPad) if(bContentRestricted) { m_bIgnorePress=false; -#if !(defined(_XBOX) || defined(_WIN64)) // 4J Stu - Temp to get the win build running, but so we check this for other platforms +#if !(defined(_XBOX) || defined(_WINDOWS64) || defined(_XBOX_ONE)) // 4J Stu - Temp to get the win build running, but so we check this for other platforms // you can't see the store UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,this, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,this); #endif } else @@ -1669,7 +1722,7 @@ void UIScene_MainMenu::RunUnlockOrDLC(int iPad) #ifdef _XBOX_ONE ui.ShowPlayerDisplayname(true); #endif - ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_DLCMainMenu); + proceedToScene(ProfileManager.GetPrimaryPad(), eUIScene_DLCMainMenu); } } #if defined _XBOX_ONE @@ -1710,7 +1763,7 @@ void UIScene_MainMenu::RunUnlockOrDLC(int iPad) UINT uiIDA[1]; uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; //uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),&UIScene_MainMenu::MustSignInReturnedPSN,this, app.GetStringTable()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),&UIScene_MainMenu::MustSignInReturnedPSN,this); #elif defined __ORBIS__ m_eAction=eAction_RunUnlockOrDLCPSN; // Determine why they're not "signed in live" @@ -1722,20 +1775,20 @@ void UIScene_MainMenu::RunUnlockOrDLC(int iPad) UINT uiIDA[1]; uiIDA[0] = IDS_OK; - ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad); } else { // Not signed in to PSN UINT uiIDA[1]; uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::MustSignInReturnedPSN, this, app.GetStringTable()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::MustSignInReturnedPSN, this); return; } #else UINT uiIDA[1]; uiIDA[0]=IDS_OK; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); #endif } } @@ -1745,7 +1798,7 @@ void UIScene_MainMenu::RunUnlockOrDLC(int iPad) if(ProfileManager.IsGuest(iPad)) { m_bIgnorePress=false; - ui.RequestMessageBox(IDS_UNLOCK_TITLE, IDS_UNLOCK_GUEST_TEXT, uiIDA, 1,iPad); + ui.RequestErrorMessage(IDS_UNLOCK_TITLE, IDS_UNLOCK_GUEST_TEXT, uiIDA, 1,iPad); } else if(!ProfileManager.IsSignedInLive(iPad)) { @@ -1754,7 +1807,7 @@ void UIScene_MainMenu::RunUnlockOrDLC(int iPad) // get them to sign in to online UINT uiIDA[1]; uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),&UIScene_MainMenu::MustSignInReturnedPSN,this, app.GetStringTable()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),&UIScene_MainMenu::MustSignInReturnedPSN,this); #elif defined __ORBIS__ m_eAction=eAction_RunUnlockOrDLCPSN; // Determine why they're not "signed in live" @@ -1766,20 +1819,20 @@ void UIScene_MainMenu::RunUnlockOrDLC(int iPad) UINT uiIDA[1]; uiIDA[0] = IDS_OK; - ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad); } else { // Not signed in to PSN UINT uiIDA[1]; uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::MustSignInReturnedPSN, this, app.GetStringTable()); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::MustSignInReturnedPSN, this); return; } #else UINT uiIDA[1]; uiIDA[0]=IDS_OK; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1); #endif } @@ -1805,6 +1858,60 @@ void UIScene_MainMenu::tick() { UIScene::tick(); + if ( (eNavigateWhenReady >= 0) ) + { + + int lockedProfile = ProfileManager.GetLockedProfile(); + +#ifdef _DURANGO + // 4J-JEV: DLC menu contains text localised to system language which we can't change. + // We need to switch to this language in-case it uses a different font. + if (eNavigateWhenReady == eUIScene_DLCMainMenu) setLanguageOverride(false); + + bool isSignedIn; + C4JStorage::eOptionsCallback status; + bool pendingFontChange; + if (lockedProfile >= 0) + { + isSignedIn = ProfileManager.IsSignedIn(lockedProfile); + status = app.GetOptionsCallbackStatus(lockedProfile); + pendingFontChange = ui.PendingFontChange(); + + if(status == C4JStorage::eOptions_Callback_Idle) + { + // make sure the TMS banned list data is ditched - the player may have gone in to help & options, backed out, and signed out + app.InvalidateBannedList(lockedProfile); + + // need to ditch any DLCOffers info + StorageManager.ClearDLCOffers(); + app.ClearAndResetDLCDownloadQueue(); + app.ClearDLCInstalled(); + } + } + + if ( (lockedProfile >= 0) + && isSignedIn + && ((status == C4JStorage::eOptions_Callback_Read)||(status == C4JStorage::eOptions_Callback_Write)) + && !pendingFontChange + ) +#endif + { + app.DebugPrintf("[MainMenu] Navigating away from MainMenu.\n"); + ui.NavigateToScene(lockedProfile, eNavigateWhenReady); + eNavigateWhenReady = (EUIScene) -1; + } +#ifdef _DURANGO + else + { + app.DebugPrintf("[MainMenu] Delaying navigation: lockedProfile=%i, %s, status=%ls, %s.\n", + lockedProfile, + isSignedIn ? "SignedIn" : "SignedOut", + app.toStringOptionsStatus(status).c_str(), + pendingFontChange ? "Pending font change" : "font OK"); + } +#endif + } + #if defined(__PS3__) || defined (__ORBIS__) || defined(__PSVITA__) if(m_bLaunchFullVersionPurchase) { @@ -1823,7 +1930,7 @@ void UIScene_MainMenu::tick() { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,this, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); } else { @@ -1851,7 +1958,7 @@ void UIScene_MainMenu::tick() { m_bWaitingForDLCInfo=false; ProfileManager.SetLockedProfile(m_iPad); - ui.NavigateToScene(ProfileManager.GetPrimaryPad(),eUIScene_DLCMainMenu); + proceedToScene(ProfileManager.GetPrimaryPad(), eUIScene_DLCMainMenu); } } @@ -1859,7 +1966,7 @@ void UIScene_MainMenu::tick() { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox( IDS_CONNECTION_FAILED, IDS_IN_PARTY_SESSION_FULL, uiIDA,1,ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_CONNECTION_FAILED, IDS_IN_PARTY_SESSION_FULL, uiIDA,1,ProfileManager.GetPrimaryPad()); } #endif @@ -1882,7 +1989,7 @@ void UIScene_MainMenu::tick() // give the option of continuing offline UINT uiIDA[1]; uiIDA[0]=IDS_PRO_NOTONLINE_DECLINE; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION_PATCH_AVAILABLE, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::PlayOfflineReturned, this, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION_PATCH_AVAILABLE, uiIDA, 1, ProfileManager.GetPrimaryPad(), &UIScene_MainMenu::PlayOfflineReturned, this); } m_bErrorDialogRunning=false; @@ -1907,7 +2014,7 @@ void UIScene_MainMenu::RunAchievements(int iPad) // guests can't look at achievements if(ProfileManager.IsGuest(iPad)) { - ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + ui.RequestErrorMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); } else { @@ -1922,7 +2029,7 @@ void UIScene_MainMenu::RunHelpAndOptions(int iPad) { UINT uiIDA[1]; uiIDA[0]=IDS_OK; - ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); + ui.RequestErrorMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1); } else { @@ -1938,7 +2045,7 @@ void UIScene_MainMenu::RunHelpAndOptions(int iPad) #ifdef _XBOX_ONE ui.ShowPlayerDisplayname(true); #endif - ui.NavigateToScene(iPad,eUIScene_HelpAndOptionsMenu); + proceedToScene(iPad, eUIScene_HelpAndOptionsMenu); } #if TO_BE_IMPLEMENTED else @@ -1976,6 +2083,7 @@ void UIScene_MainMenu::LoadTrial(void) // No saving in the trial StorageManager.SetSaveDisabled(true); + app.SetGameHostOption(eGameHostOption_WasntSaveOwner, false); // Set the global flag, so that we don't disable saving again once the save is complete app.SetGameHostOption(eGameHostOption_DisableSaving, 1); @@ -2021,7 +2129,7 @@ void UIScene_MainMenu::LoadTrial(void) void UIScene_MainMenu::handleUnlockFullVersion() { - m_buttons[(int)eControl_UnlockOrDLC].setLabel(app.GetString(IDS_DOWNLOADABLECONTENT),true); + m_buttons[(int)eControl_UnlockOrDLC].setLabel(IDS_DOWNLOADABLECONTENT,true); } diff --git a/Minecraft.Client/Common/UI/UIScene_MainMenu.h b/Minecraft.Client/Common/UI/UIScene_MainMenu.h index f1b358da..2b49a44b 100644 --- a/Minecraft.Client/Common/UI/UIScene_MainMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_MainMenu.h @@ -90,10 +90,20 @@ private: }; eActions m_eAction; + +private: + // 4J-JEV: Delay navigation until font changes. + static EUIScene eNavigateWhenReady; + + static void proceedToScene(int iPad, EUIScene eScene) + { + eNavigateWhenReady = eScene; + } + public: UIScene_MainMenu(int iPad, void *initData, UILayer *parentLayer); virtual ~UIScene_MainMenu(); - + // Returns true if this scene has focus for the pad passed in #ifndef __PS3__ virtual bool hasFocus(int iPad) { return bHasFocus; } @@ -113,6 +123,7 @@ protected: public: virtual void tick(); + virtual void handleReload(); // INPUT virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); @@ -137,8 +148,20 @@ private: static void LoadTrial(); #ifdef _XBOX_ONE - static int ChooseUser_SignInReturned(void *pParam,bool bContinue, int iPad); -#endif + static int ChooseUser_SignInReturned(void *pParam,bool bContinue, int iPad, int iController); + static int CreateLoad_SignInReturned(void *pParam,bool bContinue, int iPad, int iController); + static int HelpAndOptions_SignInReturned(void *pParam,bool bContinue,int iPad, int iController); + static int Achievements_SignInReturned(void *pParam,bool bContinue,int iPad, int iController); + static int MustSignInReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + + static int Leaderboards_SignInReturned(void* pParam, bool bContinue, int iPad, int iController); + static int UnlockFullGame_SignInReturned(void *pParam,bool bContinue,int iPad, int iController); + static int ExitGameReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + + + static int XboxHelp_SignInReturned(void *pParam, bool bContinue, int iPad, int iController); +#else + static int CreateLoad_SignInReturned(void *pParam,bool bContinue, int iPad); static int HelpAndOptions_SignInReturned(void *pParam,bool bContinue,int iPad); static int Achievements_SignInReturned(void *pParam,bool bContinue,int iPad); @@ -157,9 +180,6 @@ private: static int PlayOfflineReturned(void *pParam, int iPad, C4JStorage::EMessageResult result); #endif - -#ifdef _DURANGO - static int XboxHelp_SignInReturned(void *pParam, bool bContinue, int iPad); #endif #ifdef __PSVITA__ diff --git a/Minecraft.Client/Common/UI/UIScene_MessageBox.h b/Minecraft.Client/Common/UI/UIScene_MessageBox.h index 3c349dea..c10f6ab8 100644 --- a/Minecraft.Client/Common/UI/UIScene_MessageBox.h +++ b/Minecraft.Client/Common/UI/UIScene_MessageBox.h @@ -41,7 +41,8 @@ public: virtual EUIScene getSceneType() { return eUIScene_MessageBox;} // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden - virtual bool hidesLowerScenes() { return false; } + virtual bool hidesLowerScenes() { return false; } + virtual bool blocksInput() { return true; } protected: // TODO: This should be pure virtual in this class diff --git a/Minecraft.Client/Common/UI/UIScene_NewUpdateMessage.cpp b/Minecraft.Client/Common/UI/UIScene_NewUpdateMessage.cpp new file mode 100644 index 00000000..998679ca --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_NewUpdateMessage.cpp @@ -0,0 +1,121 @@ +#include "stdafx.h" +#include "UI.h" +#include "UIScene_NewUpdateMessage.h" +#include "..\..\..\Minecraft.World\StringHelpers.h" + +UIScene_NewUpdateMessage::UIScene_NewUpdateMessage(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) +{ + // Setup all the Iggy references we need for this scene + initialiseMovie(); + + parentLayer->addComponent(iPad,eUIComponent_Panorama); + parentLayer->addComponent(iPad,eUIComponent_Logo); + + m_buttonConfirm.init(app.GetString(IDS_TOOLTIPS_ACCEPT),eControl_Confirm); + + wstring message = app.GetString(IDS_TITLEUPDATE); + message.append(L"\r\n"); + + message=app.FormatHTMLString(m_iPad,message); + + vector paragraphs; + int lastIndex = 0; + for ( int index = message.find(L"\r\n", lastIndex, 2); + index != wstring::npos; + index = message.find(L"\r\n", lastIndex, 2) + ) + { + paragraphs.push_back( message.substr(lastIndex, index-lastIndex) + L" " ); + lastIndex = index + 2; + } + paragraphs.push_back( message.substr( lastIndex, message.length() - lastIndex ) ); + + for(unsigned int i = 0; i < paragraphs.size(); ++i) + { + m_labelDescription.addText(paragraphs[i],i == (paragraphs.size() - 1) ); + } + + m_bIgnoreInput=false; + +#ifdef __PSVITA__ + ui.TouchBoxRebuild(this); +#endif +} + +UIScene_NewUpdateMessage::~UIScene_NewUpdateMessage() +{ + m_parentLayer->removeComponent(eUIComponent_Panorama); + m_parentLayer->removeComponent(eUIComponent_Logo); +} + +wstring UIScene_NewUpdateMessage::getMoviePath() +{ + return L"EULA"; +} + +void UIScene_NewUpdateMessage::updateTooltips() +{ + ui.SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT ); +} + +void UIScene_NewUpdateMessage::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled) +{ + if(m_bIgnoreInput) return; + +#ifdef __ORBIS__ + // ignore all players except player 0 - it's their profile that is currently being used + if(iPad!=0) return; +#endif + + ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released); + + switch(key) + { + case ACTION_MENU_B: + { + int iVal=app.GetGameSettings(m_iPad,eGameSetting_DisplayUpdateMessage); + if(iVal>0) iVal--; + + // set the update text as seen, by clearing the flag + app.SetGameSettings(m_iPad,eGameSetting_DisplayUpdateMessage,iVal); + // force a profile write + app.CheckGameSettingsChanged(true,m_iPad); + ui.NavigateBack(m_iPad); + } + break; +#ifdef __ORBIS__ + case ACTION_MENU_TOUCHPAD_PRESS: +#endif + case ACTION_MENU_OK: + case ACTION_MENU_DOWN: + case ACTION_MENU_UP: + case ACTION_MENU_PAGEUP: + case ACTION_MENU_PAGEDOWN: + case ACTION_MENU_OTHER_STICK_DOWN: + case ACTION_MENU_OTHER_STICK_UP: + sendInputToMovie(key, repeat, pressed, released); + break; + } +} + +void UIScene_NewUpdateMessage::handlePress(F64 controlId, F64 childId) +{ + switch((int)controlId) + { + case eControl_Confirm: + { + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + int iVal=app.GetGameSettings(m_iPad,eGameSetting_DisplayUpdateMessage); + if(iVal>0) iVal--; + + // set the update text as seen, by clearing the flag + app.SetGameSettings(m_iPad,eGameSetting_DisplayUpdateMessage,iVal); + // force a profile write + app.CheckGameSettingsChanged(true,m_iPad); + ui.NavigateBack(m_iPad); + } + break; + }; +} diff --git a/Minecraft.Client/Common/UI/UIScene_NewUpdateMessage.h b/Minecraft.Client/Common/UI/UIScene_NewUpdateMessage.h new file mode 100644 index 00000000..1529187f --- /dev/null +++ b/Minecraft.Client/Common/UI/UIScene_NewUpdateMessage.h @@ -0,0 +1,45 @@ +#pragma once + +#include "UIScene.h" + +class UIScene_NewUpdateMessage : public UIScene +{ +private: + enum EControls + { + eControl_Confirm, + }; + + bool m_bIgnoreInput; + + UIControl_Button m_buttonConfirm; + UIControl_DynamicLabel m_labelDescription; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) + UI_MAP_ELEMENT(m_buttonConfirm, "AcceptButton") + UI_MAP_ELEMENT(m_labelDescription, "EULAtext") + UI_END_MAP_ELEMENTS_AND_NAMES() + +public: + UIScene_NewUpdateMessage(int iPad, void *initData, UILayer *parentLayer); + ~UIScene_NewUpdateMessage(); + + virtual EUIScene getSceneType() { return eUIScene_EULA;} + + // Returns true if this scene has focus for the pad passed in +#ifndef __PS3__ + virtual bool hasFocus(int iPad) { return bHasFocus; } +#endif + virtual void updateTooltips(); + +protected: + virtual wstring getMoviePath(); + +public: + // INPUT + virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + +protected: + void handlePress(F64 controlId, F64 childId); + + virtual long long getDefaultGtcButtons() { return 0; } +}; diff --git a/Minecraft.Client/Common/UI/UIScene_PauseMenu.cpp b/Minecraft.Client/Common/UI/UIScene_PauseMenu.cpp index d9569cc9..6f502db8 100644 --- a/Minecraft.Client/Common/UI/UIScene_PauseMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_PauseMenu.cpp @@ -428,7 +428,7 @@ void UIScene_PauseMenu::handleInput(int iPad, int key, bool repeat, bool pressed // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive is the npAvailability isn't SCE_OK UINT uiIDA[1]; uiIDA[0]=IDS_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); } else // Determine why they're not "signed in live" @@ -439,20 +439,20 @@ void UIScene_PauseMenu::handleInput(int iPad, int key, bool repeat, bool pressed UINT uiIDA[1]; uiIDA[0] = IDS_OK; - ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad); } else { // Not signed in to PSN UINT uiIDA[1]; uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; - ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, iPad, &UIScene_PauseMenu::MustSignInReturnedPSN, this, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, iPad, &UIScene_PauseMenu::MustSignInReturnedPSN, (LPVOID)GetCallbackUniqueId() ); } #else // __PS3__ // get them to sign in to online UINT uiIDA[1]; uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, iPad, &UIScene_PauseMenu::MustSignInReturnedPSN, this, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, iPad, &UIScene_PauseMenu::MustSignInReturnedPSN, (LPVOID)GetCallbackUniqueId() ); #endif } else @@ -493,7 +493,7 @@ void UIScene_PauseMenu::handleInput(int iPad, int key, bool repeat, bool pressed UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_ACTION_BAN_LEVEL_TITLE, IDS_ACTION_BAN_LEVEL_DESCRIPTION, uiIDA, 2, iPad,&UIScene_PauseMenu::BanGameDialogReturned,this, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_ACTION_BAN_LEVEL_TITLE, IDS_ACTION_BAN_LEVEL_DESCRIPTION, uiIDA, 2, iPad,&UIScene_PauseMenu::BanGameDialogReturned,(LPVOID)GetCallbackUniqueId() ); //rfHandled = TRUE; } @@ -524,7 +524,7 @@ void UIScene_PauseMenu::handlePress(F64 controlId, F64 childId) // guests can't look at leaderboards if(ProfileManager.IsGuest(m_iPad)) { - ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad()); } else if(!ProfileManager.IsSignedInLive(m_iPad)) { @@ -541,7 +541,7 @@ void UIScene_PauseMenu::handlePress(F64 controlId, F64 childId) { UINT uiIDA[1]; uiIDA[0] = IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, m_iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, m_iPad); break;; } @@ -553,7 +553,7 @@ void UIScene_PauseMenu::handlePress(F64 controlId, F64 childId) m_eAction=eAction_ViewLeaderboardsPSN; UINT uiIDA[1]; uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, ProfileManager.GetPrimaryPad(),&UIScene_PauseMenu::MustSignInReturnedPSN,this, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, ProfileManager.GetPrimaryPad(),&UIScene_PauseMenu::MustSignInReturnedPSN,(LPVOID)GetCallbackUniqueId() ); #elif defined(__ORBIS__) m_eAction=eAction_ViewLeaderboardsPSN; int npAvailability = ProfileManager.getNPAvailability(m_iPad); @@ -562,7 +562,7 @@ void UIScene_PauseMenu::handlePress(F64 controlId, F64 childId) // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive is the npAvailability isn't SCE_OK UINT uiIDA[1]; uiIDA[0]=IDS_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, m_iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, m_iPad); } else // Determine why they're not "signed in live" @@ -575,18 +575,18 @@ void UIScene_PauseMenu::handlePress(F64 controlId, F64 childId) UINT uiIDA[1]; uiIDA[0] = IDS_OK; - ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, m_iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, m_iPad); } else { // Not signed in to PSN UINT uiIDA[1]; uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; - ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, m_iPad, &UIScene_PauseMenu::MustSignInReturnedPSN, this, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, m_iPad, &UIScene_PauseMenu::MustSignInReturnedPSN, (LPVOID)GetCallbackUniqueId() ); } #else UINT uiIDA[1] = { IDS_OK }; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, m_iPad); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, m_iPad); #endif } else @@ -597,11 +597,11 @@ void UIScene_PauseMenu::handlePress(F64 controlId, F64 childId) #endif if(bContentRestricted) { -#if !(defined(_XBOX) || defined(_WIN64)) // 4J Stu - Temp to get the win build running, but so we check this for other platforms +#if !(defined(_XBOX) || defined(_WINDOWS64) || defined(_XBOX_ONE)) // 4J Stu - Temp to get the win build running, but so we check this for other platforms // you can't see leaderboards UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, m_iPad,NULL,this, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, m_iPad); #endif } else @@ -627,7 +627,7 @@ void UIScene_PauseMenu::handlePress(F64 controlId, F64 childId) { UINT uiIDA[1]; uiIDA[0]=IDS_OK; - ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad()); } else { @@ -671,27 +671,27 @@ void UIScene_PauseMenu::handlePress(F64 controlId, F64 childId) if(g_NetworkManager.GetPlayerCount()>1) { - ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, m_iPad,&UIScene_PauseMenu::ExitGameSaveDialogReturned,this, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, m_iPad,&UIScene_PauseMenu::ExitGameSaveDialogReturned, (LPVOID)GetCallbackUniqueId()); } else { - ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, m_iPad,&UIScene_PauseMenu::ExitGameSaveDialogReturned,this, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, m_iPad,&UIScene_PauseMenu::ExitGameSaveDialogReturned, (LPVOID)GetCallbackUniqueId()); } } else if(g_NetworkManager.IsHost() && g_NetworkManager.GetPlayerCount()>1) { - ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned, dynamic_cast(this), app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned, (LPVOID)GetCallbackUniqueId()); } else { - ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned, dynamic_cast(this), app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned, (LPVOID)GetCallbackUniqueId()); } #else if(StorageManager.GetSaveDisabled()) { uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_PROGRESS_LOST, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned,this, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_PROGRESS_LOST, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned, (LPVOID)GetCallbackUniqueId()); } else { @@ -703,11 +703,11 @@ void UIScene_PauseMenu::handlePress(F64 controlId, F64 childId) if(g_NetworkManager.GetPlayerCount()>1) { - ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, m_iPad,&UIScene_PauseMenu::ExitGameSaveDialogReturned,this, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_CONFIRM_DISCONNECT_SAVE, uiIDA, 3, m_iPad,&UIScene_PauseMenu::ExitGameSaveDialogReturned, (LPVOID)GetCallbackUniqueId()); } else { - ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, m_iPad,&UIScene_PauseMenu::ExitGameSaveDialogReturned,this, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 3, m_iPad,&UIScene_PauseMenu::ExitGameSaveDialogReturned, (LPVOID)GetCallbackUniqueId()); } } else @@ -715,7 +715,7 @@ void UIScene_PauseMenu::handlePress(F64 controlId, F64 childId) uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned,this, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned, (LPVOID)GetCallbackUniqueId()); } } #endif @@ -753,7 +753,7 @@ void UIScene_PauseMenu::handlePress(F64 controlId, F64 childId) UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_PROGRESS_LOST, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned, dynamic_cast(this), app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_EXIT_GAME, IDS_CONFIRM_EXIT_GAME_PROGRESS_LOST, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::ExitGameDialogReturned, (LPVOID)GetCallbackUniqueId()); } else @@ -788,12 +788,12 @@ void UIScene_PauseMenu::PerformActionSaveGame() // Unlock the full version? if(!ProfileManager.IsSignedInLive(m_iPad)) { -#if defined(__PS3__) +#if defined(__PS3__) || defined (__PSVITA__) m_eAction=eAction_SaveGamePSN; UINT uiIDA[2]; uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_PauseMenu::MustSignInReturnedPSN,this, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_PauseMenu::MustSignInReturnedPSN,(LPVOID)GetCallbackUniqueId()); #elif defined(__ORBIS__) m_eAction=eAction_SaveGamePSN; int npAvailability = ProfileManager.getNPAvailability(m_iPad); @@ -802,7 +802,7 @@ void UIScene_PauseMenu::PerformActionSaveGame() // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive is the npAvailability isn't SCE_OK UINT uiIDA[1]; uiIDA[0]=IDS_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, m_iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, m_iPad); } else // Determine why they're not "signed in live" @@ -813,14 +813,14 @@ void UIScene_PauseMenu::PerformActionSaveGame() UINT uiIDA[1]; uiIDA[0] = IDS_OK; - ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, m_iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, m_iPad); } else { // Not signed in to PSN UINT uiIDA[1]; uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; - ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, m_iPad, &UIScene_PauseMenu::MustSignInReturnedPSN, this, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, m_iPad, &UIScene_PauseMenu::MustSignInReturnedPSN, (LPVOID)GetCallbackUniqueId()); } #endif } @@ -829,7 +829,7 @@ void UIScene_PauseMenu::PerformActionSaveGame() UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_OK; uiIDA[1]=IDS_CONFIRM_CANCEL; - ui.RequestMessageBox(IDS_UNLOCK_TITLE, IDS_UNLOCK_TOSAVE_TEXT, uiIDA, 2,m_iPad,&UIScene_PauseMenu::UnlockFullSaveReturned,this,app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_UNLOCK_TITLE, IDS_UNLOCK_TOSAVE_TEXT, uiIDA, 2,m_iPad,&UIScene_PauseMenu::UnlockFullSaveReturned,(LPVOID)GetCallbackUniqueId()); } return; @@ -865,7 +865,7 @@ void UIScene_PauseMenu::PerformActionSaveGame() if(app.DLCInstallProcessCompleted() && !SonyCommerce_Vita::getDLCUpgradePending()) // MGH - devtrack #5861 On vita it can take a bit after the install has finished to register the purchase, so make sure we don't end up asking to purchase again #endif { - ui.RequestMessageBox(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, m_iPad,&UIScene_PauseMenu::WarningTrialTexturePackReturned,this,app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, m_iPad,&UIScene_PauseMenu::WarningTrialTexturePackReturned,(LPVOID)GetCallbackUniqueId()); } return; @@ -888,7 +888,7 @@ void UIScene_PauseMenu::PerformActionSaveGame() uiIDA[0]=IDS_SELECTANEWDEVICE; uiIDA[1]=IDS_NODEVICE_DECLINE; - ui.RequestMessageBox(IDS_STORAGEDEVICEPROBLEM_TITLE, IDS_FAILED_TO_LOADSAVE_TEXT, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::DeviceRemovedDialogReturned,this, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_STORAGEDEVICEPROBLEM_TITLE, IDS_FAILED_TO_LOADSAVE_TEXT, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::DeviceRemovedDialogReturned,(LPVOID)GetCallbackUniqueId()); } else #endif @@ -899,7 +899,7 @@ void UIScene_PauseMenu::PerformActionSaveGame() UINT uiIDA[2]; uiIDA[0]=IDS_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_TITLE_DISABLE_AUTOSAVE, IDS_CONFIRM_DISABLE_AUTOSAVE, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::DisableAutosaveDialogReturned,this, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_TITLE_DISABLE_AUTOSAVE, IDS_CONFIRM_DISABLE_AUTOSAVE, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::DisableAutosaveDialogReturned,(LPVOID)GetCallbackUniqueId()); } else #endif @@ -909,7 +909,7 @@ void UIScene_PauseMenu::PerformActionSaveGame() UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::SaveGameDialogReturned,this, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::SaveGameDialogReturned,(LPVOID)GetCallbackUniqueId()); } else { @@ -917,7 +917,7 @@ void UIScene_PauseMenu::PerformActionSaveGame() UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_TITLE_ENABLE_AUTOSAVE, IDS_CONFIRM_ENABLE_AUTOSAVE, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::EnableAutosaveDialogReturned,this, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_TITLE_ENABLE_AUTOSAVE, IDS_CONFIRM_ENABLE_AUTOSAVE, uiIDA, 2, m_iPad,&IUIScene_PauseMenu::EnableAutosaveDialogReturned,(LPVOID)GetCallbackUniqueId()); #else // flag a app action of save game app.SetAction(m_iPad,eAppAction_SaveGame); @@ -970,7 +970,6 @@ void UIScene_PauseMenu::HandleDLCMountingComplete() int UIScene_PauseMenu::UnlockFullSaveReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) { - UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)pParam; Minecraft *pMinecraft=Minecraft::GetInstance(); if(result==C4JStorage::EMessage_ResultAccept) @@ -985,7 +984,7 @@ int UIScene_PauseMenu::UnlockFullSaveReturned(void *pParam,int iPad,C4JStorage:: { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,pClass, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); } else #endif @@ -1004,11 +1003,12 @@ int UIScene_PauseMenu::UnlockFullSaveReturned(void *pParam,int iPad,C4JStorage:: int UIScene_PauseMenu::SaveGame_SignInReturned(void *pParam,bool bContinue, int iPad) { - UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)pParam; + UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)ui.GetSceneFromCallbackId((size_t)pParam); + if(pClass) pClass->SetIgnoreInput(false); if(bContinue==true) { - pClass->PerformActionSaveGame(); + if(pClass) pClass->PerformActionSaveGame(); } return 0; @@ -1029,24 +1029,23 @@ int UIScene_PauseMenu::BanGameDialogReturned(void *pParam,int iPad,C4JStorage::E #if defined(__PS3__) || defined (__PSVITA__) || defined(__ORBIS__) int UIScene_PauseMenu::MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::EMessageResult result) { - UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)pParam; - - if(result==C4JStorage::EMessage_ResultAccept) + UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)ui.GetSceneFromCallbackId((size_t)pParam); + if(result==C4JStorage::EMessage_ResultAccept && pClass) { #ifdef __PS3__ switch(pClass->m_eAction) { case eAction_ViewLeaderboardsPSN: - SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_PauseMenu::ViewLeaderboards_SignInReturned, pClass); + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_PauseMenu::ViewLeaderboards_SignInReturned, pParam); break; case eAction_ViewInvitesPSN: - SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_PauseMenu::ViewInvites_SignInReturned, pClass); + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_PauseMenu::ViewInvites_SignInReturned, pParam); break; case eAction_SaveGamePSN: - SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_PauseMenu::SaveGame_SignInReturned, pClass); + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_PauseMenu::SaveGame_SignInReturned, pParam); break; case eAction_BuyTexturePackPSN: - SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_PauseMenu::BuyTexturePack_SignInReturned, pClass); + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_PauseMenu::BuyTexturePack_SignInReturned, pParam); break; } #elif defined __PSVITA__ @@ -1059,16 +1058,17 @@ int UIScene_PauseMenu::MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::E //Force off CGameNetworkManager::setAdhocMode(false); //Now Sign-in - SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_PauseMenu::ViewLeaderboards_SignInReturned, pClass); + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_PauseMenu::ViewLeaderboards_SignInReturned, pParam); break; case eAction_ViewInvitesPSN: - SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_PauseMenu::ViewInvites_SignInReturned, pClass); + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_PauseMenu::ViewInvites_SignInReturned, pParam); break; case eAction_SaveGamePSN: - SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_PauseMenu::SaveGame_SignInReturned, pClass); + pClass->SetIgnoreInput(true); + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_PauseMenu::SaveGame_SignInReturned, pParam, true); break; case eAction_BuyTexturePackPSN: - SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_PauseMenu::BuyTexturePack_SignInReturned, pClass); + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_PauseMenu::BuyTexturePack_SignInReturned, pParam); break; } #else @@ -1095,7 +1095,8 @@ int UIScene_PauseMenu::MustSignInReturnedPSN(void *pParam,int iPad,C4JStorage::E int UIScene_PauseMenu::ViewLeaderboards_SignInReturned(void *pParam,bool bContinue, int iPad) { - UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)pParam; + UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)ui.GetSceneFromCallbackId((size_t)pParam); + if(!pClass) return 0; if(bContinue==true) { @@ -1105,7 +1106,7 @@ int UIScene_PauseMenu::ViewLeaderboards_SignInReturned(void *pParam,bool bContin // guests can't look at leaderboards if(ProfileManager.IsGuest(pClass->m_iPad)) { - ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,NULL, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1, ProfileManager.GetPrimaryPad()); } else if(ProfileManager.IsSignedInLive(iPad)) { @@ -1115,7 +1116,7 @@ int UIScene_PauseMenu::ViewLeaderboards_SignInReturned(void *pParam,bool bContin if(bContentRestricted) { // you can't see leaderboards - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,pClass, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); } else #endif @@ -1130,11 +1131,11 @@ int UIScene_PauseMenu::ViewLeaderboards_SignInReturned(void *pParam,bool bContin int UIScene_PauseMenu::WarningTrialTexturePackReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) { - UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)pParam; + UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)ui.GetSceneFromCallbackId((size_t)pParam); #ifdef __ORBIS__ // If a patch is available, can't proceed - if (pClass->CheckForPatch()) return 0; + if (!pClass || pClass->CheckForPatch()) return 0; #endif #if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) @@ -1142,7 +1143,7 @@ int UIScene_PauseMenu::WarningTrialTexturePackReturned(void *pParam,int iPad,C4J { if(!ProfileManager.IsSignedInLive(iPad)) { - pClass->m_eAction=eAction_SaveGamePSN; + if(pClass) pClass->m_eAction=eAction_SaveGamePSN; #ifdef __ORBIS__// Check if PSN is unavailable because of age restriction int npAvailability = ProfileManager.getNPAvailability(iPad); if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) @@ -1150,7 +1151,7 @@ int UIScene_PauseMenu::WarningTrialTexturePackReturned(void *pParam,int iPad,C4J // 4J Stu - This is a bit messy and is due to the library incorrectly returning false for IsSignedInLive is the npAvailability isn't SCE_OK UINT uiIDA[1]; uiIDA[0]=IDS_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); } else // Determine why they're not "signed in live" @@ -1161,20 +1162,20 @@ int UIScene_PauseMenu::WarningTrialTexturePackReturned(void *pParam,int iPad,C4J UINT uiIDA[1]; uiIDA[0] = IDS_OK; - ui.RequestMessageBox( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_ERROR_NETWORK_TITLE, IDS_ERROR_NETWORK, uiIDA, 1, iPad); } else { UINT uiIDA[1]; uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; - ui.RequestMessageBox( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, iPad, &UIScene_PauseMenu::MustSignInReturnedPSN, pClass, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage( IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 1, iPad, &UIScene_PauseMenu::MustSignInReturnedPSN, pParam); } #else // __PS3__ // You're not signed in to PSN! UINT uiIDA[2]; uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; uiIDA[1]=IDS_PRO_NOTONLINE_DECLINE; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 2, iPad,&UIScene_PauseMenu::MustSignInReturnedPSN,pClass, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 2, iPad,&UIScene_PauseMenu::MustSignInReturnedPSN,pParam); #endif } else @@ -1187,7 +1188,7 @@ int UIScene_PauseMenu::WarningTrialTexturePackReturned(void *pParam,int iPad,C4J { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad,NULL,pClass, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); } else #endif @@ -1249,8 +1250,6 @@ int UIScene_PauseMenu::WarningTrialTexturePackReturned(void *pParam,int iPad,C4J int UIScene_PauseMenu::BuyTexturePack_SignInReturned(void *pParam,bool bContinue, int iPad) { - UIScene_PauseMenu* pClass = (UIScene_PauseMenu*)pParam; - if(bContinue==true) { // Check if we're signed in to LIVE @@ -1266,7 +1265,7 @@ int UIScene_PauseMenu::BuyTexturePack_SignInReturned(void *pParam,bool bContinue { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad,NULL,pClass, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); } else #endif @@ -1350,7 +1349,6 @@ int UIScene_PauseMenu::ViewInvites_SignInReturned(void *pParam,bool bContinue, i int UIScene_PauseMenu::ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) { - UIScene_PauseMenu *pClass = (UIScene_PauseMenu *)pParam; // Exit with or without saving // Decline means save in this dialog if(result==C4JStorage::EMessage_ResultDecline || result==C4JStorage::EMessage_ResultThirdOption) @@ -1383,7 +1381,7 @@ int UIScene_PauseMenu::ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStora uiIDA[1]=IDS_CONFIRM_CANCEL; // Give the player a warning about the trial version of the texture pack - ui.RequestMessageBox(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad() ,&UIScene_PauseMenu::WarningTrialTexturePackReturned, dynamic_cast(pClass),app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_WARNING_DLC_TRIALTEXTUREPACK_TITLE, IDS_WARNING_DLC_TRIALTEXTUREPACK_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad() ,&UIScene_PauseMenu::WarningTrialTexturePackReturned, pParam); return S_OK; } @@ -1399,7 +1397,7 @@ int UIScene_PauseMenu::ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStora UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&IUIScene_PauseMenu::ExitGameAndSaveReturned, dynamic_cast(pClass), app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_TITLE_SAVE_GAME, IDS_CONFIRM_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&IUIScene_PauseMenu::ExitGameAndSaveReturned, pParam); return 0; } else @@ -1416,7 +1414,7 @@ int UIScene_PauseMenu::ExitGameSaveDialogReturned(void *pParam,int iPad,C4JStora UINT uiIDA[2]; uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_TITLE_DECLINE_SAVE_GAME, IDS_CONFIRM_DECLINE_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&IUIScene_PauseMenu::ExitGameDeclineSaveReturned, dynamic_cast(pClass), app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_TITLE_DECLINE_SAVE_GAME, IDS_CONFIRM_DECLINE_SAVE_GAME, uiIDA, 2, ProfileManager.GetPrimaryPad(),&IUIScene_PauseMenu::ExitGameDeclineSaveReturned, pParam); return 0; } diff --git a/Minecraft.Client/Common/UI/UIScene_QuadrantSignin.cpp b/Minecraft.Client/Common/UI/UIScene_QuadrantSignin.cpp index 4f1b9742..0cb6cf2b 100644 --- a/Minecraft.Client/Common/UI/UIScene_QuadrantSignin.cpp +++ b/Minecraft.Client/Common/UI/UIScene_QuadrantSignin.cpp @@ -16,41 +16,8 @@ UIScene_QuadrantSignin::UIScene_QuadrantSignin(int iPad, void *_initData, UILaye m_bIgnoreInput = false; m_lastRequestedAvatar = -1; - for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) - { - m_iconRequested[i] = false; - - m_labelPressToJoin[i].init(app.GetString(IDS_MUST_SIGN_IN_TITLE)); - m_labelConnectController[i].init(L""); - m_labelAccountType[i].init(L""); - - //wchar_t num[2]; - //swprintf(num,2,L"%d",i+1); - //m_labelPlayerNumber[i].init(num); - - m_controllerStatus[i] = eControllerStatus_ConnectController; - - if(ProfileManager.IsSignedIn(i)) - { - app.DebugPrintf("Index %d is signed in\n", i); - - setControllerState(i, eControllerStatus_PlayerDetails); - m_labelDisplayName[i].init(ProfileManager.GetDisplayName(i)); - } - else if(InputManager.IsPadConnected(i)) - { - app.DebugPrintf("Index %d is not signed in\n", i); - - setControllerState(i, eControllerStatus_PressToJoin); - m_labelDisplayName[i].init(L""); - } - else - { - app.DebugPrintf("Index %d is not connected\n", i); - - setControllerState(i, eControllerStatus_ConnectController); - } - } + + _initQuadrants(); #if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) if(InputManager.IsCircleCrossSwapped()) @@ -96,6 +63,8 @@ bool UIScene_QuadrantSignin::hidesLowerScenes() void UIScene_QuadrantSignin::tick() { + if(!getMovie()) return; + UIScene::tick(); updateState(); @@ -115,7 +84,7 @@ void UIScene_QuadrantSignin::handleInput(int iPad, int key, bool repeat, bool pr { if(pressed) { -#ifdef _DURANGO +#ifdef _XBOX_ONE if(InputManager.IsPadLocked(iPad)) { if(iPad != ProfileManager.GetPrimaryPad()) @@ -132,7 +101,7 @@ void UIScene_QuadrantSignin::handleInput(int iPad, int key, bool repeat, bool pr navigateBack(); } } -#ifdef _DURANGO +#ifdef _XBOX_ONE } #endif } @@ -144,12 +113,16 @@ void UIScene_QuadrantSignin::handleInput(int iPad, int key, bool repeat, bool pr if(pressed) { m_bIgnoreInput = true; +#ifdef _XBOX_ONE + if(ProfileManager.IsSignedIn(iPad)&&InputManager.IsPadLocked(iPad)) +#else if(ProfileManager.IsSignedIn(iPad)) +#endif { app.DebugPrintf("Signed in pad pressed\n"); ProfileManager.CancelProfileAvatarRequest(); -#ifdef _DURANGO +#ifdef _XBOX_ONE // On Durango, if we don't navigate forward here, then when we are on the main menu, it (re)gains focus & that causes our users to get cleared ui.NavigateToScene(m_iPad, eUIScene_Timer); #endif @@ -158,8 +131,18 @@ void UIScene_QuadrantSignin::handleInput(int iPad, int key, bool repeat, bool pr } else { - app.DebugPrintf("Non-signed in pad pressed\n"); - ProfileManager.RequestSignInUI(false, false, false, true, true,&UIScene_QuadrantSignin::SignInReturned, this, iPad); +#ifdef _XBOX_ONE + if(ProfileManager.IsSignedIn(0)&&!InputManager.IsPadLocked(0)) + { + app.DebugPrintf("Signed in pad with no controller bound pressed\n"); + ProfileManager.RequestSignInUI(false, false, false, true, false,&UIScene_QuadrantSignin::SignInReturned, this, iPad); + } + else +#endif + { + app.DebugPrintf("Non-signed in pad pressed\n"); + ProfileManager.RequestSignInUI(false, false, false, true, true,&UIScene_QuadrantSignin::SignInReturned, this, iPad); + } } } break; @@ -176,15 +159,23 @@ void UIScene_QuadrantSignin::handleInput(int iPad, int key, bool repeat, bool pr handled = true; } +#ifdef _XBOX_ONE +int UIScene_QuadrantSignin::SignInReturned(void *pParam,bool bContinue, int iPad, int iController) +#else int UIScene_QuadrantSignin::SignInReturned(void *pParam,bool bContinue, int iPad) +#endif { app.DebugPrintf("SignInReturned for pad %d\n", iPad); UIScene_QuadrantSignin *pClass = (UIScene_QuadrantSignin *)pParam; -#ifdef _DURANGO +#ifdef _XBOX_ONE if(bContinue && pClass->m_signInInfo.requireOnline && ProfileManager.IsSignedIn(iPad)) { + if( !InputManager.IsPadLocked(iPad) ) + { + ProfileManager.ForcePrimaryPadController(iController); + } ProfileManager.CheckMultiplayerPrivileges(iPad, true, &checkAllPrivilegesCallback, pClass); } else @@ -197,7 +188,7 @@ int UIScene_QuadrantSignin::SignInReturned(void *pParam,bool bContinue, int iPad return 0; } -#ifdef _DURANGO +#ifdef _XBOX_ONE void UIScene_QuadrantSignin::checkAllPrivilegesCallback(LPVOID lpParam, bool hasPrivileges, int iPad) { UIScene_QuadrantSignin* pClass = (UIScene_QuadrantSignin*)lpParam; @@ -219,7 +210,17 @@ void UIScene_QuadrantSignin::updateState() { //app.DebugPrintf("Index %d is signed in, display name - '%s'\n", i, ProfileManager.GetDisplayName(i).data()); - setControllerState(i, eControllerStatus_PlayerDetails); +#ifdef _XBOX_ONE + if(!InputManager.IsPadLocked(i)) + { + setControllerState(i, eControllerStatus_PressToJoin_LoggedIn); + } + else +#endif + { + setControllerState(i, eControllerStatus_PlayerDetails); + } + m_labelDisplayName[i].setLabel(ProfileManager.GetDisplayName(i)); //m_buttonControllers[i].setLabel(app.GetString(IDS_TOOLTIPS_CONTINUE),i); @@ -289,3 +290,53 @@ int UIScene_QuadrantSignin::AvatarReturned(LPVOID lpParam,PBYTE pbThumbnail,DWOR return 0; } + +void UIScene_QuadrantSignin::_initQuadrants() +{ + for(unsigned int i = 0; i < XUSER_MAX_COUNT; ++i) + { + m_iconRequested[i] = false; + + m_labelPressToJoin[i].init(IDS_MUST_SIGN_IN_TITLE); + m_labelConnectController[i].init(L""); + m_labelAccountType[i].init(L""); + + m_controllerStatus[i] = eControllerStatus_ConnectController; + + if(ProfileManager.IsSignedIn(i)) + { + app.DebugPrintf("Index %d is signed in\n", i); + +#ifdef _XBOX_ONE + if(!InputManager.IsPadLocked(i)) + { + setControllerState(i, eControllerStatus_PressToJoin_LoggedIn); + } + else +#endif + { + setControllerState(i, eControllerStatus_PlayerDetails); + } + + m_labelDisplayName[i].init(ProfileManager.GetDisplayName(i)); + } + else if(InputManager.IsPadConnected(i)) + { + app.DebugPrintf("Index %d is not signed in\n", i); + + setControllerState(i, eControllerStatus_PressToJoin); + m_labelDisplayName[i].init(L""); + } + else + { + app.DebugPrintf("Index %d is not connected\n", i); + + setControllerState(i, eControllerStatus_ConnectController); + } + } +} + +void UIScene_QuadrantSignin::handleReload() +{ + _initQuadrants(); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_QuadrantSignin.h b/Minecraft.Client/Common/UI/UIScene_QuadrantSignin.h index b500fcc3..691bb199 100644 --- a/Minecraft.Client/Common/UI/UIScene_QuadrantSignin.h +++ b/Minecraft.Client/Common/UI/UIScene_QuadrantSignin.h @@ -9,7 +9,9 @@ private: { eControllerStatus_ConnectController, eControllerStatus_PressToJoin, - eControllerStatus_PlayerDetails + eControllerStatus_PlayerDetails, + eControllerStatus_PressToJoin_LoggedIn, + eControllerStatus_PressToJoin_NoController, }; bool m_bIgnoreInput; @@ -98,7 +100,11 @@ public: virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); private: +#ifdef _XBOX_ONE + static int SignInReturned(void *pParam,bool bContinue, int iPad, int iController); +#else static int SignInReturned(void *pParam,bool bContinue, int iPad); +#endif static int AvatarReturned(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes); void updateState(); @@ -107,4 +113,9 @@ private: #ifdef _DURANGO static void checkAllPrivilegesCallback(LPVOID lpParam, bool hasPrivileges, int iPad); #endif + +protected: + void _initQuadrants(); + + virtual void handleReload(); }; diff --git a/Minecraft.Client/Common/UI/UIScene_SaveMessage.cpp b/Minecraft.Client/Common/UI/UIScene_SaveMessage.cpp index a91d5aa8..b58f86fd 100644 --- a/Minecraft.Client/Common/UI/UIScene_SaveMessage.cpp +++ b/Minecraft.Client/Common/UI/UIScene_SaveMessage.cpp @@ -156,10 +156,10 @@ void UIScene_SaveMessage::handleTimerComplete(int id) app.SetOptionsCallbackStatus(0,C4JStorage::eOptions_Callback_Read_CorruptDeletePending); m_bIgnoreInput=false; // give the option to delete the save - UINT uiIDA[1]; - uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_CORRUPT_FILE, IDS_CORRUPT_OPTIONS, uiIDA, 1, - 0,&UIScene_SaveMessage::DeleteOptionsDialogReturned,this, app.GetStringTable()); + UINT uiIDA[2]; + uiIDA[0]=IDS_CORRUPT_OPTIONS_RETRY; + uiIDA[1]=IDS_CORRUPT_OPTIONS_DELETE; + ui.RequestErrorMessage(IDS_CORRUPT_FILE, IDS_CORRUPT_OPTIONS, uiIDA, 2, 0,&UIScene_SaveMessage::DeleteOptionsDialogReturned,this); break; } #endif @@ -173,10 +173,16 @@ void UIScene_SaveMessage::handleTimerComplete(int id) int UIScene_SaveMessage::DeleteOptionsDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) { //UIScene_SaveMessage* pClass = (UIScene_SaveMessage*)pParam; - - // kick off the delete - StorageManager.DeleteOptionsData(iPad); - + if(result == C4JStorage::EMessage_ResultAccept) + { + // retry loading the options file + StorageManager.ReadFromProfile(iPad); + } + else // result == EMessage_ResultDecline + { + // kick off the delete + StorageManager.DeleteOptionsData(iPad); + } return 0; } #endif diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SettingsMenu.cpp index 4ef7eb5d..39a0b7c6 100644 --- a/Minecraft.Client/Common/UI/UIScene_SettingsMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_SettingsMenu.cpp @@ -10,17 +10,17 @@ UIScene_SettingsMenu::UIScene_SettingsMenu(int iPad, void *initData, UILayer *pa bool bNotInGame=(Minecraft::GetInstance()->level==NULL); - m_buttons[BUTTON_ALL_OPTIONS].init(app.GetString(IDS_OPTIONS),BUTTON_ALL_OPTIONS); - m_buttons[BUTTON_ALL_AUDIO].init(app.GetString(IDS_AUDIO),BUTTON_ALL_AUDIO); - m_buttons[BUTTON_ALL_CONTROL].init(app.GetString(IDS_CONTROL),BUTTON_ALL_CONTROL); - m_buttons[BUTTON_ALL_GRAPHICS].init(app.GetString(IDS_GRAPHICS),BUTTON_ALL_GRAPHICS); - m_buttons[BUTTON_ALL_UI].init(app.GetString(IDS_USER_INTERFACE),BUTTON_ALL_UI); - m_buttons[BUTTON_ALL_RESETTODEFAULTS].init(app.GetString(IDS_RESET_TO_DEFAULTS),BUTTON_ALL_RESETTODEFAULTS); + m_buttons[BUTTON_ALL_OPTIONS].init(IDS_OPTIONS,BUTTON_ALL_OPTIONS); + m_buttons[BUTTON_ALL_AUDIO].init(IDS_AUDIO,BUTTON_ALL_AUDIO); + m_buttons[BUTTON_ALL_CONTROL].init(IDS_CONTROL,BUTTON_ALL_CONTROL); + m_buttons[BUTTON_ALL_GRAPHICS].init(IDS_GRAPHICS,BUTTON_ALL_GRAPHICS); + m_buttons[BUTTON_ALL_UI].init(IDS_USER_INTERFACE,BUTTON_ALL_UI); + m_buttons[BUTTON_ALL_RESETTODEFAULTS].init(IDS_RESET_TO_DEFAULTS,BUTTON_ALL_RESETTODEFAULTS); if(ProfileManager.GetPrimaryPad()!=m_iPad) { - removeControl( &m_buttons[BUTTON_ALL_AUDIO], true); - removeControl( &m_buttons[BUTTON_ALL_GRAPHICS], true); + removeControl( &m_buttons[BUTTON_ALL_AUDIO], bNotInGame); + removeControl( &m_buttons[BUTTON_ALL_GRAPHICS], bNotInGame); } doHorizontalResizeCheck(); @@ -51,10 +51,11 @@ wstring UIScene_SettingsMenu::getMoviePath() void UIScene_SettingsMenu::handleReload() { + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); if(ProfileManager.GetPrimaryPad()!=m_iPad) { - removeControl( &m_buttons[BUTTON_ALL_AUDIO], true); - removeControl( &m_buttons[BUTTON_ALL_GRAPHICS], true); + removeControl( &m_buttons[BUTTON_ALL_AUDIO], bNotInGame); + removeControl( &m_buttons[BUTTON_ALL_GRAPHICS], bNotInGame); } doHorizontalResizeCheck(); @@ -142,7 +143,7 @@ void UIScene_SettingsMenu::handlePress(F64 controlId, F64 childId) uiIDA[0]=IDS_CONFIRM_CANCEL; uiIDA[1]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_DEFAULTS_TITLE, IDS_DEFAULTS_TEXT, uiIDA, 2, m_iPad,&UIScene_SettingsMenu::ResetDefaultsDialogReturned,this, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_DEFAULTS_TITLE, IDS_DEFAULTS_TEXT, uiIDA, 2, m_iPad,&UIScene_SettingsMenu::ResetDefaultsDialogReturned,this); } break; } diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.cpp index 72576ded..6898d489 100644 --- a/Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.cpp @@ -2,6 +2,10 @@ #include "UI.h" #include "UIScene_SettingsOptionsMenu.h" +#if defined(_XBOX_ONE) +#define _ENABLE_LANGUAGE_SELECT +#endif + int UIScene_SettingsOptionsMenu::m_iDifficultySettingA[4]= { IDS_DIFFICULTY_PEACEFUL, @@ -20,22 +24,24 @@ int UIScene_SettingsOptionsMenu::m_iDifficultyTitleSettingA[4]= UIScene_SettingsOptionsMenu::UIScene_SettingsOptionsMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer) { + m_bNavigateToLanguageSelector = false; + // Setup all the Iggy references we need for this scene initialiseMovie(); m_bNotInGame=(Minecraft::GetInstance()->level==NULL); - m_checkboxViewBob.init(app.GetString(IDS_VIEW_BOBBING),eControl_ViewBob,(app.GetGameSettings(m_iPad,eGameSetting_ViewBob)!=0)); - m_checkboxShowHints.init(app.GetString(IDS_HINTS),eControl_ShowHints,(app.GetGameSettings(m_iPad,eGameSetting_Hints)!=0)); - m_checkboxShowTooltips.init(app.GetString(IDS_IN_GAME_TOOLTIPS),eControl_ShowTooltips,(app.GetGameSettings(m_iPad,eGameSetting_Tooltips)!=0)); - m_checkboxInGameGamertags.init(app.GetString(IDS_IN_GAME_GAMERTAGS),eControl_InGameGamertags,(app.GetGameSettings(m_iPad,eGameSetting_GamertagsVisible)!=0)); + m_checkboxViewBob.init(IDS_VIEW_BOBBING,eControl_ViewBob,(app.GetGameSettings(m_iPad,eGameSetting_ViewBob)!=0)); + m_checkboxShowHints.init(IDS_HINTS,eControl_ShowHints,(app.GetGameSettings(m_iPad,eGameSetting_Hints)!=0)); + m_checkboxShowTooltips.init(IDS_IN_GAME_TOOLTIPS,eControl_ShowTooltips,(app.GetGameSettings(m_iPad,eGameSetting_Tooltips)!=0)); + m_checkboxInGameGamertags.init(IDS_IN_GAME_GAMERTAGS,eControl_InGameGamertags,(app.GetGameSettings(m_iPad,eGameSetting_GamertagsVisible)!=0)); // check if we should display the mash-up option if(m_bNotInGame && app.GetMashupPackWorlds(m_iPad)!=0xFFFFFFFF) { // the mash-up option is needed m_bMashUpWorldsUnhideOption=true; - m_checkboxMashupWorlds.init(app.GetString(IDS_UNHIDE_MASHUP_WORLDS),eControl_ShowMashUpWorlds,false); + m_checkboxMashupWorlds.init(IDS_UNHIDE_MASHUP_WORLDS,eControl_ShowMashUpWorlds,false); } else { @@ -92,7 +98,6 @@ UIScene_SettingsOptionsMenu::UIScene_SettingsOptionsMenu(int iPad, void *initDat bool bRemoveDifficulty=false; bool bRemoveAutosave=false; bool bRemoveInGameGamertags=false; - float fRemoveHeight=0.0f,fWidth,fHeight; bool bNotInGame=(Minecraft::GetInstance()->level==NULL); bool bPrimaryPlayer = ProfileManager.GetPrimaryPad()==m_iPad; @@ -128,6 +133,22 @@ UIScene_SettingsOptionsMenu::UIScene_SettingsOptionsMenu(int iPad, void *initDat removeControl(&m_checkboxInGameGamertags, true); } + // 4J-JEV: Changing languages in-game will produce many a bug. + // MGH - disabled the language select for the patch build, we'll re-enable afterwards + // 4J Stu - Removed it with a preprocessor def as we turn this off in various places +#ifdef _ENABLE_LANGUAGE_SELECT + if (app.GetGameStarted()) + { + removeControl( &m_buttonLanguageSelect, false ); + } + else + { + m_buttonLanguageSelect.init(IDS_LANGUAGE_SELECTOR, eControl_Languages); + } +#else + removeControl( &m_buttonLanguageSelect, false ); +#endif + doHorizontalResizeCheck(); if(app.GetLocalPlayerCount()>1) @@ -136,12 +157,26 @@ UIScene_SettingsOptionsMenu::UIScene_SettingsOptionsMenu(int iPad, void *initDat app.AdjustSplitscreenScene(m_hObj,&m_OriginalPosition,m_iPad); #endif } + + m_labelDifficultyText.disableReinitialisation(); } UIScene_SettingsOptionsMenu::~UIScene_SettingsOptionsMenu() { } +void UIScene_SettingsOptionsMenu::tick() +{ + UIScene::tick(); + + if (m_bNavigateToLanguageSelector) + { + m_bNavigateToLanguageSelector = false; + setGameSettings(); + ui.NavigateToScene(m_iPad, eUIScene_LanguageSelector); + } +} + wstring UIScene_SettingsOptionsMenu::getMoviePath() { if(app.GetLocalPlayerCount() > 1) @@ -173,7 +208,6 @@ void UIScene_SettingsOptionsMenu::updateComponents() if( app.GetLocalPlayerCount() == 1 ) m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,RenderManager.IsHiDef()); else m_parentLayer->showComponent(m_iPad,eUIComponent_Logo,false); - } } @@ -185,22 +219,7 @@ void UIScene_SettingsOptionsMenu::handleInput(int iPad, int key, bool repeat, bo case ACTION_MENU_CANCEL: if(pressed) { - // check the checkboxes - app.SetGameSettings(m_iPad,eGameSetting_ViewBob,m_checkboxViewBob.IsChecked()?1:0); - app.SetGameSettings(m_iPad,eGameSetting_GamertagsVisible,m_checkboxInGameGamertags.IsChecked()?1:0); - app.SetGameSettings(m_iPad,eGameSetting_Hints,m_checkboxShowHints.IsChecked()?1:0); - app.SetGameSettings(m_iPad,eGameSetting_Tooltips,m_checkboxShowTooltips.IsChecked()?1:0); - - // the mashup option will only be shown if some worlds have been previously hidden - if(m_bMashUpWorldsUnhideOption && m_checkboxMashupWorlds.IsChecked()) - { - // unhide all worlds - app.EnableMashupPackWorlds(m_iPad); - } - - // 4J-PB - don't action changes here or we might write to the profile on backing out here and then get a change in the settings all, and write again on backing out there - //app.CheckGameSettingsChanged(true,pInputData->UserIndex); - + setGameSettings(); navigateBack(); } break; @@ -219,9 +238,146 @@ void UIScene_SettingsOptionsMenu::handleInput(int iPad, int key, bool repeat, bo } } +void UIScene_SettingsOptionsMenu::handlePress(F64 controlId, F64 childId) +{ + //CD - Added for audio + ui.PlayUISFX(eSFX_Press); + + switch((int)controlId) + { + case eControl_Languages: + m_bNavigateToLanguageSelector = true; + break; + } +} + +void UIScene_SettingsOptionsMenu::handleReload() +{ + m_bNavigateToLanguageSelector = false; + + m_checkboxViewBob.init(IDS_VIEW_BOBBING,eControl_ViewBob,(app.GetGameSettings(m_iPad,eGameSetting_ViewBob)!=0)); + m_checkboxShowHints.init(IDS_HINTS,eControl_ShowHints,(app.GetGameSettings(m_iPad,eGameSetting_Hints)!=0)); + m_checkboxShowTooltips.init(IDS_IN_GAME_TOOLTIPS,eControl_ShowTooltips,(app.GetGameSettings(m_iPad,eGameSetting_Tooltips)!=0)); + m_checkboxInGameGamertags.init(IDS_IN_GAME_GAMERTAGS,eControl_InGameGamertags,(app.GetGameSettings(m_iPad,eGameSetting_GamertagsVisible)!=0)); + + // check if we should display the mash-up option + if(m_bNotInGame && app.GetMashupPackWorlds(m_iPad)!=0xFFFFFFFF) + { + // the mash-up option is needed + m_bMashUpWorldsUnhideOption=true; + } + else + { + //m_checkboxMashupWorlds.init(L"",eControl_ShowMashUpWorlds,false); + removeControl(&m_checkboxMashupWorlds, true); + m_bMashUpWorldsUnhideOption=false; + } + + unsigned char ucValue=app.GetGameSettings(m_iPad,eGameSetting_Autosave); + + wchar_t autosaveLabels[9][256]; + for(unsigned int i = 0; i < 9; ++i) + { + if(i==0) + { + swprintf( autosaveLabels[i], 256, L"%ls", app.GetString( IDS_SLIDER_AUTOSAVE_OFF )); + } + else + { + swprintf( autosaveLabels[i], 256, L"%ls: %d %ls", app.GetString( IDS_SLIDER_AUTOSAVE ),i*15, app.GetString( IDS_MINUTES )); + } + + } + m_sliderAutosave.setAllPossibleLabels(9,autosaveLabels); + m_sliderAutosave.init(autosaveLabels[ucValue],eControl_Autosave,0,8,ucValue); + +#if defined(_XBOX_ONE) || defined(__ORBIS__) + removeControl(&m_sliderAutosave,true); +#endif + + ucValue = app.GetGameSettings(m_iPad,eGameSetting_Difficulty); + + wchar_t difficultyLabels[4][256]; + for(unsigned int i = 0; i < 4; ++i) + { + swprintf( difficultyLabels[i], 256, L"%ls: %ls", app.GetString( IDS_SLIDER_DIFFICULTY ),app.GetString(m_iDifficultyTitleSettingA[i])); + } + m_sliderDifficulty.setAllPossibleLabels(4,difficultyLabels); + m_sliderDifficulty.init(difficultyLabels[ucValue],eControl_Difficulty,0,3,ucValue); + + wstring wsText=app.GetString(m_iDifficultySettingA[app.GetGameSettings(m_iPad,eGameSetting_Difficulty)]); + EHTMLFontSize size = eHTMLSize_Normal; + if(!RenderManager.IsHiDef() && !RenderManager.IsWidescreen()) + { + size = eHTMLSize_Splitscreen; + } + wchar_t startTags[64]; + swprintf(startTags,64,L"",app.GetHTMLColour(eHTMLColor_White)); + wsText= startTags + wsText; + + m_labelDifficultyText.init(wsText); + + + // If you are in-game, only the game host can change in-game gamertags, and you can't change difficulty + // only the primary player gets to change the autosave and difficulty settings + bool bRemoveDifficulty=false; + bool bRemoveAutosave=false; + bool bRemoveInGameGamertags=false; + + bool bNotInGame=(Minecraft::GetInstance()->level==NULL); + bool bPrimaryPlayer = ProfileManager.GetPrimaryPad()==m_iPad; + if(!bPrimaryPlayer) + { + bRemoveDifficulty=true; + bRemoveAutosave=true; + bRemoveInGameGamertags=true; + } + + if(!bNotInGame) // in the game + { + bRemoveDifficulty=true; + if(!g_NetworkManager.IsHost()) + { + bRemoveAutosave=true; + bRemoveInGameGamertags=true; + } + } + if(bRemoveDifficulty) + { + m_labelDifficultyText.setVisible( false ); + removeControl(&m_sliderDifficulty, true); + } + + if(bRemoveAutosave) + { + removeControl(&m_sliderAutosave, true); + } + + if(bRemoveInGameGamertags) + { + removeControl(&m_checkboxInGameGamertags, true); + } + + // MGH - disabled the language select for the patch build, we'll re-enable afterwards + // 4J Stu - Removed it with a preprocessor def as we turn this off in various places +#ifdef _ENABLE_LANGUAGE_SELECT + // 4J-JEV: Changing languages in-game will produce many a bug. + if (app.GetGameStarted()) + { + removeControl( &m_buttonLanguageSelect, false ); + } + else + { + } +#else + removeControl( &m_buttonLanguageSelect, false ); +#endif + + doHorizontalResizeCheck(); +} + void UIScene_SettingsOptionsMenu::handleSliderMove(F64 sliderId, F64 currentValue) { - WCHAR TempString[256]; int value = (int)currentValue; switch((int)sliderId) { @@ -251,3 +407,22 @@ void UIScene_SettingsOptionsMenu::handleSliderMove(F64 sliderId, F64 currentValu break; } } + +void UIScene_SettingsOptionsMenu::setGameSettings() +{ + // check the checkboxes + app.SetGameSettings(m_iPad,eGameSetting_ViewBob,m_checkboxViewBob.IsChecked()?1:0); + app.SetGameSettings(m_iPad,eGameSetting_GamertagsVisible,m_checkboxInGameGamertags.IsChecked()?1:0); + app.SetGameSettings(m_iPad,eGameSetting_Hints,m_checkboxShowHints.IsChecked()?1:0); + app.SetGameSettings(m_iPad,eGameSetting_Tooltips,m_checkboxShowTooltips.IsChecked()?1:0); + + // the mashup option will only be shown if some worlds have been previously hidden + if(m_bMashUpWorldsUnhideOption && m_checkboxMashupWorlds.IsChecked()) + { + // unhide all worlds + app.EnableMashupPackWorlds(m_iPad); + } + + // 4J-PB - don't action changes here or we might write to the profile on backing out here and then get a change in the settings all, and write again on backing out there + //app.CheckGameSettingsChanged(true,pInputData->UserIndex); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.h b/Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.h index 265a0790..e9abb0a9 100644 --- a/Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_SettingsOptionsMenu.h @@ -13,6 +13,7 @@ private: eControl_InGameGamertags, eControl_ShowMashUpWorlds, eControl_Autosave, + eControl_Languages, eControl_Difficulty }; protected: @@ -23,6 +24,8 @@ private: UIControl_CheckBox m_checkboxViewBob, m_checkboxShowHints, m_checkboxShowTooltips, m_checkboxInGameGamertags, m_checkboxMashupWorlds; // Checkboxes UIControl_Slider m_sliderAutosave, m_sliderDifficulty; // Sliders UIControl_Label m_labelDifficultyText; //Text + UIControl_Button m_buttonLanguageSelect; + UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) UI_MAP_ELEMENT( m_checkboxViewBob, "ViewBob") UI_MAP_ELEMENT( m_checkboxShowHints, "ShowHints") @@ -32,16 +35,21 @@ private: UI_MAP_ELEMENT( m_sliderAutosave, "Autosave") UI_MAP_ELEMENT( m_sliderDifficulty, "Difficulty") UI_MAP_ELEMENT( m_labelDifficultyText, "DifficultyText") + UI_MAP_ELEMENT( m_buttonLanguageSelect, "Languages") UI_END_MAP_ELEMENTS_AND_NAMES() bool m_bNotInGame; bool m_bMashUpWorldsUnhideOption; + bool m_bNavigateToLanguageSelector; + public: UIScene_SettingsOptionsMenu(int iPad, void *initData, UILayer *parentLayer); virtual ~UIScene_SettingsOptionsMenu(); virtual EUIScene getSceneType() { return eUIScene_SettingsOptionsMenu;} + virtual void tick(); + virtual void updateTooltips(); virtual void updateComponents(); @@ -52,6 +60,13 @@ protected: public: // INPUT virtual void handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled); + virtual void handlePress(F64 controlId, F64 childId); + + virtual void handleReload(); virtual void handleSliderMove(F64 sliderId, F64 currentValue); + +protected: + void setGameSettings(); + }; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.cpp index 33f41994..d4f26ae7 100644 --- a/Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.cpp @@ -222,170 +222,7 @@ void UIScene_SkinSelectMenu::handleInput(int iPad, int key, bool repeat, bool pr #endif if(pressed) { - ui.AnimateKeyPress(iPad, key, repeat, pressed, released); - // if the profile data has been changed, then force a profile write - // It seems we're allowed to break the 5 minute rule if it's the result of a user action - switch(m_packIndex) - { - case SKIN_SELECT_PACK_DEFAULT: - app.SetPlayerSkin(iPad, m_skinIndex); - app.SetPlayerCape(iPad, 0); - m_currentSkinPath = app.GetPlayerSkinName(iPad); - m_originalSkinId = app.GetPlayerSkinId(iPad); - setCharacterSelected(true); - ui.PlayUISFX(eSFX_Press); - break; - case SKIN_SELECT_PACK_FAVORITES: - if(app.GetPlayerFavoriteSkinsCount(iPad)>0) - { - // get the pack number from the skin id - wchar_t chars[256]; - swprintf(chars, 256, L"dlcskin%08d.png", app.GetPlayerFavoriteSkin(iPad,m_skinIndex)); - - DLCPack *Pack=app.m_dlcManager.getPackContainingSkin(chars); - - if(Pack) - { - DLCSkinFile *skinFile = Pack->getSkinFile(chars); - app.SetPlayerSkin(iPad, skinFile->getPath()); - app.SetPlayerCape(iPad, skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape)); - setCharacterSelected(true); - m_currentSkinPath = app.GetPlayerSkinName(iPad); - m_originalSkinId = app.GetPlayerSkinId(iPad); - app.SetPlayerFavoriteSkinsPos(iPad,m_skinIndex); - } - } - break; - default: - if( m_currentPack != NULL ) - { - DLCSkinFile *skinFile = m_currentPack->getSkinFile(m_skinIndex); - - if ( !skinFile->getParameterAsBool( DLCManager::e_DLCParamType_Free ) // Is this a free skin? - && !m_currentPack->hasPurchasedFile( DLCManager::e_DLCType_Skin, skinFile->getPath() ) // do we have a license? - ) - { - // 4J-PB - check for a patch -#ifdef __ORBIS__ - // 4J-PB - Check if there is a patch for the game - int errorCode = ProfileManager.getNPAvailability(ProfileManager.GetPrimaryPad()); - - bool bPatchAvailable; - switch(errorCode) - { - case SCE_NP_ERROR_LATEST_PATCH_PKG_EXIST: - case SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED: - bPatchAvailable=true; - break; - default: - bPatchAvailable=false; - break; - } - - if(bPatchAvailable) - { - int32_t ret=sceErrorDialogInitialize(); - m_bErrorDialogRunning=true; - if ( ret==SCE_OK ) - { - SceErrorDialogParam param; - sceErrorDialogParamInitialize( ¶m ); - // 4J-PB - We want to display the option to get the patch now - param.errorCode = SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED;//pClass->m_errorCode; - ret = sceUserServiceGetInitialUser( ¶m.userId ); - if ( ret == SCE_OK ) - { - ret=sceErrorDialogOpen( ¶m ); - break; - } - } - } -#endif - - // no - UINT uiIDA[1] = { IDS_OK }; -#ifdef __ORBIS__ - // Check if PSN is unavailable because of age restriction - int npAvailability = ProfileManager.getNPAvailability(iPad); - if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) - { - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable()); - } - else -#endif - // We need to upsell the full version - if(ProfileManager.IsGuest(iPad)) - { - // can't buy - ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1,iPad,NULL,NULL,app.GetStringTable(),NULL,0,false); - } - // are we online? - else if(!ProfileManager.IsSignedInLive(iPad)) - { - showNotOnlineDialog(iPad); - } - else - { - // upsell -#ifdef _XBOX - DLC_INFO *pDLCInfo = app.GetDLCInfoForTrialOfferID(m_currentPack->getPurchaseOfferId()); - ULONGLONG ullOfferID_Full; - - if(pDLCInfo!=NULL) - { - ullOfferID_Full=pDLCInfo->ullOfferID_Full; - } - else - { - ullOfferID_Full=m_currentPack->getPurchaseOfferId(); - } - - // tell sentient about the upsell of the full version of the skin pack - TelemetryManager->RecordUpsellPresented(iPad, eSet_UpsellID_Skin_DLC, ullOfferID_Full & 0xFFFFFFFF); -#endif - bool bContentRestricted=false; -#if defined(__PS3__) || defined(__PSVITA__) - ProfileManager.GetChatAndContentRestrictions(m_iPad,true,NULL,&bContentRestricted,NULL); -#endif - if(bContentRestricted) - { -#if !(defined(_XBOX) || defined(_WIN64)) // 4J Stu - Temp to get the win build running, but so we check this for other platforms - // you can't see the store - UINT uiIDA[1] = { IDS_CONFIRM_OK }; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad,NULL,this, app.GetStringTable(),NULL,0,false); -#endif - } - else - { - // 4J-PB - need to check for an empty store -#if defined __ORBIS__ || defined __PSVITA__ || defined __PS3__ - if(app.CheckForEmptyStore(iPad)==false) -#endif - { - this->m_bIgnoreInput = true; - - UINT uiIDA[2] = { IDS_CONFIRM_OK, IDS_CONFIRM_CANCEL }; - ui.RequestMessageBox(IDS_UNLOCK_DLC_TITLE, IDS_UNLOCK_DLC_SKIN, uiIDA, 2, iPad,&UIScene_SkinSelectMenu::UnlockSkinReturned,this,app.GetStringTable(),NULL,0,false); - } - } - } - } - else - { - app.SetPlayerSkin(iPad, skinFile->getPath()); - app.SetPlayerCape(iPad, skinFile->getParameterAsString(DLCManager::e_DLCParamType_Cape)); - setCharacterSelected(true); - m_currentSkinPath = app.GetPlayerSkinName(iPad); - m_originalSkinId = app.GetPlayerSkinId(iPad); - - // push this onto the favorite list - AddFavoriteSkin(iPad,GET_DLC_SKIN_ID_FROM_BITMASK(m_originalSkinId)); - } - } - - ui.PlayUISFX(eSFX_Press); - break; - } + InputActionOK(iPad); } break; case ACTION_MENU_UP: @@ -614,17 +451,62 @@ void UIScene_SkinSelectMenu::InputActionOK(unsigned int iPad) //if(true) if(!m_currentPack->hasPurchasedFile( DLCManager::e_DLCType_Skin, skinFile->getPath() )) { +#ifdef __ORBIS__ + // 4J-PB - Check if there is a patch for the game + int errorCode = ProfileManager.getNPAvailability(ProfileManager.GetPrimaryPad()); + + bool bPatchAvailable; + switch(errorCode) + { + case SCE_NP_ERROR_LATEST_PATCH_PKG_EXIST: + case SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED: + bPatchAvailable=true; + break; + default: + bPatchAvailable=false; + break; + } + + if(bPatchAvailable) + { + int32_t ret=sceErrorDialogInitialize(); + m_bErrorDialogRunning=true; + if ( ret==SCE_OK ) + { + SceErrorDialogParam param; + sceErrorDialogParamInitialize( ¶m ); + // 4J-PB - We want to display the option to get the patch now + param.errorCode = SCE_NP_ERROR_LATEST_PATCH_PKG_DOWNLOADED;//pClass->m_errorCode; + ret = sceUserServiceGetInitialUser( ¶m.userId ); + if ( ret == SCE_OK ) + { + ret=sceErrorDialogOpen( ¶m ); + break; + } + } + } +#endif + // no UINT uiIDA[1]; uiIDA[0]=IDS_OK; +#ifdef __ORBIS__ + // Check if PSN is unavailable because of age restriction + int npAvailability = ProfileManager.getNPAvailability(iPad); + if (npAvailability == SCE_NP_ERROR_AGE_RESTRICTION) + { + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); + } + else +#endif // We need to upsell the full version if(ProfileManager.IsGuest(iPad)) { // can't buy - ui.RequestMessageBox(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1,iPad,NULL,NULL,app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage(IDS_PRO_GUESTPROFILE_TITLE, IDS_PRO_GUESTPROFILE_TEXT, uiIDA, 1,iPad); } -#if defined(__PS3__) || defined(__ORBIS__) +#if defined(__PS3__) || defined(__ORBIS__) || defined __PSVITA__ // are we online? else if(!ProfileManager.IsSignedInLive(iPad)) { @@ -656,11 +538,11 @@ void UIScene_SkinSelectMenu::InputActionOK(unsigned int iPad) #endif if(bContentRestricted) { -#if !(defined(_XBOX) || defined(_WIN64)) // 4J Stu - Temp to get the win build running, but so we check this for other platforms +#if !(defined(_XBOX) || defined(_WINDOWS64) || defined(_XBOX_ONE)) // 4J Stu - Temp to get the win build running, but so we check this for other platforms // you can't see the store UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,this, app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, iPad); #endif } else @@ -674,7 +556,7 @@ void UIScene_SkinSelectMenu::InputActionOK(unsigned int iPad) renableInputAfterOperation = false; UINT uiIDA[2] = { IDS_CONFIRM_OK, IDS_CONFIRM_CANCEL }; - ui.RequestMessageBox(IDS_UNLOCK_DLC_TITLE, IDS_UNLOCK_DLC_SKIN, uiIDA, 2, iPad,&UIScene_SkinSelectMenu::UnlockSkinReturned,this,app.GetStringTable(),NULL,0,false); + ui.RequestAlertMessage(IDS_UNLOCK_DLC_TITLE, IDS_UNLOCK_DLC_SKIN, uiIDA, 2, iPad,&UIScene_SkinSelectMenu::UnlockSkinReturned,this); } } } @@ -703,7 +585,10 @@ void UIScene_SkinSelectMenu::InputActionOK(unsigned int iPad) AddFavoriteSkin(iPad,GET_DLC_SKIN_ID_FROM_BITMASK(m_originalSkinId)); } - if (renableInputAfterOperation) m_bIgnoreInput = false; + if (renableInputAfterOperation) + { + m_bIgnoreInput = false; + } } ui.PlayUISFX(eSFX_Press); @@ -1652,7 +1537,18 @@ void UIScene_SkinSelectMenu::showNotOnlineDialog(int iPad) SQRNetworkManager_PS3::AttemptPSNSignIn(NULL, this); #elif defined(__PSVITA__) - SQRNetworkManager_Vita::AttemptPSNSignIn(NULL, this); + if(CGameNetworkManager::usingAdhocMode() && SQRNetworkManager_AdHoc_Vita::GetAdhocStatus()) + { + // we're in adhoc mode, we really need to ask before disconnecting + UINT uiIDA[2]; + uiIDA[0]=IDS_PRO_NOTONLINE_ACCEPT; + uiIDA[1]=IDS_CANCEL; + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, ProfileManager.GetPrimaryPad(),&UIScene_SkinSelectMenu::MustSignInReturned,NULL); + } + else + { + SQRNetworkManager_Vita::AttemptPSNSignIn(NULL, this); + } #elif defined(__ORBIS__) SQRNetworkManager_Orbis::AttemptPSNSignIn(NULL, this, false, iPad); @@ -1660,7 +1556,7 @@ void UIScene_SkinSelectMenu::showNotOnlineDialog(int iPad) #elif defined(_DURANGO) UINT uiIDA[1] = { IDS_CONFIRM_OK }; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad, NULL, NULL, app.GetStringTable() ); + ui.RequestErrorMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_XBOXLIVE_NOTIFICATION, uiIDA, 1, iPad ); #endif } @@ -1723,9 +1619,9 @@ int UIScene_SkinSelectMenu::UnlockSkinReturned(void *pParam,int iPad,C4JStorage: app.Checkout(chSkuID); } } - // need to re-enable input because the user can back out of the store purchase, and we'll be stuck - pScene->m_bIgnoreInput = false; } + // need to re-enable input because the user can back out of the store purchase, and we'll be stuck + pScene->m_bIgnoreInput = false; // MGH - moved this to outside the pSONYDLCInfo, so we don't get stuck #elif defined _XBOX_ONE StorageManager.InstallOffer(1,(WCHAR *)(pScene->m_currentPack->getPurchaseOfferId().c_str()), &RenableInput, pScene, NULL); #endif @@ -1810,4 +1706,32 @@ void UIScene_SkinSelectMenu::HandleDLCLicenseChange() // update the lock flag handleSkinIndexChanged(); } -#endif \ No newline at end of file +#endif + + + + +#ifdef __PSVITA__ +int UIScene_SkinSelectMenu::MustSignInReturned(void *pParam,int iPad,C4JStorage::EMessageResult result) +{ + if(result==C4JStorage::EMessage_ResultAccept) + { +#ifdef __PS3__ + SQRNetworkManager_PS3::AttemptPSNSignIn(&UIScene_SkinSelectMenu::PSNSignInReturned, pParam,true); +#elif defined __PSVITA__ + SQRNetworkManager_Vita::AttemptPSNSignIn(&UIScene_SkinSelectMenu::PSNSignInReturned, pParam,true); +#elif defined __ORBIS__ + SQRNetworkManager_Orbis::AttemptPSNSignIn(&UIScene_SkinSelectMenu::PSNSignInReturned, pParam,true); +#endif + } + return 0; +} + +int UIScene_SkinSelectMenu::PSNSignInReturned(void* pParam, bool bContinue, int iPad) +{ + if( bContinue ) + { + } + return 0; +} +#endif // __PSVITA__ \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.h b/Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.h index c9ed6691..e8d76096 100644 --- a/Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_SkinSelectMenu.h @@ -183,6 +183,12 @@ private: bool m_bErrorDialogRunning; #endif +#ifdef __PSVITA__ + static int MustSignInReturned(void *pParam,int iPad,C4JStorage::EMessageResult result); + static int PSNSignInReturned(void* pParam, bool bContinue, int iPad); +#endif + + #ifdef __PSVITA__ CRITICAL_SECTION m_DLCInstallCS; // to prevent a race condition between the install and the mounted callback #endif diff --git a/Minecraft.Client/Common/UI/UIScene_Timer.cpp b/Minecraft.Client/Common/UI/UIScene_Timer.cpp index 61586e87..3dec20a3 100644 --- a/Minecraft.Client/Common/UI/UIScene_Timer.cpp +++ b/Minecraft.Client/Common/UI/UIScene_Timer.cpp @@ -20,7 +20,7 @@ wstring UIScene_Timer::getMoviePath() return L"Timer"; } -void UIScene_Timer::reloadMovie() +void UIScene_Timer::reloadMovie(bool force) { // Never needs reloaded } diff --git a/Minecraft.Client/Common/UI/UIScene_Timer.h b/Minecraft.Client/Common/UI/UIScene_Timer.h index 5a75103a..ef6aae94 100644 --- a/Minecraft.Client/Common/UI/UIScene_Timer.h +++ b/Minecraft.Client/Common/UI/UIScene_Timer.h @@ -20,7 +20,7 @@ public: // Returns true if lower scenes in this scenes layer, or in any layer below this scenes layers should be hidden virtual bool hidesLowerScenes() { return true; } - virtual void reloadMovie(); + virtual void reloadMovie(bool force); virtual bool needsReloaded(); protected: diff --git a/Minecraft.Client/Common/UI/UIScene_TradingMenu.cpp b/Minecraft.Client/Common/UI/UIScene_TradingMenu.cpp index dc2bac48..0a35c8e5 100644 --- a/Minecraft.Client/Common/UI/UIScene_TradingMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_TradingMenu.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "UI.h" #include "..\..\..\Minecraft.World\net.minecraft.world.inventory.h" +#include "..\..\..\Minecraft.World\net.minecraft.world.item.h" #include "..\..\..\Minecraft.World\net.minecraft.world.item.trading.h" #include "..\..\..\Minecraft.World\net.minecraft.world.level.tile.entity.h" #include "MultiPlayerLocalPlayer.h" @@ -118,6 +119,15 @@ void UIScene_TradingMenu::handleReload() m_slotListInventory.addSlots(MerchantMenu::INV_SLOT_START, 27); m_slotListHotbar.addSlots(MerchantMenu::USE_ROW_SLOT_START, 9); + + updateDisplay(); + + IggyDataValue result; + IggyDataValue value[1]; + + value[0].type = IGGY_DATATYPE_number; + value[0].number = m_selectedSlot; + IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetActiveSlot , 1 , value ); } void UIScene_TradingMenu::tick() @@ -253,16 +263,33 @@ void UIScene_TradingMenu::setTradeRedBox(int index, bool show) m_slotListTrades.showSlotRedBox(index,show); } -void UIScene_TradingMenu::setOfferDescription(const wstring &name, vector &unformattedStrings) +void UIScene_TradingMenu::setOfferDescription(vector *description) { + wstring descriptionStr = HtmlString::Compose(description); + IggyDataValue result; IggyDataValue value[1]; IggyStringUTF16 stringVal; - stringVal.string = (IggyUTF16*)name.c_str(); - stringVal.length = name.length(); + stringVal.string = (IggyUTF16*)descriptionStr.c_str(); + stringVal.length = descriptionStr.length(); value[0].type = IGGY_DATATYPE_string_UTF16; value[0].string16 = stringVal; IggyResult out = IggyPlayerCallMethodRS ( getMovie() , &result, IggyPlayerRootPath( getMovie() ), m_funcSetOfferDescription , 1 , value ); } + +void UIScene_TradingMenu::HandleMessage(EUIMessage message, void *data) +{ + switch(message) + { + case eUIMessage_InventoryUpdated: + handleInventoryUpdated(data); + break; + }; +} + +void UIScene_TradingMenu::handleInventoryUpdated(LPVOID data) +{ + HandleInventoryUpdated(); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_TradingMenu.h b/Minecraft.Client/Common/UI/UIScene_TradingMenu.h index 08263a1c..a22ba0cf 100644 --- a/Minecraft.Client/Common/UI/UIScene_TradingMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_TradingMenu.h @@ -23,7 +23,7 @@ protected: UIControl_Label m_labelTrading, m_labelRequired; UIControl_Label m_labelRequest1, m_labelRequest2; - IggyName m_funcMoveSelector, m_funcShowScrollRightArrow, m_funcShowScrollLeftArrow, m_funcSetOfferDescription; + IggyName m_funcMoveSelector, m_funcShowScrollRightArrow, m_funcShowScrollLeftArrow, m_funcSetOfferDescription, m_funcSetActiveSlot; UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene) UI_MAP_ELEMENT( m_controlMainPanel, "MainPanel" ) @@ -48,6 +48,7 @@ protected: UI_MAP_NAME(m_funcShowScrollRightArrow, L"ShowScrollRightArrow") UI_MAP_NAME(m_funcShowScrollLeftArrow, L"ShowScrollLeftArrow") UI_MAP_NAME(m_funcSetOfferDescription, L"SetOfferDescription") + UI_MAP_NAME(m_funcSetActiveSlot, L"SetSelectorSlot") UI_END_MAP_ELEMENTS_AND_NAMES() virtual wstring getMoviePath(); @@ -72,7 +73,10 @@ protected: virtual void setRequest2RedBox(bool show); virtual void setTradeRedBox(int index, bool show); - virtual void setOfferDescription(const wstring &name, vector &unformattedStrings); + virtual void setOfferDescription(vector *description); + + virtual void HandleMessage(EUIMessage message, void *data); + void handleInventoryUpdated(LPVOID data); int getPad() { return m_iPad; } }; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIScene_TrialExitUpsell.cpp b/Minecraft.Client/Common/UI/UIScene_TrialExitUpsell.cpp index b395bc4c..9ef8f189 100644 --- a/Minecraft.Client/Common/UI/UIScene_TrialExitUpsell.cpp +++ b/Minecraft.Client/Common/UI/UIScene_TrialExitUpsell.cpp @@ -55,7 +55,7 @@ void UIScene_TrialExitUpsell::handleInput(int iPad, int key, bool repeat, bool p { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad(),NULL,this, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, ProfileManager.GetPrimaryPad()); } else #endif diff --git a/Minecraft.Client/Common/UI/UIString.cpp b/Minecraft.Client/Common/UI/UIString.cpp new file mode 100644 index 00000000..288fa87a --- /dev/null +++ b/Minecraft.Client/Common/UI/UIString.cpp @@ -0,0 +1,176 @@ +#include "stdafx.h" + +#include "..\..\..\Minecraft.World\StringHelpers.h" + +#include "UIString.h" + +bool UIString::setCurrentLanguage() +{ + int nextLanguage, nextLocale; + nextLanguage = XGetLanguage(); + nextLocale = XGetLocale(); + + if ( (nextLanguage != s_currentLanguage) || (nextLocale != s_currentLocale) ) + { + s_currentLanguage = nextLanguage; + s_currentLocale = nextLocale; + return true; + } + + return false; +} + +int UIString::getCurrentLanguage() +{ + return s_currentLanguage; +} + +UIString::UIStringCore::UIStringCore(StringBuilder wstrBuilder) +{ + m_bIsConstant = false; + + m_lastSetLanguage = m_lastSetLocale = -1; + m_lastUpdatedLanguage = m_lastUpdatedLocale = -1; + + m_fStringBuilder = wstrBuilder; + + m_wstrCache = L""; + update(true); +} + +UIString::UIStringCore::UIStringCore(const wstring &str) +{ + m_bIsConstant = true; + + m_lastSetLanguage = m_lastSetLocale = -1; + m_lastUpdatedLanguage = m_lastUpdatedLocale = -1; + + m_wstrCache = str; +} + +wstring &UIString::UIStringCore::getString() +{ + if (hasNewString()) update(true); + return m_wstrCache; +} + +bool UIString::UIStringCore::hasNewString() +{ + if (m_bIsConstant) return false; + return (m_lastSetLanguage != s_currentLanguage) || (m_lastSetLocale != s_currentLocale); +} + +bool UIString::UIStringCore::update(bool force) +{ + if ( !m_bIsConstant && (force || hasNewString()) ) + { + m_wstrCache = m_fStringBuilder(); + m_lastSetLanguage = s_currentLanguage; + m_lastSetLocale = s_currentLocale; + return true; + } + return false; +} + +bool UIString::UIStringCore::needsUpdating() +{ + if (m_bIsConstant) return false; + return (m_lastSetLanguage != s_currentLanguage) || (m_lastUpdatedLanguage != m_lastSetLanguage) + || (m_lastSetLocale != s_currentLocale) || (m_lastUpdatedLocale != m_lastSetLocale); +} + +void UIString::UIStringCore::setUpdated() +{ + m_lastUpdatedLanguage = m_lastSetLanguage; + m_lastUpdatedLocale = m_lastSetLocale; +} + +int UIString::s_currentLanguage = -1; +int UIString::s_currentLocale = -1; + +UIString::UIString() +{ + m_core = shared_ptr(); +} + +UIString::UIString(int ids) +{ +#ifdef __PS3__ + StringBuilder builder = StringBuilder( new IdsStringBuilder(ids) ); +#else + StringBuilder builder = [ids](){ return app.GetString(ids); }; +#endif + UIStringCore *core = new UIStringCore( builder ); + m_core = shared_ptr(core); +} + +UIString::UIString(StringBuilder wstrBuilder) +{ + UIStringCore *core = new UIStringCore(wstrBuilder); + m_core = shared_ptr(core); +} + +UIString::UIString(const string &constant) +{ + wstring wstr = convStringToWstring(constant); + UIStringCore *core = new UIStringCore( wstr ); + m_core = shared_ptr(core); +} + +UIString::UIString(const wstring &constant) +{ + UIStringCore *core = new UIStringCore(constant); + m_core = shared_ptr(core); +} + +UIString::UIString(const wchar_t *constant) +{ + wstring str = wstring(constant); + UIStringCore *core = new UIStringCore(str); + m_core = shared_ptr(core); +} + +UIString::~UIString() +{ +#ifndef __PS3__ + m_core = nullptr; +#endif +} + +bool UIString::empty() +{ + return m_core.get() == NULL; +} + +bool UIString::compare(const UIString &uiString) +{ + return m_core.get() != uiString.m_core.get(); +} + +bool UIString::needsUpdating() +{ + if (m_core != NULL) return m_core->needsUpdating(); + else return false; +} + +void UIString::setUpdated() +{ + if (m_core != NULL) m_core->setUpdated(); +} + +wstring &UIString::getString() +{ + static wstring blank(L""); + if (m_core != NULL) return m_core->getString(); + else return blank; +} + +const wchar_t *UIString::c_str() +{ + return getString().c_str(); +} + +unsigned int UIString::length() +{ + return getString().length(); +} \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIString.h b/Minecraft.Client/Common/UI/UIString.h new file mode 100644 index 00000000..29e5a068 --- /dev/null +++ b/Minecraft.Client/Common/UI/UIString.h @@ -0,0 +1,103 @@ +#pragma once + +#include +#include + + +#ifndef __PS3__ + +typedef function StringBuilder; + +#else + +class StringBuilderCore +{ +public: + virtual wstring getString() = 0; +}; + +struct StringBuilder +{ + shared_ptr m_coreBuilder; + virtual wstring operator()() { return m_coreBuilder->getString(); } + StringBuilder() {} + StringBuilder(StringBuilderCore *core) { m_coreBuilder = shared_ptr(core); } +}; + +class IdsStringBuilder : public StringBuilderCore +{ + const int m_ids; +public: + IdsStringBuilder(int ids) : m_ids(ids) {} + virtual wstring getString(void) { return app.GetString(m_ids); } +}; +#endif + +using namespace std; + +class UIString +{ +protected: + static int s_currentLanguage; + static int s_currentLocale; + +public: + static bool setCurrentLanguage(); + static int getCurrentLanguage(); + +protected: + class UIStringCore : public enable_shared_from_this + { + private: + int m_lastSetLanguage; + int m_lastSetLocale; + + int m_lastUpdatedLanguage; + int m_lastUpdatedLocale; + + wstring m_wstrCache; + + bool m_bIsConstant; + + StringBuilder m_fStringBuilder; + + public: + UIStringCore(StringBuilder wstrBuilder); + UIStringCore(const wstring &str); + + wstring &getString(); + + bool hasNewString(); + bool update(bool force); + + bool needsUpdating(); + void setUpdated(); + }; + + shared_ptr m_core; + +public: + UIString(); + + UIString(int ids); // Create a dynamic UI string from a string id value. + + UIString(StringBuilder wstrBuilder); // Create a dynamic UI string with a custom update function. + + // Create a UIString with a constant value. + UIString(const string &constant); + UIString(const wstring &constant); + UIString(const wchar_t *constant); + + ~UIString(); + + bool empty(); + bool compare(const UIString &uiString); + + bool needsUpdating(); // Language has been change since the last time setUpdated was called. + void setUpdated(); // The new text has been used. + + wstring &getString(); + + const wchar_t *c_str(); + unsigned int length(); +}; \ No newline at end of file diff --git a/Minecraft.Client/Common/UI/UIStructs.h b/Minecraft.Client/Common/UI/UIStructs.h index 2dd03c8c..c41f2276 100644 --- a/Minecraft.Client/Common/UI/UIStructs.h +++ b/Minecraft.Client/Common/UI/UIStructs.h @@ -13,6 +13,10 @@ class SignTileEntity; class LevelGenerationOptions; class LocalPlayer; class Merchant; +class EntityHorse; +class BeaconTileEntity; +class Slot; +class AbstractContainerMenu; // 4J Stu - Structs shared by Iggy and Xui scenes. typedef struct _UIVec2D @@ -74,7 +78,9 @@ typedef struct _EnchantingScreenInput int z; int iPad; bool bSplitscreen; -} EnchantingScreenInput; + wstring name; +} +EnchantingScreenInput; // Furnace typedef struct _FurnaceScreenInput @@ -98,6 +104,18 @@ typedef struct _CraftingPanelScreenInput } CraftingPanelScreenInput; +// Fireworks +typedef struct _FireworksScreenInput +{ + shared_ptr player; + bool bSplitscreen; + int iPad; + int x; + int y; + int z; +} +FireworksScreenInput; + // Trading typedef struct _TradingScreenInput { @@ -122,6 +140,37 @@ typedef struct _AnvilScreenInput } AnvilScreenInput; +// Hopper +typedef struct _HopperScreenInput +{ + shared_ptr inventory; + shared_ptr hopper; + int iPad; + bool bSplitscreen; +} +HopperScreenInput; + +// Horse +typedef struct _HorseScreenInput +{ + shared_ptr inventory; + shared_ptr container; + shared_ptr horse; + int iPad; + bool bSplitscreen; +} +HorseScreenInput; + +// Beacon +typedef struct _BeaconScreenInput +{ + shared_ptr inventory; + shared_ptr beacon; + int iPad; + bool bSplitscreen; +} +BeaconScreenInput; + // Sign typedef struct _SignEntryScreenInput { @@ -236,24 +285,32 @@ typedef struct _JoinMenuInitData // More Options typedef struct _LaunchMoreOptionsMenuInitData { - BOOL bOnlineGame; - BOOL bInviteOnly; - BOOL bAllowFriendsOfFriends; + bool bOnlineGame; + bool bInviteOnly; + bool bAllowFriendsOfFriends; - BOOL bGenerateOptions; - BOOL bStructures; - BOOL bFlatWorld; - BOOL bBonusChest; + bool bGenerateOptions; + bool bStructures; + bool bFlatWorld; + bool bBonusChest; - BOOL bPVP; - BOOL bTrust; - BOOL bFireSpreads; - BOOL bTNT; + bool bPVP; + bool bTrust; + bool bFireSpreads; + bool bTNT; - BOOL bHostPrivileges; - BOOL bResetNether; + bool bHostPrivileges; + bool bResetNether; - BOOL 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..037552ed 100644 --- a/Minecraft.Client/EnderDragonRenderer.cpp +++ b/Minecraft.Client/EnderDragonRenderer.cpp @@ -4,18 +4,20 @@ #include "Tesselator.h" #include "Lighting.h" #include "EnderDragonRenderer.h" +#include "BossMobGuiInfo.h" -shared_ptr EnderDragonRenderer::bossInstance; -int EnderDragonRenderer::currentModel; +ResourceLocation EnderDragonRenderer::DRAGON_EXPLODING_LOCATION = ResourceLocation(TN_MOB_ENDERDRAGON_SHUFFLE); +ResourceLocation EnderDragonRenderer::CRYSTAL_BEAM_LOCATION = ResourceLocation(TN_MOB_ENDERDRAGON_BEAM); +ResourceLocation EnderDragonRenderer::DRAGON_EYES_LOCATION = ResourceLocation(TN_MOB_ENDERDRAGON_ENDEREYES); +ResourceLocation EnderDragonRenderer::DRAGON_LOCATION = ResourceLocation(TN_MOB_ENDERDRAGON); EnderDragonRenderer::EnderDragonRenderer() : MobRenderer(new DragonModel(0), 0.5f) { - currentModel = 0; dragonModel = (DragonModel *) model; - this->setArmor(model); + setArmor(model); // TODO: Make second constructor that assigns this. } -void EnderDragonRenderer::setupRotations(shared_ptr _mob, float bob, float bodyRot, float a) +void EnderDragonRenderer::setupRotations(shared_ptr _mob, float bob, float bodyRot, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr mob = dynamic_pointer_cast(_mob); @@ -46,7 +48,7 @@ void EnderDragonRenderer::setupRotations(shared_ptr _mob, float bob, float } } -void EnderDragonRenderer::renderModel(shared_ptr _mob, float wp, float ws, float bob, float headRotMinusBodyRot, float headRotx, float scale) +void EnderDragonRenderer::renderModel(shared_ptr _mob, float wp, float ws, float bob, float headRotMinusBodyRot, float headRotx, float scale) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr mob = dynamic_pointer_cast(_mob); @@ -57,7 +59,7 @@ void EnderDragonRenderer::renderModel(shared_ptr _mob, float wp, float w glDepthFunc(GL_LEQUAL); glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, tt); - bindTexture(mob->customTextureUrl, TN_MOB_ENDERDRAGON_SHUFFLE); // 4J was "/mob/enderdragon/shuffle.png" + bindTexture(&DRAGON_EXPLODING_LOCATION); // 4J was "/mob/enderdragon/shuffle.png" model->render(mob, wp, ws, bob, headRotMinusBodyRot, headRotx, scale, true); glAlphaFunc(GL_GREATER, 0.1f); @@ -65,7 +67,7 @@ void EnderDragonRenderer::renderModel(shared_ptr _mob, float wp, float w } - bindTexture(mob->customTextureUrl, mob->getTexture()); + bindTexture(mob); model->render(mob, wp, ws, bob, headRotMinusBodyRot, headRotx, scale, true); if (mob->hurtTime > 0) @@ -91,12 +93,7 @@ void EnderDragonRenderer::render(shared_ptr _mob, double x, double y, do { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr mob = dynamic_pointer_cast(_mob); - EnderDragonRenderer::bossInstance = mob; - if (currentModel != DragonModel::MODEL_ID) - { - model = new DragonModel(0); - currentModel = DragonModel::MODEL_ID; - } + BossMobGuiInfo::setBossHealth(mob, false); MobRenderer::render(mob, x, y, z, rot, a); if (mob->nearestCrystal != NULL) { @@ -135,7 +132,7 @@ void EnderDragonRenderer::render(shared_ptr _mob, double x, double y, do glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA); - bindTexture(TN_MOB_ENDERDRAGON_BEAM); // 4J was "/mob/enderdragon/beam.png" + bindTexture(&CRYSTAL_BEAM_LOCATION); // 4J was "/mob/enderdragon/beam.png" glShadeModel(GL_SMOOTH); @@ -167,7 +164,12 @@ void EnderDragonRenderer::render(shared_ptr _mob, double x, double y, do } } -void EnderDragonRenderer::additionalRendering(shared_ptr _mob, float a) +ResourceLocation *EnderDragonRenderer::getTextureLocation(shared_ptr mob) +{ + return &DRAGON_LOCATION; +} + +void EnderDragonRenderer::additionalRendering(shared_ptr _mob, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr mob = dynamic_pointer_cast(_mob); @@ -227,7 +229,7 @@ void EnderDragonRenderer::additionalRendering(shared_ptr _mob, float a) } -int EnderDragonRenderer::prepareArmor(shared_ptr _mob, int layer, float a) +int EnderDragonRenderer::prepareArmor(shared_ptr _mob, int layer, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr mob = dynamic_pointer_cast(_mob); @@ -238,7 +240,7 @@ int EnderDragonRenderer::prepareArmor(shared_ptr _mob, int layer, float a) } if (layer != 0) return -1; - bindTexture(TN_MOB_ENDERDRAGON_ENDEREYES); // 4J was "/mob/enderdragon/ender_eyes.png" + bindTexture(&DRAGON_EYES_LOCATION); // 4J was "/mob/enderdragon/ender_eyes.png" float br = 1; glEnable(GL_BLEND); // 4J Stu - We probably don't need to do this on 360 either (as we force it back on the renderer) diff --git a/Minecraft.Client/EnderDragonRenderer.h b/Minecraft.Client/EnderDragonRenderer.h index ab508d99..19209a45 100644 --- a/Minecraft.Client/EnderDragonRenderer.h +++ b/Minecraft.Client/EnderDragonRenderer.h @@ -1,5 +1,4 @@ #pragma once - #include "MobRenderer.h" #ifdef _XBOX @@ -9,11 +8,11 @@ class DragonModel; class EnderDragonRenderer : public MobRenderer { -public: - static shared_ptr bossInstance; - private: - static int currentModel; + static ResourceLocation DRAGON_EXPLODING_LOCATION; + static ResourceLocation CRYSTAL_BEAM_LOCATION; + static ResourceLocation DRAGON_EYES_LOCATION; + static ResourceLocation DRAGON_LOCATION; protected: DragonModel *dragonModel; @@ -22,15 +21,14 @@ public: EnderDragonRenderer(); protected: - virtual void setupRotations(shared_ptr _mob, float bob, float bodyRot, float a); - -protected: - void renderModel(shared_ptr _mob, float wp, float ws, float bob, float headRotMinusBodyRot, float headRotx, float scale); + virtual void setupRotations(shared_ptr _mob, float bob, float bodyRot, float a); + virtual void renderModel(shared_ptr _mob, float wp, float ws, float bob, float headRotMinusBodyRot, float headRotx, float scale); public: virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); protected: - virtual void additionalRendering(shared_ptr _mob, float a); - virtual int prepareArmor(shared_ptr _mob, int layer, float a); + virtual void additionalRendering(shared_ptr _mob, float a); + virtual int prepareArmor(shared_ptr _mob, int layer, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/EndermanModel.cpp b/Minecraft.Client/EndermanModel.cpp index 02b9a53d..3a32f011 100644 --- a/Minecraft.Client/EndermanModel.cpp +++ b/Minecraft.Client/EndermanModel.cpp @@ -51,12 +51,11 @@ EndermanModel::EndermanModel() : HumanoidModel(0, -14, 64, 32) leg0->compile(1.0f/16.0f); leg1->compile(1.0f/16.0f); hair->compile(1.0f/16.0f); - } -void EndermanModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) +void EndermanModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) { - HumanoidModel::setupAnim(time, r, bob, yRot, xRot, scale, uiBitmaskOverrideAnim); + HumanoidModel::setupAnim(time, r, bob, yRot, xRot, scale, entity, uiBitmaskOverrideAnim); head->visible = true; diff --git a/Minecraft.Client/EndermanModel.h b/Minecraft.Client/EndermanModel.h index 3760e796..5042f553 100644 --- a/Minecraft.Client/EndermanModel.h +++ b/Minecraft.Client/EndermanModel.h @@ -9,5 +9,5 @@ public: bool creepy; EndermanModel(); - virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim=0); }; \ No newline at end of file diff --git a/Minecraft.Client/EndermanRenderer.cpp b/Minecraft.Client/EndermanRenderer.cpp index 8802376a..f6e5220a 100644 --- a/Minecraft.Client/EndermanRenderer.cpp +++ b/Minecraft.Client/EndermanRenderer.cpp @@ -1,9 +1,13 @@ #include "stdafx.h" #include "EndermanRenderer.h" #include "EndermanModel.h" +#include "TextureAtlas.h" #include "..\Minecraft.World\net.minecraft.world.entity.monster.h" #include "..\Minecraft.World\net.minecraft.world.level.tile.h" +ResourceLocation EndermanRenderer::ENDERMAN_EYES_LOCATION = ResourceLocation(TN_MOB_ENDERMAN_EYES); +ResourceLocation EndermanRenderer::ENDERMAN_LOCATION = ResourceLocation(TN_MOB_ENDERMAN); + EndermanRenderer::EndermanRenderer() : MobRenderer(new EndermanModel(), 0.5f) { model = (EndermanModel *) MobRenderer::model; @@ -29,7 +33,12 @@ void EndermanRenderer::render(shared_ptr _mob, double x, double y, doubl MobRenderer::render(mob, x, y, z, rot, a); } -void EndermanRenderer::additionalRendering(shared_ptr _mob, float a) +ResourceLocation *EndermanRenderer::getTextureLocation(shared_ptr mob) +{ + return &ENDERMAN_LOCATION; +} + +void EndermanRenderer::additionalRendering(shared_ptr _mob, float a) { // 4J - original version used generics and thus had an input parameter of type Boat rather than shared_ptr we have here - // do some casting around instead @@ -47,7 +56,7 @@ void EndermanRenderer::additionalRendering(shared_ptr _mob, float a) s *= 1.00f; glRotatef(20, 1, 0, 0); glRotatef(45, 0, 1, 0); - glScalef(s, -s, s); + glScalef(-s, -s, s); if (SharedConstants::TEXTURE_LIGHTING) @@ -61,14 +70,14 @@ void EndermanRenderer::additionalRendering(shared_ptr _mob, float a) } glColor4f(1, 1, 1, 1); - bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" + bindTexture(&TextureAtlas::LOCATION_BLOCKS); // TODO: bind by icon tileRenderer->renderTile(Tile::tiles[mob->getCarryingTile()], mob->getCarryingData(), 1); glPopMatrix(); glDisable(GL_RESCALE_NORMAL); } } -int EndermanRenderer::prepareArmor(shared_ptr _mob, int layer, float a) +int EndermanRenderer::prepareArmor(shared_ptr _mob, int layer, float a) { // 4J - original version used generics and thus had an input parameter of type Boat rather than shared_ptr we have here - // do some casting around instead @@ -76,7 +85,7 @@ int EndermanRenderer::prepareArmor(shared_ptr _mob, int layer, float a) if (layer != 0) return -1; - bindTexture(TN_MOB_ENDERMAN_EYES); // 4J was L"/mob/enderman_eyes.png" + bindTexture(&ENDERMAN_EYES_LOCATION); // 4J was L"/mob/enderman_eyes.png" float br = 1; glEnable(GL_BLEND); // 4J Stu - We probably don't need to do this on 360 either (as we force it back on the renderer) @@ -88,8 +97,14 @@ int EndermanRenderer::prepareArmor(shared_ptr _mob, int layer, float a) glBlendFunc(GL_ONE, GL_ONE); glDisable(GL_LIGHTING); - if (mob->isInvisible()) glDepthMask(false); - else glDepthMask(true); + if (mob->isInvisible()) + { + glDepthMask(false); + } + else + { + glDepthMask(true); + } if (SharedConstants::TEXTURE_LIGHTING) { diff --git a/Minecraft.Client/EndermanRenderer.h b/Minecraft.Client/EndermanRenderer.h index 6f5126bd..a65464c0 100644 --- a/Minecraft.Client/EndermanRenderer.h +++ b/Minecraft.Client/EndermanRenderer.h @@ -1,5 +1,4 @@ #pragma once - #include "MobRenderer.h" class EnderMan; @@ -10,13 +9,16 @@ class EndermanRenderer : public MobRenderer private: EndermanModel *model; Random random; + static ResourceLocation ENDERMAN_EYES_LOCATION; + static ResourceLocation ENDERMAN_LOCATION; public: EndermanRenderer(); - virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); - virtual void additionalRendering(shared_ptr _mob, float a); + void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + ResourceLocation *getTextureLocation(shared_ptr mob); + void additionalRendering(shared_ptr _mob, float a); protected: - virtual int prepareArmor(shared_ptr _mob, int layer, float a); + int prepareArmor(shared_ptr _mob, int layer, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/EntityRenderDispatcher.cpp b/Minecraft.Client/EntityRenderDispatcher.cpp index dfc9a11e..f23c713c 100644 --- a/Minecraft.Client/EntityRenderDispatcher.cpp +++ b/Minecraft.Client/EntityRenderDispatcher.cpp @@ -50,6 +50,14 @@ #include "EnderDragonRenderer.h" #include "EnderCrystalRenderer.h" #include "BlazeRenderer.h" +#include "SkeletonRenderer.h" +#include "WitchRenderer.h" +#include "WitherBossRenderer.h" +#include "LeashKnotRenderer.h" +#include "WitherSkullRenderer.h" +#include "TntMinecartRenderer.h" +#include "MinecartSpawnerRenderer.h" +#include "HorseRenderer.h" #include "SpiderModel.h" #include "PigModel.h" #include "SheepModel.h" @@ -65,12 +73,15 @@ #include "HumanoidModel.h" #include "SheepFurModel.h" #include "SkeletonModel.h" +#include "ModelHorse.h" #include "Options.h" #include "ItemFrameRenderer.h" -#include "OzelotRenderer.h" +#include "OcelotRenderer.h" #include "VillagerGolemRenderer.h" -#include "OzelotModel.h" +#include "OcelotModel.h" #include "ZombieRenderer.h" +#include "BatRenderer.h" +#include "CaveSpiderRenderer.h" double EntityRenderDispatcher::xOff = 0.0; double EntityRenderDispatcher::yOff = 0.0; @@ -87,22 +98,23 @@ EntityRenderDispatcher::EntityRenderDispatcher() { glEnable(GL_LIGHTING); renderers[eTYPE_SPIDER] = new SpiderRenderer(); - renderers[eTYPE_CAVESPIDER] = new SpiderRenderer(); + renderers[eTYPE_CAVESPIDER] = new CaveSpiderRenderer(); renderers[eTYPE_PIG] = new PigRenderer(new PigModel(), new PigModel(0.5f), 0.7f); renderers[eTYPE_SHEEP] = new SheepRenderer(new SheepModel(), new SheepFurModel(), 0.7f); renderers[eTYPE_COW] = new CowRenderer(new CowModel(), 0.7f); renderers[eTYPE_MUSHROOMCOW] = new MushroomCowRenderer(new CowModel(), 0.7f); renderers[eTYPE_WOLF] = new WolfRenderer(new WolfModel(), new WolfModel(), 0.5f); renderers[eTYPE_CHICKEN] = new ChickenRenderer(new ChickenModel(), 0.3f); - renderers[eTYPE_OZELOT] = new OzelotRenderer(new OzelotModel(), 0.4f); + renderers[eTYPE_OCELOT] = new OcelotRenderer(new OcelotModel(), 0.4f); renderers[eTYPE_SILVERFISH] = new SilverfishRenderer(); renderers[eTYPE_CREEPER] = new CreeperRenderer(); renderers[eTYPE_ENDERMAN] = new EndermanRenderer(); renderers[eTYPE_SNOWMAN] = new SnowManRenderer(); - renderers[eTYPE_SKELETON] = new HumanoidMobRenderer(new SkeletonModel(), 0.5f); + renderers[eTYPE_SKELETON] = new SkeletonRenderer(); + renderers[eTYPE_WITCH] = new WitchRenderer(); renderers[eTYPE_BLAZE] = new BlazeRenderer(); renderers[eTYPE_ZOMBIE] = new ZombieRenderer(); - renderers[eTYPE_PIGZOMBIE] = new HumanoidMobRenderer(new ZombieModel(), 0.5f); + renderers[eTYPE_PIGZOMBIE] = new ZombieRenderer(); renderers[eTYPE_SLIME] = new SlimeRenderer(new SlimeModel(16), new SlimeModel(0), 0.25f); renderers[eTYPE_LAVASLIME] = new LavaSlimeRenderer(); renderers[eTYPE_PLAYER] = new PlayerRenderer(); @@ -111,12 +123,19 @@ EntityRenderDispatcher::EntityRenderDispatcher() renderers[eTYPE_SQUID] = new SquidRenderer(new SquidModel(), 0.7f); renderers[eTYPE_VILLAGER] = new VillagerRenderer(); renderers[eTYPE_VILLAGERGOLEM] = new VillagerGolemRenderer(); + renderers[eTYPE_BAT] = new BatRenderer(); + renderers[eTYPE_MOB] = new MobRenderer(new HumanoidModel(), 0.5f); + renderers[eTYPE_ENDERDRAGON] = new EnderDragonRenderer(); renderers[eTYPE_ENDER_CRYSTAL] = new EnderCrystalRenderer(); + + renderers[eTYPE_WITHERBOSS] = new WitherBossRenderer(); + renderers[eTYPE_ENTITY] = new DefaultRenderer(); - renderers[eTYPE_PAINTING] = new PaintingRenderer(); + renderers[eTYPE_PAINTING] = new PaintingRenderer(); renderers[eTYPE_ITEM_FRAME] = new ItemFrameRenderer(); + renderers[eTYPE_LEASHFENCEKNOT] = new LeashKnotRenderer(); renderers[eTYPE_ARROW] = new ArrowRenderer(); renderers[eTYPE_SNOWBALL] = new ItemSpriteRenderer(Item::snowBall); renderers[eTYPE_THROWNENDERPEARL] = new ItemSpriteRenderer(Item::enderPearl); @@ -124,18 +143,30 @@ EntityRenderDispatcher::EntityRenderDispatcher() renderers[eTYPE_THROWNEGG] = new ItemSpriteRenderer(Item::egg); renderers[eTYPE_THROWNPOTION] = new ItemSpriteRenderer(Item::potion, PotionBrewing::THROWABLE_MASK); renderers[eTYPE_THROWNEXPBOTTLE] = new ItemSpriteRenderer(Item::expBottle); - renderers[eTYPE_FIREBALL] = new FireballRenderer(2.0f); + renderers[eTYPE_FIREWORKS_ROCKET] = new ItemSpriteRenderer(Item::fireworks); + renderers[eTYPE_LARGE_FIREBALL] = new FireballRenderer(2.0f); renderers[eTYPE_SMALL_FIREBALL] = new FireballRenderer(0.5f); renderers[eTYPE_DRAGON_FIREBALL] = new FireballRenderer(2.0f); // 4J Added TU9 + renderers[eTYPE_WITHER_SKULL] = new WitherSkullRenderer(); renderers[eTYPE_ITEMENTITY] = new ItemRenderer(); renderers[eTYPE_EXPERIENCEORB] = new ExperienceOrbRenderer(); renderers[eTYPE_PRIMEDTNT] = new TntRenderer(); renderers[eTYPE_FALLINGTILE] = new FallingTileRenderer(); - renderers[eTYPE_MINECART] = new MinecartRenderer(); + + renderers[eTYPE_MINECART_TNT] = new TntMinecartRenderer(); + renderers[eTYPE_MINECART_SPAWNER] = new MinecartSpawnerRenderer(); + renderers[eTYPE_MINECART_RIDEABLE] = new MinecartRenderer(); + + renderers[eTYPE_MINECART_FURNACE] = new MinecartRenderer(); + renderers[eTYPE_MINECART_CHEST] = new MinecartRenderer(); + renderers[eTYPE_MINECART_HOPPER] = new MinecartRenderer(); + renderers[eTYPE_BOAT] = new BoatRenderer(); renderers[eTYPE_FISHINGHOOK] = new FishingHookRenderer(); + + renderers[eTYPE_HORSE] = new HorseRenderer(new ModelHorse(), .75f); + renderers[eTYPE_LIGHTNINGBOLT] = new LightningBoltRenderer(); - renderers[eTYPE_ARROW] = new ArrowRenderer(); glDisable(GL_LIGHTING); AUTO_VAR(itEnd, renderers.end()); @@ -149,22 +180,24 @@ EntityRenderDispatcher::EntityRenderDispatcher() EntityRenderer *EntityRenderDispatcher::getRenderer(eINSTANCEOF e) { + if( (e & eTYPE_PLAYER) == eTYPE_PLAYER) e = eTYPE_PLAYER; //EntityRenderer * r = renderers[e]; AUTO_VAR(it, renderers.find( e )); // 4J Stu - The .at and [] accessors insert elements if they don't exist if( it == renderers.end() ) { + app.DebugPrintf("Couldn't find renderer for entity of type %d\n", e); // New renderer mapping required in above table __debugbreak(); } /* 4J - not doing this hierarchical search anymore. We need to explicitly add renderers for any eINSTANCEOF type that we want to be able to render - if (it == renderers.end() && e != Entity::_class) + if (it == renderers.end() && e != Entity::_class) { - EntityRenderer *r = getRenderer(dynamic_cast( e->getSuperclass() )); - renderers.insert( classToRendererMap::value_type( e, r ) ); - return r; - //assert(false); - }*/ + EntityRenderer *r = getRenderer(dynamic_cast( e->getSuperclass() )); + renderers.insert( classToRendererMap::value_type( e, r ) ); + return r; + //assert(false); + }*/ return it->second; } @@ -173,29 +206,30 @@ EntityRenderer *EntityRenderDispatcher::getRenderer(shared_ptr e) return getRenderer(e->GetType()); } -void EntityRenderDispatcher::prepare(Level *level, Textures *textures, Font *font, shared_ptr player, Options *options, float a) +void EntityRenderDispatcher::prepare(Level *level, Textures *textures, Font *font, shared_ptr player, shared_ptr crosshairPickMob, Options *options, float a) { - this->level = level; - this->textures = textures; - this->options = options; - this->cameraEntity = player; - this->font = font; + this->level = level; + this->textures = textures; + this->options = options; + this->cameraEntity = player; + this->font = font; + this->crosshairPickMob = crosshairPickMob; - if (player->isSleeping()) + if (player->isSleeping()) { - int t = level->getTile(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); - if (t == Tile::bed_Id) + int t = level->getTile(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); + if (t == Tile::bed_Id) { - int data = level->getData(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); + int data = level->getData(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); - int direction = data & 3; - playerRotY = (float)(direction * 90 + 180); - playerRotX = 0; - } - } else { - playerRotY = player->yRotO + (player->yRot - player->yRotO) * a; - playerRotX = player->xRotO + (player->xRot - player->xRotO) * a; - } + int direction = data & 3; + playerRotY = (float)(direction * 90 + 180); + playerRotX = 0; + } + } else { + playerRotY = player->yRotO + (player->yRot - player->yRotO) * a; + playerRotX = player->xRotO + (player->xRot - player->xRotO) * a; + } shared_ptr pl = dynamic_pointer_cast(player); if (pl->ThirdPersonView() == 2) @@ -203,17 +237,17 @@ void EntityRenderDispatcher::prepare(Level *level, Textures *textures, Font *fon playerRotY += 180; } - xPlayer = player->xOld + (player->x - player->xOld) * a; - yPlayer = player->yOld + (player->y - player->yOld) * a; - zPlayer = player->zOld + (player->z - player->zOld) * a; + xPlayer = player->xOld + (player->x - player->xOld) * a; + yPlayer = player->yOld + (player->y - player->yOld) * a; + zPlayer = player->zOld + (player->z - player->zOld) * a; } void EntityRenderDispatcher::render(shared_ptr entity, float a) { - double x = entity->xOld + (entity->x - entity->xOld) * a; - double y = entity->yOld + (entity->y - entity->yOld) * a; - double z = entity->zOld + (entity->z - entity->zOld) * a; + double x = entity->xOld + (entity->x - entity->xOld) * a; + double y = entity->yOld + (entity->y - entity->yOld) * a; + double z = entity->zOld + (entity->z - entity->zOld) * a; // Fix for #61057 - TU7: Gameplay: Boat is glitching when player float forward and turning. // Fix to handle the case that yRot and yRotO wrap over the 0/360 line @@ -229,39 +263,39 @@ void EntityRenderDispatcher::render(shared_ptr entity, float a) rotDiff = entity->yRot - (entity->yRotO - 360); } } - float r = entity->yRotO + (rotDiff) * a; - - int col = entity->getLightColor(a); + float r = entity->yRotO + (rotDiff) * a; + + int col = entity->getLightColor(a); if (entity->isOnFire()) { col = SharedConstants::FULLBRIGHT_LIGHTVALUE; } - int u = col % 65536; - int v = col / 65536; - glMultiTexCoord2f(GL_TEXTURE1, u / 1.0f, v / 1.0f); - glColor4f(1, 1, 1, 1); + int u = col % 65536; + int v = col / 65536; + glMultiTexCoord2f(GL_TEXTURE1, u / 1.0f, v / 1.0f); + glColor4f(1, 1, 1, 1); - render(entity, x - xOff, y - yOff, z - zOff, r, a); + render(entity, x - xOff, y - yOff, z - zOff, r, a); } void EntityRenderDispatcher::render(shared_ptr entity, double x, double y, double z, float rot, float a, bool bItemFrame, bool bRenderPlayerShadow) { EntityRenderer *renderer = getRenderer(entity); - if (renderer != NULL) + if (renderer != NULL) { renderer->SetItemFrame(bItemFrame); - + renderer->render(entity, x, y, z, rot, a); - renderer->postRender(entity, x, y, z, rot, a, bRenderPlayerShadow); - } + renderer->postRender(entity, x, y, z, rot, a, bRenderPlayerShadow); + } } double EntityRenderDispatcher::distanceToSqr(double x, double y, double z) { - double xd = x - xPlayer; - double yd = y - yPlayer; - double zd = z - zPlayer; - return xd * xd + yd * yd + zd * zd; + double xd = x - xPlayer; + double yd = y - yPlayer; + double zd = z - zPlayer; + return xd * xd + yd * yd + zd * zd; } Font *EntityRenderDispatcher::getFont() @@ -277,4 +311,60 @@ void EntityRenderDispatcher::registerTerrainTextures(IconRegister *iconRegister) EntityRenderer *renderer = it->second; renderer->registerTerrainTextures(iconRegister); } +} + +void EntityRenderDispatcher::renderHitbox(shared_ptr entity, double x, double y, double z, float rot, float a) +{ + glDepthMask(false); + glDisable(GL_TEXTURE_2D); + glDisable(GL_LIGHTING); + glDisable(GL_CULL_FACE); + glDisable(GL_BLEND); + + glPushMatrix(); + Tesselator *t = Tesselator::getInstance(); + + t->begin(); + t->color(255, 255, 255, 32); + + double wnx = -entity->bbWidth / 2; + double wnz = -entity->bbWidth / 2; + double enx = entity->bbWidth / 2; + double enz = -entity->bbWidth / 2; + + double wsx = -entity->bbWidth / 2; + double wsz = entity->bbWidth / 2; + double esx = entity->bbWidth / 2; + double esz = entity->bbWidth / 2; + + double top = entity->bbHeight; + + t->vertex(x + wnx, y + top, z + wnz); + t->vertex(x + wnx, y, z + wnz); + t->vertex(x + enx, y, z + enz); + t->vertex(x + enx, y + top, z + enz); + + t->vertex(x + esx, y + top, z + esz); + t->vertex(x + esx, y, z + esz); + t->vertex(x + wsx, y, z + wsz); + t->vertex(x + wsx, y + top, z + wsz); + + t->vertex(x + enx, y + top, z + enz); + t->vertex(x + enx, y, z + enz); + t->vertex(x + esx, y, z + esz); + t->vertex(x + esx, y + top, z + esz); + + t->vertex(x + wsx, y + top, z + wsz); + t->vertex(x + wsx, y, z + wsz); + t->vertex(x + wnx, y, z + wnz); + t->vertex(x + wnx, y + top, z + wnz); + + t->end(); + glPopMatrix(); + + glEnable(GL_TEXTURE_2D); + glEnable(GL_LIGHTING); + glEnable(GL_CULL_FACE); + glDisable(GL_BLEND); + glDepthMask(true); } \ No newline at end of file diff --git a/Minecraft.Client/EntityRenderDispatcher.h b/Minecraft.Client/EntityRenderDispatcher.h index 248be18f..07ab7c4d 100644 --- a/Minecraft.Client/EntityRenderDispatcher.h +++ b/Minecraft.Client/EntityRenderDispatcher.h @@ -26,7 +26,8 @@ public: Textures *textures; ItemInHandRenderer *itemInHandRenderer; Level *level; - shared_ptr cameraEntity; + shared_ptr cameraEntity; + shared_ptr crosshairPickMob; float playerRotY; float playerRotX; Options *options; @@ -36,14 +37,19 @@ public: private: EntityRenderDispatcher(); + public: EntityRenderer *getRenderer(eINSTANCEOF e); EntityRenderer *getRenderer(shared_ptr e); - void prepare(Level *level, Textures *textures, Font *font, shared_ptr player, Options *options, float a); + void prepare(Level *level, Textures *textures, Font *font, shared_ptr player, shared_ptr crosshairPickMob, Options *options, float a); void render(shared_ptr entity, float a); void render(shared_ptr entity, double x, double y, double z, float rot, float a, bool bItemFrame = false, bool bRenderPlayerShadow = true); void setLevel(Level *level); double distanceToSqr(double x, double y, double z); Font *getFont(); void registerTerrainTextures(IconRegister *iconRegister); + +private: + void renderHitbox(shared_ptr entity, double x, double y, double z, float rot, float a); + }; diff --git a/Minecraft.Client/EntityRenderer.cpp b/Minecraft.Client/EntityRenderer.cpp index 6c0247ed..9aa4ad7d 100644 --- a/Minecraft.Client/EntityRenderer.cpp +++ b/Minecraft.Client/EntityRenderer.cpp @@ -1,24 +1,27 @@ #include "stdafx.h" #include "EntityRenderer.h" -#include "HumanoidModel.h" #include "EntityRenderDispatcher.h" +#include "HumanoidModel.h" +#include "LocalPlayer.h" #include "Options.h" +#include "TextureAtlas.h" #include "..\Minecraft.World\net.minecraft.world.level.tile.h" #include "..\Minecraft.World\net.minecraft.world.h" -#include "..\Minecraft.World\Entity.h" +#include "..\Minecraft.World\net.minecraft.world.entity.h" #include "..\Minecraft.World\Level.h" #include "..\Minecraft.World\AABB.h" #include "..\Minecraft.World\Mth.h" #include "..\Minecraft.World\net.minecraft.world.entity.animal.h" -#include "LocalPlayer.h" + +ResourceLocation EntityRenderer::SHADOW_LOCATION = ResourceLocation(TN__CLAMP__MISC_SHADOW); // 4J - added EntityRenderer::EntityRenderer() { model = NULL; tileRenderer = new TileRenderer(); - shadowRadius = 0; - shadowStrength = 1.0f; + shadowRadius = 0; + shadowStrength = 1.0f; } EntityRenderer::~EntityRenderer() @@ -26,14 +29,14 @@ EntityRenderer::~EntityRenderer() delete tileRenderer; } -void EntityRenderer::bindTexture(int resourceName) +void EntityRenderer::bindTexture(shared_ptr entity) { - entityRenderDispatcher->textures->bindTexture(resourceName); + bindTexture(getTextureLocation(entity)); } -void EntityRenderer::bindTexture(const wstring& resourceName) +void EntityRenderer::bindTexture(ResourceLocation *location) { - entityRenderDispatcher->textures->bindTexture(resourceName); + entityRenderDispatcher->textures->bindTexture(location); } bool EntityRenderer::bindTexture(const wstring& urlTexture, int backupTexture) @@ -57,9 +60,9 @@ bool EntityRenderer::bindTexture(const wstring& urlTexture, int backupTexture) } } -bool EntityRenderer::bindTexture(const wstring& urlTexture, const wstring& backupTexture) +bool EntityRenderer::bindTexture(const wstring& urlTexture, const wstring &backupTexture) { - Textures *t = entityRenderDispatcher->textures; + Textures *t = entityRenderDispatcher->textures; // 4J-PB - no http textures on the xbox, mem textures instead @@ -70,161 +73,153 @@ bool EntityRenderer::bindTexture(const wstring& urlTexture, const wstring& backu { glBindTexture(GL_TEXTURE_2D, id); t->clearLastBoundId(); - return true; - } + return true; + } else { - return false; - } + return false; + } } void EntityRenderer::renderFlame(shared_ptr e, double x, double y, double z, float a) { - glDisable(GL_LIGHTING); + glDisable(GL_LIGHTING); Icon *fire1 = Tile::fire->getTextureLayer(0); Icon *fire2 = Tile::fire->getTextureLayer(1); - glPushMatrix(); - glTranslatef((float) x, (float) y, (float) z); + glPushMatrix(); + glTranslatef((float) x, (float) y, (float) z); - float s = e->bbWidth * 1.4f; - glScalef(s, s, s); + float s = e->bbWidth * 1.4f; + glScalef(s, s, s); MemSect(31); - bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" + bindTexture(&TextureAtlas::LOCATION_BLOCKS); MemSect(0); - Tesselator *t = Tesselator::getInstance(); + Tesselator *t = Tesselator::getInstance(); - float r = 0.5f; - float xo = 0.0f; + float r = 0.5f; + float xo = 0.0f; - float h = e->bbHeight / s; - float yo = (float) (e->y - e->bb->y0); + float h = e->bbHeight / s; + float yo = (float) (e->y - e->bb->y0); - glRotatef(-entityRenderDispatcher->playerRotY, 0, 1, 0); + glRotatef(-entityRenderDispatcher->playerRotY, 0, 1, 0); - glTranslatef(0, 0, -0.3f + ((int) h) * 0.02f); - glColor4f(1, 1, 1, 1); - float zo = 0; - int ss = 0; - t->begin(); - while (h > 0) + glTranslatef(0, 0, -0.3f + ((int) h) * 0.02f); + glColor4f(1, 1, 1, 1); + float zo = 0; + int ss = 0; + t->begin(); + while (h > 0) { Icon *tex = NULL; - if (ss % 2 == 0) + if (ss % 2 == 0) { - tex = fire1; - } + tex = fire1; + } else { - tex = fire2; - } + tex = fire2; + } float u0 = tex->getU0(); float v0 = tex->getV0(); float u1 = tex->getU1(); float v1 = tex->getV1(); - if (ss / 2 % 2 == 0) + if (ss / 2 % 2 == 0) { - float tmp = u1; - u1 = u0; - u0 = tmp; - } - t->vertexUV((float)(r - xo), (float)( 0 - yo), (float)( zo), (float)( u1), (float)( v1)); - t->vertexUV((float)(-r - xo), (float)( 0 - yo), (float)( zo), (float)( u0), (float)( v1)); - t->vertexUV((float)(-r - xo), (float)( 1.4f - yo), (float)( zo), (float)( u0), (float)( v0)); - t->vertexUV((float)(r - xo), (float)( 1.4f - yo), (float)( zo), (float)( u1), (float)( v0)); - h -= 0.45f; - yo -= 0.45f; - r *= 0.9f; - zo += 0.03f; - ss++; - } - t->end(); - glPopMatrix(); - glEnable(GL_LIGHTING); + float tmp = u1; + u1 = u0; + u0 = tmp; + } + t->vertexUV((float)(r - xo), (float)( 0 - yo), (float)( zo), (float)( u1), (float)( v1)); + t->vertexUV((float)(-r - xo), (float)( 0 - yo), (float)( zo), (float)( u0), (float)( v1)); + t->vertexUV((float)(-r - xo), (float)( 1.4f - yo), (float)( zo), (float)( u0), (float)( v0)); + t->vertexUV((float)(r - xo), (float)( 1.4f - yo), (float)( zo), (float)( u1), (float)( v0)); + h -= 0.45f; + yo -= 0.45f; + r *= 0.9f; + zo += 0.03f; + ss++; + } + t->end(); + glPopMatrix(); + glEnable(GL_LIGHTING); } void EntityRenderer::renderShadow(shared_ptr e, double x, double y, double z, float pow, float a) { glDisable(GL_LIGHTING); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); MemSect(31); - entityRenderDispatcher->textures->bindTexture(TN__CLAMP__MISC_SHADOW);//L"%clamp%/misc/shadow.png")); + entityRenderDispatcher->textures->bindTexture(&SHADOW_LOCATION); MemSect(0); - Level *level = getLevel(); + Level *level = getLevel(); - glDepthMask(false); - float r = shadowRadius; - shared_ptr mob = dynamic_pointer_cast(e); - bool isLocalPlayer = false; + glDepthMask(false); + float r = shadowRadius; float fYLocalPlayerShadowOffset=0.0f; - //if (dynamic_pointer_cast(e) != NULL) - if (mob != NULL) + if (e->instanceof(eTYPE_MOB)) { - //shared_ptr mob = dynamic_pointer_cast(e); + shared_ptr mob = dynamic_pointer_cast(e); r *= mob->getSizeScale(); - shared_ptr animal = dynamic_pointer_cast(mob); - if (animal != NULL) + + if (mob->instanceof(eTYPE_ANIMAL)) { - if (animal->isBaby()) + if (dynamic_pointer_cast(mob)->isBaby()) { r *= 0.5f; } } - - if(dynamic_pointer_cast(mob)!=NULL) - { - isLocalPlayer=true; - } } - double ex = e->xOld + (e->x - e->xOld) * a; - double ey = e->yOld + (e->y - e->yOld) * a + e->getShadowHeightOffs(); + double ex = e->xOld + (e->x - e->xOld) * a; + double ey = e->yOld + (e->y - e->yOld) * a + e->getShadowHeightOffs(); // 4J-PB - local players seem to have a position at their head, and remote players have a foot position. // get the shadow to render by changing the check here depending on the player type - if(isLocalPlayer) + if(e->instanceof(eTYPE_LOCALPLAYER)) { ey-=1.62; fYLocalPlayerShadowOffset=-1.62f; } - double ez = e->zOld + (e->z - e->zOld) * a; + double ez = e->zOld + (e->z - e->zOld) * a; - int x0 = Mth::floor(ex - r); - int x1 = Mth::floor(ex + r); - int y0 = Mth::floor(ey - r); - int y1 = Mth::floor(ey); - int z0 = Mth::floor(ez - r); - int z1 = Mth::floor(ez + r); + int x0 = Mth::floor(ex - r); + int x1 = Mth::floor(ex + r); + int y0 = Mth::floor(ey - r); + int y1 = Mth::floor(ey); + int z0 = Mth::floor(ez - r); + int z1 = Mth::floor(ez + r); - double xo = x - ex; + double xo = x - ex; double yo = y - ey; - double zo = z - ez; + double zo = z - ez; - Tesselator *tt = Tesselator::getInstance(); - tt->begin(); - for (int xt = x0; xt <= x1; xt++) - for (int yt = y0; yt <= y1; yt++) - for (int zt = z0; zt <= z1; zt++) + Tesselator *tt = Tesselator::getInstance(); + tt->begin(); + for (int xt = x0; xt <= x1; xt++) + for (int yt = y0; yt <= y1; yt++) + for (int zt = z0; zt <= z1; zt++) { int t = level->getTile(xt, yt - 1, zt); if (t > 0 && level->getRawBrightness(xt, yt, zt) > 3) { renderTileShadow(Tile::tiles[t], x, y + e->getShadowHeightOffs() + fYLocalPlayerShadowOffset, z, xt, yt , zt, pow, r, xo, yo + e->getShadowHeightOffs() + fYLocalPlayerShadowOffset, zo); } - } - tt->end(); + } + tt->end(); - glColor4f(1, 1, 1, 1); - glDisable(GL_BLEND); - glDepthMask(true); + glColor4f(1, 1, 1, 1); + glDisable(GL_BLEND); + glDepthMask(true); glEnable(GL_LIGHTING); } @@ -237,114 +232,114 @@ Level *EntityRenderer::getLevel() void EntityRenderer::renderTileShadow(Tile *tt, double x, double y, double z, int xt, int yt, int zt, float pow, float r, double xo, double yo, double zo) { Tesselator *t = Tesselator::getInstance(); - if (!tt->isCubeShaped()) return; + if (!tt->isCubeShaped()) return; - double a = ((pow - (y - (yt + yo)) / 2) * 0.5f) * getLevel()->getBrightness(xt, yt, zt); - if (a < 0) return; - if (a > 1) a = 1; + double a = ((pow - (y - (yt + yo)) / 2) * 0.5f) * getLevel()->getBrightness(xt, yt, zt); + if (a < 0) return; + if (a > 1) a = 1; - t->color(1.0f, 1.0f, 1.0f, (float) a); - // glColor4f(1, 1, 1, (float) a); + 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/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..5e52459c 100644 --- a/Minecraft.Client/GameRenderer.cpp +++ b/Minecraft.Client/GameRenderer.cpp @@ -18,14 +18,15 @@ #include "MultiPlayerLevel.h" #include "Chunk.h" #include "..\Minecraft.World\net.minecraft.world.entity.h" -#include "..\Minecraft.World\net.minecraft.world.level.h" #include "..\Minecraft.World\net.minecraft.world.entity.player.h" -#include "..\Minecraft.World\net.minecraft.world.phys.h" +#include "..\Minecraft.World\net.minecraft.world.item.enchantment.h" +#include "..\Minecraft.World\net.minecraft.world.level.h" #include "..\Minecraft.World\net.minecraft.world.level.material.h" #include "..\Minecraft.World\net.minecraft.world.level.tile.h" #include "..\Minecraft.World\net.minecraft.world.level.chunk.h" #include "..\Minecraft.World\net.minecraft.world.level.biome.h" #include "..\Minecraft.World\net.minecraft.world.level.dimension.h" +#include "..\Minecraft.World\net.minecraft.world.phys.h" #include "..\Minecraft.World\System.h" #include "..\Minecraft.World\FloatBuffer.h" #include "..\Minecraft.World\ThreadName.h" @@ -45,9 +46,11 @@ #include "..\Minecraft.World\Item.h" #include "..\Minecraft.World\compression.h" #include "PS3\PS3Extras\ShutdownManager.h" +#include "BossMobGuiInfo.h" #include "TexturePackRepository.h" #include "TexturePack.h" +#include "TextureAtlas.h" bool GameRenderer::anaglyph3d = false; int GameRenderer::anaglyphPass = 0; @@ -64,6 +67,9 @@ vector GameRenderer::m_deleteStackSparseDataStorage; #endif CRITICAL_SECTION GameRenderer::m_csDeleteStack; +ResourceLocation GameRenderer::RAIN_LOCATION = ResourceLocation(TN_ENVIRONMENT_RAIN); +ResourceLocation GameRenderer::SNOW_LOCATION = ResourceLocation(TN_ENVIRONMENT_SNOW); + GameRenderer::GameRenderer(Minecraft *mc) { // 4J - added this block of initialisers @@ -77,9 +83,9 @@ GameRenderer::GameRenderer(Minecraft *mc) thirdTilt = 0; thirdTiltO = 0; - accumulatedSmoothXO = 0; + accumulatedSmoothXO = 0; accumulatedSmoothYO = 0; - tickSmoothXO = 0; + tickSmoothXO = 0; tickSmoothYO = 0; lastTickA = 0; @@ -120,6 +126,8 @@ GameRenderer::GameRenderer(Minecraft *mc) blg = 0.0f; blgt = 0.0f; + darkenWorldAmount = 0.0f; + darkenWorldAmountO = 0.0f; m_fov=70.0f; @@ -188,92 +196,20 @@ void GameRenderer::tick(bool first) // 4J - add bFirst fovOffsetO = fovOffset; cameraRollO = cameraRoll; - if (ClientConstants::DEADMAU5_CAMERA_CHEATS) + if (mc->options->smoothCamera) { - if (mc->screen == NULL) - { - float distanceDelta = 0; - float rotationDelta = 0; - float tiltDelta = 0; - float rollDelta = 0; + // 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; @@ -537,15 +501,17 @@ void GameRenderer::moveCameraToPlayer(float a) else { // 4J - corrected bug where this used to just take player->xRot & yRot directly and so wasn't taking into account interpolation, allowing camera to go through walls - float yRot = player->yRotO + (player->yRot - player->yRotO) * a; - float xRot = player->xRotO + (player->xRot - player->xRotO) * a; + float playerYRot = player->yRotO + (player->yRot - player->yRotO) * a; + float playerXRot = player->xRotO + (player->xRot - player->xRotO) * a; + float yRot = playerYRot; + float xRot = playerXRot; // Thirdperson view values are now 0 for disabled, 1 for original mode, 2 for reversed. if( localplayer->ThirdPersonView() == 2 ) { - // Reverse y rotation - note that this is only used in doing collision to calculate our view + // Reverse x rotation - note that this is only used in doing collision to calculate our view // distance, the actual rotation itself is just below this else {} block - yRot += 180.0f; + xRot += 180.0f; } double xd = -Mth::sin(yRot / 180 * PI) * Mth::cos(xRot / 180 * PI) * cameraDist; @@ -572,13 +538,16 @@ void GameRenderer::moveCameraToPlayer(float a) } } - // 4J - removed extra rotations here that aren't needed because our xRot/yRot don't ever - // deviate from the player's view direction -// glRotatef(player->xRot - xRot, 1, 0, 0); -// glRotatef(player->yRot - yRot, 0, 1, 0); + if ( localplayer->ThirdPersonView() == 2) + { + glRotatef(180, 0, 1, 0); + } + + glRotatef(playerXRot - xRot, 1, 0, 0); + glRotatef(playerYRot - yRot, 0, 1, 0); glTranslatef(0, 0, (float) -cameraDist); -// glRotatef(yRot - player->yRot, 0, 1, 0); -// glRotatef(xRot - player->xRot, 1, 0, 0); + glRotatef(yRot - playerYRot, 0, 1, 0); + glRotatef(xRot - playerXRot, 1, 0, 0); } } else @@ -589,15 +558,7 @@ void GameRenderer::moveCameraToPlayer(float a) if (!mc->options->fixedCamera) { glRotatef(player->xRotO + (player->xRot - player->xRotO) * a, 1, 0, 0); - if( localplayer->ThirdPersonView() == 2 ) - { - // Third person view is now 0 for disabled, 1 for original, 2 for flipped - glRotatef(player->yRotO + (player->yRot - player->yRotO) * a, 0, 1, 0); - } - else - { - glRotatef(player->yRotO + (player->yRot - player->yRotO) * a + 180, 0, 1, 0); - } + glRotatef(player->yRotO + (player->yRot - player->yRotO) * a + 180, 0, 1, 0); } glTranslatef(0, heightOffset, 0); @@ -613,9 +574,9 @@ void GameRenderer::moveCameraToPlayer(float a) void GameRenderer::zoomRegion(double zoom, double xa, double ya) { - this->zoom = zoom; - this->zoom_x = xa; - this->zoom_y = ya; + zoom = zoom; + zoom_x = xa; + zoom_y = ya; } void GameRenderer::unZoomRegion() @@ -665,11 +626,11 @@ void GameRenderer::setupCamera(float a, int eye) } gluPerspective(fov, aspect, 0.05f, renderDistance * 2); - if (mc->gameMode->isCutScene()) + if (mc->gameMode->isCutScene()) { - float s = 1 / 1.5f; - glScalef(1, s, 1); - } + float s = 1 / 1.5f; + glScalef(1, s, 1); + } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); @@ -679,7 +640,7 @@ void GameRenderer::setupCamera(float a, int eye) // 4J-PB - this is a per-player option //if (mc->options->bobView) bobView(a); - + bool bNoLegAnim =(mc->player->getAnimOverrideBitmask()&(1<player->getAnimOverrideBitmask()&(1<player->oPortalTime + (mc->player->portalTime - mc->player->oPortalTime) * a; if (pt > 0) { - int multiplier = 20; - if (mc->player->hasEffect(MobEffect::confusion)) + int multiplier = 20; + if (mc->player->hasEffect(MobEffect::confusion)) { - multiplier = 7; - } + multiplier = 7; + } float skew = 5 / (pt * pt + 5) - pt * 0.04f; skew *= skew; @@ -704,58 +665,59 @@ void GameRenderer::setupCamera(float a, int eye) moveCameraToPlayer(a); - if (cameraFlip > 0) + if (cameraFlip > 0) { - int i = cameraFlip - 1; - if (i == 1) glRotatef(90, 0, 1, 0); - if (i == 2) glRotatef(180, 0, 1, 0); - if (i == 3) glRotatef(-90, 0, 1, 0); - if (i == 4) glRotatef(90, 1, 0, 0); - if (i == 5) glRotatef(-90, 1, 0, 0); - } + int i = cameraFlip - 1; + if (i == 1) glRotatef(90, 0, 1, 0); + if (i == 2) glRotatef(180, 0, 1, 0); + if (i == 3) glRotatef(-90, 0, 1, 0); + if (i == 4) glRotatef(90, 1, 0, 0); + if (i == 5) glRotatef(-90, 1, 0, 0); + } } void GameRenderer::renderItemInHand(float a, int eye) { if (cameraFlip > 0) return; - shared_ptr localplayer = dynamic_pointer_cast(mc->cameraTargetPlayer); + // 4J-JEV: I'm fairly confident this method would crash if the cameratarget isnt a local player anyway, but oh well. + shared_ptr localplayer = mc->cameraTargetPlayer->instanceof(eTYPE_LOCALPLAYER) ? dynamic_pointer_cast(mc->cameraTargetPlayer) : nullptr; + + bool renderHand = true; // 4J-PB - to turn off the hand for screenshots, but not when the item held is a map if ( localplayer!=NULL) { shared_ptr item = localplayer->inventory->getSelected(); - if(!(item && item->getItem()->id==Item::map_Id) && app.GetGameSettings(localplayer->GetXboxPad(),eGameSetting_DisplayHand)==0 ) return; + if(!(item && item->getItem()->id==Item::map_Id) && app.GetGameSettings(localplayer->GetXboxPad(),eGameSetting_DisplayHand)==0 ) renderHand = false; } glMatrixMode(GL_PROJECTION); glLoadIdentity(); - - float stereoScale = 0.07f; - if (mc->options->anaglyph3d) glTranslatef(-(eye * 2 - 1) * stereoScale, 0, 0); + float stereoScale = 0.07f; + if (mc->options->anaglyph3d) glTranslatef(-(eye * 2 - 1) * stereoScale, 0, 0); // 4J - have split out fov & aspect calculation so we can take into account viewports float fov, aspect; getFovAndAspect(fov, aspect, a, false); - if (zoom != 1) + if (zoom != 1) { - glTranslatef((float) zoom_x, (float) -zoom_y, 0); - glScaled(zoom, zoom, 1); - } - gluPerspective(fov, aspect, 0.05f, renderDistance * 2); + glTranslatef((float) zoom_x, (float) -zoom_y, 0); + glScaled(zoom, zoom, 1); + } + gluPerspective(fov, aspect, 0.05f, renderDistance * 2); - if (mc->gameMode->isCutScene()) + if (mc->gameMode->isCutScene()) { - float s = 1 / 1.5f; - glScalef(1, s, 1); - } + 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 +728,25 @@ void GameRenderer::renderItemInHand(float a, int eye) bool bNoLegAnim =(localplayer->getAnimOverrideBitmask()&( (1<GetXboxPad(),eGameSetting_ViewBob) && !localplayer->abilities.flying && !bNoLegAnim) bobView(a); - // 4J-PB - changing this to be per player - //if (!mc->options->thirdPersonView && !mc->cameraTargetPlayer->isSleeping()) - if (!localplayer->ThirdPersonView() && !mc->cameraTargetPlayer->isSleeping()) + // 4J: Skip hand rendering if render hand is off + if (renderHand) { - if (!mc->options->hideGui && !mc->gameMode->isCutScene()) + // 4J-PB - changing this to be per player + //if (!mc->options->thirdPersonView && !mc->cameraTargetPlayer->isSleeping()) + if (!localplayer->ThirdPersonView() && !mc->cameraTargetPlayer->isSleeping()) { - turnOnLightLayer(a); - PIXBeginNamedEvent(0,"Item in hand render"); - itemInHandRenderer->render(a); - PIXEndNamedEvent(); - turnOffLightLayer(a); + if (!mc->options->hideGui && !mc->gameMode->isCutScene()) + { + turnOnLightLayer(a); + PIXBeginNamedEvent(0,"Item in hand render"); + itemInHandRenderer->render(a); + PIXEndNamedEvent(); + turnOffLightLayer(a); + } } } glPopMatrix(); + // 4J-PB - changing this to be per player //if (!mc->options->thirdPersonView && !mc->cameraTargetPlayer->isSleeping()) if (!localplayer->ThirdPersonView() && !mc->cameraTargetPlayer->isSleeping()) @@ -787,6 +754,7 @@ void GameRenderer::renderItemInHand(float a, int eye) itemInHandRenderer->renderScreenEffect(a); bobHurt(a); } + // 4J-PB - changing this to be per player //if (mc->options->bobView) bobView(a); if(app.GetGameSettings(localplayer->GetXboxPad(),eGameSetting_ViewBob) && !localplayer->abilities.flying && !bNoLegAnim) bobView(a); @@ -796,14 +764,14 @@ void GameRenderer::renderItemInHand(float a, int eye) void GameRenderer::turnOffLightLayer(double alpha) { // 4J - TODO #if 0 - if (SharedConstants::TEXTURE_LIGHTING) + 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 +780,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 +836,7 @@ void GameRenderer::updateLightTexture(float a) if (player == NULL) continue; Level *level = player->level; // 4J - was mc->level when it was just to update the one light texture - + float skyDarken1 = level->getSkyDarken((float) 1); for (int i = 0; i < 256; i++) { @@ -876,7 +844,7 @@ void GameRenderer::updateLightTexture(float a) float sky = level->dimension->brightnessRamp[i / 16] * darken; float block = level->dimension->brightnessRamp[i % 16] * (blr * 0.1f + 1.5f); - if (level->lightningBoltTime > 0) + if (level->skyFlashTime > 0) { sky = level->dimension->brightnessRamp[i / 16]; } @@ -897,6 +865,14 @@ void GameRenderer::updateLightTexture(float a) _g = _g * 0.96f + 0.03f; _b = _b * 0.96f + 0.03f; + if (darkenWorldAmount > 0) + { + float amount = darkenWorldAmountO + (darkenWorldAmount - darkenWorldAmountO) * a; + _r = _r * (1.0f - amount) + (_r * .7f) * amount; + _g = _g * (1.0f - amount) + (_g * .6f) * amount; + _b = _b * (1.0f - amount) + (_b * .6f) * amount; + } + if (level->dimension->id == 1) { _r = (0.22f + rb * 0.75f); @@ -923,11 +899,12 @@ void GameRenderer::updateLightTexture(float a) } } - float brightness = 0.0f; // 4J - TODO - was mc->options->gamma; if (_r > 1) _r = 1; if (_g > 1) _g = 1; if (_b > 1) _b = 1; + float brightness = 0.0f; // 4J - TODO - was mc->options->gamma; + float ir = 1 - _r; float ig = 1 - _g; float ib = 1 - _b; @@ -938,12 +915,10 @@ void GameRenderer::updateLightTexture(float a) _g = _g * (1 - brightness) + ig * brightness; _b = _b * (1 - brightness) + ib * brightness; - _r = _r * 0.96f + 0.03f; _g = _g * 0.96f + 0.03f; _b = _b * 0.96f + 0.03f; - if (_r > 1) _r = 1; if (_g > 1) _g = 1; if (_b > 1) _b = 1; @@ -951,21 +926,24 @@ void GameRenderer::updateLightTexture(float a) if (_g < 0) _g = 0; if (_b < 0) _b = 0; - int a = 255; + int alpha = 255; int r = (int) (_r * 255); int g = (int) (_g * 255); int b = (int) (_b * 255); #if ( defined _DURANGO || defined _WIN64 || __PSVITA__ ) - lightPixels[j][i] = a << 24 | b << 16 | g << 8 | r; + lightPixels[j][i] = alpha << 24 | b << 16 | g << 8 | r; #elif ( defined _XBOX || defined __ORBIS__ ) - lightPixels[j][i] = a << 24 | r << 16 | g << 8 | b; + lightPixels[j][i] = alpha << 24 | r << 16 | g << 8 | b; #else - lightPixels[j][i] = r << 24 | g << 16 | b << 8 | a; + lightPixels[j][i] = r << 24 | g << 16 | b << 8 | alpha; #endif } mc->textures->replaceTextureDirect( lightPixels[j], 16, 16, getLightTexture(j,level) ); + // lightTexture->upload(); // 4J: not relevant + + //_updateLightTexture = false; } } @@ -1009,7 +987,7 @@ void GameRenderer::render(float a, bool bFirst) } #if 0 // 4J - TODO - if (mc->mouseGrabbed) { + if (mc->mouseGrabbed && focused) { mc->mouseHandler.poll(); float ss = mc->options->sensitivity * 0.6f + 0.2f; @@ -1020,21 +998,6 @@ void GameRenderer::render(float a, bool bFirst) int yAxis = 1; if (mc->options->invertYMouse) yAxis = -1; - if (Minecraft.DEADMAU5_CAMERA_CHEATS) { - if (!mc->options->fixedCamera) { - if (Keyboard.isKeyDown(Keyboard.KEY_J)) { - xo = -12f * mc->options->sensitivity; - } else if (Keyboard.isKeyDown(Keyboard.KEY_L)) { - xo = 12f * mc->options->sensitivity; - } - if (Keyboard.isKeyDown(Keyboard.KEY_I)) { - yo = 12f * mc->options->sensitivity; - } else if (Keyboard.isKeyDown(Keyboard.KEY_K)) { - yo = -12f * mc->options->sensitivity; - } - } - } - if (mc->options->smoothCamera) { xo = smoothTurnX.getNewDeltaValue(xo, .05f * sens); @@ -1164,7 +1127,7 @@ int GameRenderer::runUpdate(LPVOID lpParam) m_updateEvents->Set(eUpdateCanRun); -// PIXBeginNamedEvent(0,"Updating dirty chunks %d",(count++)&7); + // PIXBeginNamedEvent(0,"Updating dirty chunks %d",(count++)&7); // Update chunks atomically until there aren't any very near ones left - they will be deferred for rendering // until the call to CBuffDeferredModeEnd if we have anything near to render here @@ -1179,8 +1142,8 @@ int GameRenderer::runUpdate(LPVOID lpParam) count++; } while ( shouldContinue && count < MAX_DEFERRED_UPDATES ); -// while( minecraft->levelRenderer->updateDirtyChunks() ) -// ; + // while( minecraft->levelRenderer->updateDirtyChunks() ) + // ; RenderManager.CBuffDeferredModeEnd(); // If any renderable tile entities were flagged in this last block of chunk(s) that were udpated, then change their @@ -1210,8 +1173,8 @@ int GameRenderer::runUpdate(LPVOID lpParam) } m_deleteStackSparseDataStorage.clear(); LeaveCriticalSection(&m_csDeleteStack); - -// PIXEndNamedEvent(); + + // PIXEndNamedEvent(); AABB::resetPool(); Vec3::resetPool(); @@ -1226,9 +1189,9 @@ int GameRenderer::runUpdate(LPVOID lpParam) void GameRenderer::EnableUpdateThread() { -// #ifdef __PS3__ // MGH - disable the update on PS3 for now -// return; -// #endif + // #ifdef __PS3__ // MGH - disable the update on PS3 for now + // return; + // #endif #ifdef MULTITHREAD_ENABLE if( updateRunning) return; app.DebugPrintf("------------------EnableUpdateThread--------------------\n"); @@ -1240,9 +1203,9 @@ void GameRenderer::EnableUpdateThread() void GameRenderer::DisableUpdateThread() { -// #ifdef __PS3__ // MGH - disable the update on PS3 for now -// return; -// #endif + // #ifdef __PS3__ // MGH - disable the update on PS3 for now + // return; + // #endif #ifdef MULTITHREAD_ENABLE if( !updateRunning) return; app.DebugPrintf("------------------DisableUpdateThread--------------------\n"); @@ -1254,7 +1217,7 @@ void GameRenderer::DisableUpdateThread() void GameRenderer::renderLevel(float a, __int64 until) { -// if (updateLightTexture) updateLightTexture(); // 4J - TODO - Java 1.0.1 has this line enabled, should check why - don't want to put it in now in case it breaks split-screen + // if (updateLightTexture) updateLightTexture(); // 4J - TODO - Java 1.0.1 has this line enabled, should check why - don't want to put it in now in case it breaks split-screen glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); @@ -1263,13 +1226,13 @@ void GameRenderer::renderLevel(float a, __int64 until) // going to do for the primary player, and the other players can just view whatever they have loaded in - we're sharing render data between players. bool updateChunks = ( mc->player == mc->localplayers[ProfileManager.GetPrimaryPad()] ); -// if (mc->cameraTargetPlayer == NULL) // 4J - removed condition as we want to update this is mc->player changes for different local players + // if (mc->cameraTargetPlayer == NULL) // 4J - removed condition as we want to update this is mc->player changes for different local players { mc->cameraTargetPlayer = mc->player; } pick(a); - shared_ptr cameraEntity = mc->cameraTargetPlayer; + shared_ptr cameraEntity = mc->cameraTargetPlayer; LevelRenderer *levelRenderer = mc->levelRenderer; ParticleEngine *particleEngine = mc->particleEngine; double xOff = cameraEntity->xOld + (cameraEntity->x - cameraEntity->xOld) * a; @@ -1311,7 +1274,7 @@ void GameRenderer::renderLevel(float a, __int64 until) PIXBeginNamedEvent(0,"Culling"); MemSect(31); -// Culler *frustum = new FrustumCuller(); + // Culler *frustum = new FrustumCuller(); FrustumCuller frustObj; Culler *frustum = &frustObj; MemSect(0); @@ -1342,14 +1305,22 @@ void GameRenderer::renderLevel(float a, __int64 until) PIXEndNamedEvent(); } #endif + + + if (cameraEntity->y < Level::genDepth) + { + prepareAndRenderClouds(levelRenderer, a); + } + Frustum::getFrustum(); // 4J added - re-calculate frustum as rendering the clouds does a scale & recalculates one that isn't any good for the rest of the level rendering + setupFog(0, a); glEnable(GL_FOG); MemSect(31); - mc->textures->bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" + mc->textures->bindTexture(&TextureAtlas::LOCATION_BLOCKS); // 4J was L"/terrain.png" MemSect(0); Lighting::turnOff(); PIXBeginNamedEvent(0,"Level render"); - levelRenderer->render(cameraEntity, 0, a, updateChunks); + levelRenderer->render(cameraEntity, 0, a, updateChunks); PIXEndNamedEvent(); GL11::glShadeModel(GL11::GL_FLAT); @@ -1376,33 +1347,31 @@ void GameRenderer::renderLevel(float a, __int64 until) PIXEndNamedEvent(); PIXBeginNamedEvent(0,"Particle render"); turnOnLightLayer(a); // 4J - brought forward from 1.8.2 - particleEngine->renderLit(cameraEntity, a); + particleEngine->renderLit(cameraEntity, a, ParticleEngine::OPAQUE_LIST); Lighting::turnOff(); setupFog(0, a); - particleEngine->render(cameraEntity, a); + particleEngine->render(cameraEntity, a, ParticleEngine::OPAQUE_LIST); PIXEndNamedEvent(); turnOffLightLayer(a); // 4J - brought forward from 1.8.2 - shared_ptr player = dynamic_pointer_cast(cameraEntity); - if (mc->hitResult != NULL && cameraEntity->isUnderLiquid(Material::water) && player!=NULL) //&& !mc->options.hideGui) + if ( (mc->hitResult != NULL) && cameraEntity->isUnderLiquid(Material::water) && cameraEntity->instanceof(eTYPE_PLAYER) ) //&& !mc->options.hideGui) { - //shared_ptr player = dynamic_pointer_cast(cameraEntity); + shared_ptr player = dynamic_pointer_cast(cameraEntity); glDisable(GL_ALPHA_TEST); levelRenderer->renderHit(player, mc->hitResult, 0, player->inventory->getSelected(), a); - levelRenderer->renderHitOutline(player, mc->hitResult, 0, player->inventory->getSelected(), a); glEnable(GL_ALPHA_TEST); } } - glDisable(GL_BLEND); - glEnable(GL_CULL_FACE); + glDisable(GL_BLEND); + glEnable(GL_CULL_FACE); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDepthMask(true); setupFog(0, a); glEnable(GL_BLEND); glDisable(GL_CULL_FACE); MemSect(31); - mc->textures->bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" + mc->textures->bindTexture(&TextureAtlas::LOCATION_BLOCKS); // 4J was L"/terrain.png" MemSect(0); // 4J - have changed this fancy rendering option to work with our command buffers. The original used to use frame buffer flags to disable // writing to colour when doing the z-only pass, but that value gets obliterated by our command buffers. Using alpha blend function instead @@ -1436,19 +1405,29 @@ void GameRenderer::renderLevel(float a, __int64 until) PIXEndNamedEvent(); } + // 4J - added - have split out translucent particle rendering so that it happens after the water is rendered, primarily for fireworks + PIXBeginNamedEvent(0,"Particle render (translucent)"); + Lighting::turnOn(); + turnOnLightLayer(a); // 4J - brought forward from 1.8.2 + particleEngine->renderLit(cameraEntity, a, ParticleEngine::TRANSLUCENT_LIST); + Lighting::turnOff(); + setupFog(0, a); + particleEngine->render(cameraEntity, a, ParticleEngine::TRANSLUCENT_LIST); + PIXEndNamedEvent(); + turnOffLightLayer(a); // 4J - brought forward from 1.8.2 + ////////////////////////// End of 4J added section glDepthMask(true); glEnable(GL_CULL_FACE); glDisable(GL_BLEND); - if (zoom == 1 && (dynamic_pointer_cast(cameraEntity)!=NULL)) //&& !mc->options.hideGui) + if ( (zoom == 1) && cameraEntity->instanceof(eTYPE_PLAYER) ) //&& !mc->options.hideGui) { if (mc->hitResult != NULL && !cameraEntity->isUnderLiquid(Material::water)) { shared_ptr player = dynamic_pointer_cast(cameraEntity); glDisable(GL_ALPHA_TEST); - levelRenderer->renderHit(player, mc->hitResult, 0, player->inventory->getSelected(), a); - levelRenderer->renderHitOutline(player, mc->hitResult, 0, player->inventory->getSelected(), a); + levelRenderer->renderHitOutline(player, mc->hitResult, 0, a); glEnable(GL_ALPHA_TEST); } } @@ -1465,17 +1444,9 @@ void GameRenderer::renderLevel(float a, __int64 until) levelRenderer->renderDestroyAnimation(Tesselator::getInstance(), dynamic_pointer_cast(cameraEntity), a); glDisable(GL_BLEND); - if (mc->options->isCloudsOn()) + if (cameraEntity->y >= Level::genDepth) { - glPushMatrix(); - setupFog(0, a); - glEnable(GL_FOG); - PIXBeginNamedEvent(0,"Rendering clouds"); - levelRenderer->renderClouds(a); - PIXEndNamedEvent(); - glDisable(GL_FOG); - setupFog(1, a); - glPopMatrix(); + prepareAndRenderClouds(levelRenderer, a); } // 4J - rain rendering moved here so that it renders after clouds & can blend properly onto them @@ -1502,6 +1473,22 @@ void GameRenderer::renderLevel(float a, __int64 until) glColorMask(true, true, true, false); } +void GameRenderer::prepareAndRenderClouds(LevelRenderer *levelRenderer, float a) +{ + if (mc->options->isCloudsOn()) + { + glPushMatrix(); + setupFog(0, a); + glEnable(GL_FOG); + PIXBeginNamedEvent(0,"Rendering clouds"); + levelRenderer->renderClouds(a); + PIXEndNamedEvent(); + glDisable(GL_FOG); + setupFog(1, a); + glPopMatrix(); + } +} + void GameRenderer::tickRain() { float rainLevel = mc->level->getRainLevel(1); @@ -1512,7 +1499,7 @@ void GameRenderer::tickRain() rainLevel /= ( mc->levelRenderer->activePlayers() + 1 ); random->setSeed(_tick * 312987231l); - shared_ptr player = mc->cameraTargetPlayer; + shared_ptr player = mc->cameraTargetPlayer; Level *level = mc->level; int x0 = Mth::floor(player->x); @@ -1526,15 +1513,15 @@ void GameRenderer::tickRain() double rainPosZ = 0; int rainPosSamples = 0; - int rainCount = (int) (100 * rainLevel * rainLevel); - if (mc->options->particles == 1) + int rainCount = (int) (100 * rainLevel * rainLevel); + if (mc->options->particles == 1) { - rainCount >>= 1; - } else if (mc->options->particles == 2) + rainCount >>= 1; + } else if (mc->options->particles == 2) { - rainCount = 0; - } - for (int i = 0; i < rainCount; i++) + rainCount = 0; + } + for (int i = 0; i < rainCount; i++) { int x = x0 + random->nextInt(r) - random->nextInt(r); int z = z0 + random->nextInt(r) - random->nextInt(r); @@ -1592,27 +1579,27 @@ void GameRenderer::renderSnowAndRain(float a) // 4J - rain is relatively low poly, but high fill-rate - better to clip it RenderManager.StateSetEnableViewportClipPlanes(true); - this->turnOnLightLayer(a); + turnOnLightLayer(a); - if (rainXa == NULL) + if (rainXa == NULL) { - rainXa = new float[32 * 32]; - rainZa = new float[32 * 32]; + rainXa = new float[32 * 32]; + rainZa = new float[32 * 32]; - for (int z = 0; z < 32; z++) + for (int z = 0; z < 32; z++) { - for (int x = 0; x < 32; x++) + for (int x = 0; x < 32; x++) { - float xa = x - 16; - float za = z - 16; - float d = Mth::sqrt(xa * xa + za * za); - rainXa[z << 5 | x] = -za / d; - rainZa[z << 5 | x] = xa / d; - } - } - } + float xa = x - 16; + float za = z - 16; + float d = Mth::sqrt(xa * xa + za * za); + rainXa[z << 5 | x] = -za / d; + rainZa[z << 5 | x] = xa / d; + } + } + } - shared_ptr player = mc->cameraTargetPlayer; + shared_ptr player = mc->cameraTargetPlayer; Level *level = mc->level; int x0 = Mth::floor(player->x); @@ -1627,7 +1614,7 @@ void GameRenderer::renderSnowAndRain(float a) glAlphaFunc(GL_GREATER, 0.01f); MemSect(31); - mc->textures->bindTexture(TN_ENVIRONMENT_SNOW); // 4J was L"/environment/snow.png" + mc->textures->bindTexture(&SNOW_LOCATION); // 4J was L"/environment/snow.png" MemSect(0); double xo = player->xOld + (player->x - player->xOld) * a; @@ -1641,35 +1628,35 @@ void GameRenderer::renderSnowAndRain(float a) // 4J - was if(mc.options.fancyGraphics) r = 10; switch( mc->levelRenderer->activePlayers() ) { - case 1: - default: - r = 9; - break; - case 2: - r = 7; - break; - case 3: - r = 5; - break; - case 4: - r = 5; - break; + case 1: + default: + r = 9; + break; + case 2: + r = 7; + break; + case 3: + r = 5; + break; + case 4: + r = 5; + break; } // 4J - some changes made here to access biome through new interface that caches results in levelchunk flags, as an optimisation - - int mode = -1; - float time = _tick + a; - glColor4f(1, 1, 1, 1); + int mode = -1; + float time = _tick + a; + + glColor4f(1, 1, 1, 1); for (int x = x0 - r; x <= x0 + r; x++) for (int z = z0 - r; z <= z0 + r; z++) { - int rainSlot = (z - z0 + 16) * 32 + (x - x0 + 16); - float xa = rainXa[rainSlot] * 0.5f; - float za = rainZa[rainSlot] * 0.5f; - + int rainSlot = (z - z0 + 16) * 32 + (x - x0 + 16); + float xa = rainXa[rainSlot] * 0.5f; + float za = rainZa[rainSlot] * 0.5f; + // 4J - changes here brought forward from 1.8.2 Biome *b = level->getBiome(x, z); if (!b->hasRain() && !b->hasSnow()) continue; @@ -1683,8 +1670,8 @@ void GameRenderer::renderSnowAndRain(float a) if (yy1 < floor) yy1 = floor; float s = 1; - int yl = floor; - if (yl < yMin) yl = yMin; + int yl = floor; + if (yl < yMin) yl = yMin; if (yy0 != yy1) { @@ -1694,13 +1681,13 @@ void GameRenderer::renderSnowAndRain(float a) float temp = b->getTemperature(); if (level->getBiomeSource()->scaleTemp(temp, floor) >= 0.15f) { - if (mode != 0) + if (mode != 0) { - if (mode >= 0) t->end(); - mode = 0; - mc->textures->bindTexture(TN_ENVIRONMENT_RAIN); - t->begin(); - } + if (mode >= 0) t->end(); + mode = 0; + mc->textures->bindTexture(&RAIN_LOCATION); + t->begin(); + } float ra = (((_tick + x * x * 3121 + x * 45238971 + z * z * 418711 + z * 13761) & 31) + a) / 32.0f * (3 + random->nextFloat()); @@ -1708,24 +1695,24 @@ void GameRenderer::renderSnowAndRain(float a) double zd = (z + 0.5f) - player->z; float dd = (float) Mth::sqrt(xd * xd + zd * zd) / r; - float br = 1; - t->offset(-xo * 1, -yo * 1, -zo * 1); + float br = 1; + t->offset(-xo * 1, -yo * 1, -zo * 1); #ifdef __PSVITA__ // AP - this will set up the 4 vertices in half the time float Alpha = ((1 - dd * dd) * 0.5f + 0.5f) * rainLevel; int tex2 = (level->getLightColor(x, yl, z, 0) * 3 + 0xf000f0) / 4; t->tileRainQuad(x - xa + 0.5, yy0, z - za + 0.5, 0 * s, yy0 * s / 4.0f + ra * s, - x + xa + 0.5, yy0, z + za + 0.5, 1 * s, yy0 * s / 4.0f + ra * s, - x + xa + 0.5, yy1, z + za + 0.5, 1 * s, yy1 * s / 4.0f + ra * s, - x - xa + 0.5, yy1, z - za + 0.5, 0 * s, yy1 * s / 4.0f + ra * s, - br, br, br, Alpha, br, br, br, 0, tex2); + x + xa + 0.5, yy0, z + za + 0.5, 1 * s, yy0 * s / 4.0f + ra * s, + x + xa + 0.5, yy1, z + za + 0.5, 1 * s, yy1 * s / 4.0f + ra * s, + x - xa + 0.5, yy1, z - za + 0.5, 0 * s, yy1 * s / 4.0f + ra * s, + br, br, br, Alpha, br, br, br, 0, tex2); #else - t->tex2(level->getLightColor(x, yl, z, 0)); - t->color(br, br, br, ((1 - dd * dd) * 0.5f + 0.5f) * rainLevel); - t->vertexUV(x - xa + 0.5, yy0, z - za + 0.5, 0 * s, yy0 * s / 4.0f + ra * s); - t->vertexUV(x + xa + 0.5, yy0, z + za + 0.5, 1 * s, yy0 * s / 4.0f + ra * s); + t->tex2(level->getLightColor(x, yl, z, 0)); + t->color(br, br, br, ((1 - dd * dd) * 0.5f + 0.5f) * rainLevel); + t->vertexUV(x - xa + 0.5, yy0, z - za + 0.5, 0 * s, yy0 * s / 4.0f + ra * s); + t->vertexUV(x + xa + 0.5, yy0, z + za + 0.5, 1 * s, yy0 * s / 4.0f + ra * s); t->color(br, br, br, 0.0f); // 4J - added to soften the top visible edge of the rain - t->vertexUV(x + xa + 0.5, yy1, z + za + 0.5, 1 * s, yy1 * s / 4.0f + ra * s); + t->vertexUV(x + xa + 0.5, yy1, z + za + 0.5, 1 * s, yy1 * s / 4.0f + ra * s); t->vertexUV(x - xa + 0.5, yy1, z - za + 0.5, 0 * s, yy1 * s / 4.0f + ra * s); #endif t->offset(0, 0, 0); @@ -1733,50 +1720,50 @@ void GameRenderer::renderSnowAndRain(float a) } else { - if (mode != 1) + if (mode != 1) { - if (mode >= 0) t->end(); - mode = 1; - mc->textures->bindTexture(TN_ENVIRONMENT_SNOW); - t->begin(); - } - float ra = (((_tick) & 511) + a) / 512.0f; - float uo = random->nextFloat() + time * 0.01f * (float) random->nextGaussian(); - float vo = random->nextFloat() + time * (float) random->nextGaussian() * 0.001f; - double xd = (x + 0.5f) - player->x; - double zd = (z + 0.5f) - player->z; - float dd = (float) sqrt(xd * xd + zd * zd) / r; - float br = 1; - t->offset(-xo * 1, -yo * 1, -zo * 1); + if (mode >= 0) t->end(); + mode = 1; + mc->textures->bindTexture(&SNOW_LOCATION); + t->begin(); + } + float ra = (((_tick) & 511) + a) / 512.0f; + float uo = random->nextFloat() + time * 0.01f * (float) random->nextGaussian(); + float vo = random->nextFloat() + time * (float) random->nextGaussian() * 0.001f; + double xd = (x + 0.5f) - player->x; + double zd = (z + 0.5f) - player->z; + float dd = (float) sqrt(xd * xd + zd * zd) / r; + float br = 1; + t->offset(-xo * 1, -yo * 1, -zo * 1); #ifdef __PSVITA__ // AP - this will set up the 4 vertices in half the time float Alpha = ((1 - dd * dd) * 0.3f + 0.5f) * rainLevel; int tex2 = (level->getLightColor(x, yl, z, 0) * 3 + 0xf000f0) / 4; t->tileRainQuad(x - xa + 0.5, yy0, z - za + 0.5, 0 * s + uo, yy0 * s / 4.0f + ra * s + vo, - x + xa + 0.5, yy0, z + za + 0.5, 1 * s + uo, yy0 * s / 4.0f + ra * s + vo, - x + xa + 0.5, yy1, z + za + 0.5, 1 * s + uo, yy1 * s / 4.0f + ra * s + vo, - x - xa + 0.5, yy1, z - za + 0.5, 0 * s + uo, yy1 * s / 4.0f + ra * s + vo, - br, br, br, Alpha, br, br, br, Alpha, tex2); + x + xa + 0.5, yy0, z + za + 0.5, 1 * s + uo, yy0 * s / 4.0f + ra * s + vo, + x + xa + 0.5, yy1, z + za + 0.5, 1 * s + uo, yy1 * s / 4.0f + ra * s + vo, + x - xa + 0.5, yy1, z - za + 0.5, 0 * s + uo, yy1 * s / 4.0f + ra * s + vo, + br, br, br, Alpha, br, br, br, Alpha, tex2); #else - t->tex2((level->getLightColor(x, yl, z, 0) * 3 + 0xf000f0) / 4); - t->color(br, br, br, ((1 - dd * dd) * 0.3f + 0.5f) * rainLevel); - t->vertexUV(x - xa + 0.5, yy0, z - za + 0.5, 0 * s + uo, yy0 * s / 4.0f + ra * s + vo); - t->vertexUV(x + xa + 0.5, yy0, z + za + 0.5, 1 * s + uo, yy0 * s / 4.0f + ra * s + vo); - t->vertexUV(x + xa + 0.5, yy1, z + za + 0.5, 1 * s + uo, yy1 * s / 4.0f + ra * s + vo); - t->vertexUV(x - xa + 0.5, yy1, z - za + 0.5, 0 * s + uo, yy1 * s / 4.0f + ra * s + vo); + t->tex2((level->getLightColor(x, yl, z, 0) * 3 + 0xf000f0) / 4); + t->color(br, br, br, ((1 - dd * dd) * 0.3f + 0.5f) * rainLevel); + t->vertexUV(x - xa + 0.5, yy0, z - za + 0.5, 0 * s + uo, yy0 * s / 4.0f + ra * s + vo); + t->vertexUV(x + xa + 0.5, yy0, z + za + 0.5, 1 * s + uo, yy0 * s / 4.0f + ra * s + vo); + t->vertexUV(x + xa + 0.5, yy1, z + za + 0.5, 1 * s + uo, yy1 * s / 4.0f + ra * s + vo); + t->vertexUV(x - xa + 0.5, yy1, z - za + 0.5, 0 * s + uo, yy1 * s / 4.0f + ra * s + vo); #endif - t->offset(0, 0, 0); - } + t->offset(0, 0, 0); + } } } - if( mode >= 0 ) t->end(); - glEnable(GL_CULL_FACE); - glDisable(GL_BLEND); - glAlphaFunc(GL_GREATER, 0.1f); - this->turnOffLightLayer(a); + if( mode >= 0 ) t->end(); + glEnable(GL_CULL_FACE); + glDisable(GL_BLEND); + glAlphaFunc(GL_GREATER, 0.1f); + turnOffLightLayer(a); - RenderManager.StateSetEnableViewportClipPlanes(false); + RenderManager.StateSetEnableViewportClipPlanes(false); } // 4J - added forceScale parameter @@ -1796,7 +1783,7 @@ void GameRenderer::setupGuiScreen(int forceScale /*=-1*/) void GameRenderer::setupClearColor(float a) { Level *level = mc->level; - shared_ptr player = mc->cameraTargetPlayer; + shared_ptr player = mc->cameraTargetPlayer; float whiteness = 1.0f / (4 - mc->options->viewDistance); whiteness = 1 - (float) pow((double)whiteness, 0.25); @@ -1811,23 +1798,23 @@ void GameRenderer::setupClearColor(float a) fg = (float) fogColor->y; fb = (float) fogColor->z; - if (mc->options->viewDistance < 2) + if (mc->options->viewDistance < 2) { Vec3 *sunAngle = Mth::sin(level->getSunAngle(a)) > 0 ? Vec3::newTemp(-1, 0, 0) : Vec3::newTemp(1, 0, 0); - float d = (float) player->getViewVector(a)->dot(sunAngle); - if (d < 0) d = 0; - if (d > 0) + float d = (float) player->getViewVector(a)->dot(sunAngle); + if (d < 0) d = 0; + if (d > 0) { - float *c = level->dimension->getSunriseColor(level->getTimeOfDay(a), a); - if (c != NULL) + float *c = level->dimension->getSunriseColor(level->getTimeOfDay(a), a); + if (c != NULL) { - d *= c[3]; - fr = fr * (1 - d) + c[0] * d; - fg = fg * (1 - d) + c[1] * d; - fb = fb * (1 - d) + c[2] * d; - } - } - } + d *= c[3]; + fr = fr * (1 - d) + c[0] * d; + fg = fg * (1 - d) + c[1] * d; + fb = fb * (1 - d) + c[2] * d; + } + } + } fr += (sr - fr) * whiteness; fg += (sg - fg) * whiteness; @@ -1861,19 +1848,19 @@ void GameRenderer::setupClearColor(float a) } else if (t != 0 && Tile::tiles[t]->material == Material::water) { - + float clearness = EnchantmentHelper::getOxygenBonus(player) * 0.2f; + unsigned int colour = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Under_Water_Clear_Colour ); byte redComponent = ((colour>>16)&0xFF); byte greenComponent = ((colour>>8)&0xFF); byte blueComponent = ((colour)&0xFF); - fr = (float)redComponent/256;//0.02f; - fg = (float)greenComponent/256;//0.02f; - fb = (float)blueComponent/256;//0.2f; + fr = (float)redComponent/256 + clearness;//0.02f; + fg = (float)greenComponent/256 + clearness;//0.02f; + fb = (float)blueComponent/256 + clearness;//0.2f; } else if (t != 0 && Tile::tiles[t]->material == Material::lava) { - unsigned int colour = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Under_Lava_Clear_Colour ); byte redComponent = ((colour>>16)&0xFF); byte greenComponent = ((colour>>8)&0xFF); @@ -1889,29 +1876,37 @@ void GameRenderer::setupClearColor(float a) fg *= brr; fb *= brr; - double yy = (player->yOld + (player->y - player->yOld) * a) * level->dimension->getClearColorScale(); // 4J - getClearColorScale brought forward from 1.2.3 + double yy = (player->yOld + (player->y - player->yOld) * a) * level->dimension->getClearColorScale(); // 4J - getClearColorScale brought forward from 1.2.3 - if (player->hasEffect(MobEffect::blindness)) + if (player->hasEffect(MobEffect::blindness)) { - int duration = player->getEffect(MobEffect::blindness)->getDuration(); - if (duration < 20) + int duration = player->getEffect(MobEffect::blindness)->getDuration(); + if (duration < 20) { - yy = yy * (1.0f - (float) duration / 20.0f); - } + yy = yy * (1.0f - (float) duration / 20.0f); + } else { - yy = 0; - } - } + yy = 0; + } + } - if (yy < 1) + if (yy < 1) { - if (yy < 0) yy = 0; - yy = yy * yy; - fr *= yy; - fg *= yy; - fb *= yy; - } + if (yy < 0) yy = 0; + yy = yy * yy; + fr *= yy; + fg *= yy; + fb *= yy; + } + + if (darkenWorldAmount > 0) + { + float amount = darkenWorldAmountO + (darkenWorldAmount - darkenWorldAmountO) * a; + fr = fr * (1.0f - amount) + (fr * .7f) * amount; + fg = fg * (1.0f - amount) + (fg * .6f) * amount; + fb = fb * (1.0f - amount) + (fb * .6f) * amount; + } if (player->hasEffect(MobEffect::nightVision)) { @@ -1953,90 +1948,70 @@ void GameRenderer::setupClearColor(float a) void GameRenderer::setupFog(int i, float alpha) { - shared_ptr player = mc->cameraTargetPlayer; + shared_ptr player = mc->cameraTargetPlayer; // 4J - check for creative mode brought forward from 1.2.3 - bool creative = false; - if (dynamic_pointer_cast(player) ) + bool creative = false; + if ( player->instanceof(eTYPE_PLAYER) ) { - creative = (dynamic_pointer_cast(player))->abilities.instabuild; - } + creative = (dynamic_pointer_cast(player))->abilities.instabuild; + } - if (i == 999) + if (i == 999) { __debugbreak(); // 4J TODO /* - glFog(GL_FOG_COLOR, getBuffer(0, 0, 0, 1)); - glFogi(GL_FOG_MODE, GL_LINEAR); - glFogf(GL_FOG_START, 0); - glFogf(GL_FOG_END, 8); + glFog(GL_FOG_COLOR, getBuffer(0, 0, 0, 1)); + glFogi(GL_FOG_MODE, GL_LINEAR); + glFogf(GL_FOG_START, 0); + glFogf(GL_FOG_END, 8); - if (GLContext.getCapabilities().GL_NV_fog_distance) { - glFogi(NVFogDistance.GL_FOG_DISTANCE_MODE_NV, NVFogDistance.GL_EYE_RADIAL_NV); - } + if (GLContext.getCapabilities().GL_NV_fog_distance) { + glFogi(NVFogDistance.GL_FOG_DISTANCE_MODE_NV, NVFogDistance.GL_EYE_RADIAL_NV); + } - glFogf(GL_FOG_START, 0); + glFogf(GL_FOG_START, 0); */ - return; - } + return; + } glFog(GL_FOG_COLOR, getBuffer(fr, fg, fb, 1)); glNormal3f(0, -1, 0); glColor4f(1, 1, 1, 1); - int t = Camera::getBlockAt(mc->level, player, alpha); + int t = Camera::getBlockAt(mc->level, player, alpha); - if (player->hasEffect(MobEffect::blindness)) + if (player->hasEffect(MobEffect::blindness)) { - float distance = 5.0f; - int duration = player->getEffect(MobEffect::blindness)->getDuration(); - if (duration < 20) + float distance = 5.0f; + int duration = player->getEffect(MobEffect::blindness)->getDuration(); + if (duration < 20) { - distance = 5.0f + (renderDistance - 5.0f) * (1.0f - (float) duration / 20.0f); - } + distance = 5.0f + (renderDistance - 5.0f) * (1.0f - (float) duration / 20.0f); + } - glFogi(GL_FOG_MODE, GL_LINEAR); - if (i < 0) + glFogi(GL_FOG_MODE, GL_LINEAR); + if (i < 0) { - glFogf(GL_FOG_START, 0); - glFogf(GL_FOG_END, distance * 0.8f); - } + glFogf(GL_FOG_START, 0); + glFogf(GL_FOG_END, distance * 0.8f); + } else { - glFogf(GL_FOG_START, distance * 0.25f); - glFogf(GL_FOG_END, distance); - } + glFogf(GL_FOG_START, distance * 0.25f); + glFogf(GL_FOG_END, distance); + } // 4J - TODO investigate implementing this -// if (GLContext.getCapabilities().GL_NV_fog_distance) -// { -// glFogi(NVFogDistance.GL_FOG_DISTANCE_MODE_NV, NVFogDistance.GL_EYE_RADIAL_NV); -// } - } + // if (GLContext.getCapabilities().GL_NV_fog_distance) + // { + // glFogi(NVFogDistance.GL_FOG_DISTANCE_MODE_NV, NVFogDistance.GL_EYE_RADIAL_NV); + // } + } else if (isInClouds) { glFogi(GL_FOG_MODE, GL_EXP); glFogf(GL_FOG_DENSITY, 0.1f); // was 0.06 - - unsigned int colour = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_In_Cloud_Fog_Colour ); - byte redComponent = ((colour>>16)&0xFF); - byte greenComponent = ((colour>>8)&0xFF); - byte blueComponent = ((colour)&0xFF); - - float rr = (float)redComponent/256;//1.0f; - float gg = (float)greenComponent/256;//1.0f; - float bb = (float)blueComponent/256;//1.0f; - - if (mc->options->anaglyph3d) - { - float rrr = (rr * 30 + gg * 59 + bb * 11) / 100; - float ggg = (rr * 30 + gg * 70) / (100); - float bbb = (rr * 30 + bb * 70) / (100); - - rr = rrr; - gg = ggg; - bb = bbb; - } } else if (t > 0 && Tile::tiles[t]->material == Material::water) { @@ -2047,57 +2022,17 @@ void GameRenderer::setupFog(int i, float alpha) } else { - glFogf(GL_FOG_DENSITY, 0.1f); // was 0.06 - } - - unsigned int colour = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Under_Water_Fog_Colour ); - byte redComponent = ((colour>>16)&0xFF); - byte greenComponent = ((colour>>8)&0xFF); - byte blueComponent = ((colour)&0xFF); - - float rr = (float)redComponent/256;//0.4f; - float gg = (float)greenComponent/256;//0.4f; - float bb = (float)blueComponent/256;//0.9f; - - if (mc->options->anaglyph3d) - { - float rrr = (rr * 30 + gg * 59 + bb * 11) / 100; - float ggg = (rr * 30 + gg * 70) / (100); - float bbb = (rr * 30 + bb * 70) / (100); - - rr = rrr; - gg = ggg; - bb = bbb; + glFogf(GL_FOG_DENSITY, 0.1f - (EnchantmentHelper::getOxygenBonus(player) * 0.03f)); // was 0.06 } } else if (t > 0 && Tile::tiles[t]->material == Material::lava) { glFogi(GL_FOG_MODE, GL_EXP); glFogf(GL_FOG_DENSITY, 2.0f); // was 0.06 - - unsigned int colour = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Under_Lava_Fog_Colour ); - byte redComponent = ((colour>>16)&0xFF); - byte greenComponent = ((colour>>8)&0xFF); - byte blueComponent = ((colour)&0xFF); - - float rr = (float)redComponent/256;//0.4f; - float gg = (float)greenComponent/256;//0.3f; - float bb = (float)blueComponent/256;//0.3f; - - if (mc->options->anaglyph3d) - { - float rrr = (rr * 30 + gg * 59 + bb * 11) / 100; - float ggg = (rr * 30 + gg * 70) / (100); - float bbb = (rr * 30 + bb * 70) / (100); - - rr = rrr; - gg = ggg; - bb = bbb; - } } else { - float distance = renderDistance; + float distance = renderDistance; if (!mc->level->dimension->hasCeiling) { // 4J - test for doing bedrockfog brought forward from 1.2.3 @@ -2122,16 +2057,16 @@ void GameRenderer::setupFog(int i, float alpha) { glFogf(GL_FOG_START, 0); glFogf(GL_FOG_END, distance * 0.8f); - } + } else { glFogf(GL_FOG_START, distance * 0.25f); glFogf(GL_FOG_END, distance); - } + } /* 4J - removed - TODO investigate if (GLContext.getCapabilities().GL_NV_fog_distance) { - glFogi(NVFogDistance.GL_FOG_DISTANCE_MODE_NV, NVFogDistance.GL_EYE_RADIAL_NV); + glFogi(NVFogDistance.GL_FOG_DISTANCE_MODE_NV, NVFogDistance.GL_EYE_RADIAL_NV); } */ @@ -2165,5 +2100,5 @@ int GameRenderer::getFpsCap(int option) void GameRenderer::updateAllChunks() { -// mc->levelRenderer->updateDirtyChunks(mc->cameraTargetPlayer, true); + // mc->levelRenderer->updateDirtyChunks(mc->cameraTargetPlayer, true); } diff --git a/Minecraft.Client/GameRenderer.h b/Minecraft.Client/GameRenderer.h index 3729726b..1db7713a 100644 --- a/Minecraft.Client/GameRenderer.h +++ b/Minecraft.Client/GameRenderer.h @@ -11,9 +11,14 @@ class SparseDataStorage; #include "..\Minecraft.World\SmoothFloat.h" #include "..\Minecraft.World\C4JThread.h" +#include "ResourceLocation.h" class GameRenderer { +private: + static ResourceLocation RAIN_LOCATION; + static ResourceLocation SNOW_LOCATION; + public: static bool anaglyph3d; static int anaglyphPass; @@ -64,6 +69,9 @@ private: float oFov[4]; float tFov[4]; + float darkenWorldAmount; + float darkenWorldAmountO; + bool isInClouds; float m_fov; @@ -116,6 +124,7 @@ public: private: Random *random; int rainSoundTime; + void prepareAndRenderClouds(LevelRenderer *levelRenderer, float a); void tickRain(); private: // 4J - brought forward from 1.8.2 diff --git a/Minecraft.Client/GhastModel.cpp b/Minecraft.Client/GhastModel.cpp index 460c28ff..14277c43 100644 --- a/Minecraft.Client/GhastModel.cpp +++ b/Minecraft.Client/GhastModel.cpp @@ -34,7 +34,7 @@ GhastModel::GhastModel() : Model() } } -void GhastModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) +void GhastModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) { for (int i = 0; i < TENTACLESLENGTH; i++) // 4J - 9 was tentacles.length { @@ -44,7 +44,7 @@ void GhastModel::setupAnim(float time, float r, float bob, float yRot, float xRo void GhastModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { - setupAnim(time, r, bob, yRot, xRot, scale); + setupAnim(time, r, bob, yRot, xRot, scale, entity); glPushMatrix(); glTranslatef(0, .6f, 0); diff --git a/Minecraft.Client/GhastModel.h b/Minecraft.Client/GhastModel.h index 22e9023c..25f7e116 100644 --- a/Minecraft.Client/GhastModel.h +++ b/Minecraft.Client/GhastModel.h @@ -9,6 +9,6 @@ public: ModelPart *tentacles[TENTACLESLENGTH]; GhastModel(); - virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim=0); virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); }; \ No newline at end of file diff --git a/Minecraft.Client/GhastRenderer.cpp b/Minecraft.Client/GhastRenderer.cpp index 1d8a2833..cecb4eaf 100644 --- a/Minecraft.Client/GhastRenderer.cpp +++ b/Minecraft.Client/GhastRenderer.cpp @@ -3,11 +3,14 @@ #include "GhastModel.h" #include "..\Minecraft.World\net.minecraft.world.entity.monster.h" +ResourceLocation GhastRenderer::GHAST_LOCATION = ResourceLocation(TN_MOB_GHAST); +ResourceLocation GhastRenderer::GHAST_SHOOTING_LOCATION = ResourceLocation(TN_MOB_GHAST_FIRE); + GhastRenderer::GhastRenderer() : MobRenderer(new GhastModel(), 0.5f) { } -void GhastRenderer::scale(shared_ptr mob, float a) +void GhastRenderer::scale(shared_ptr mob, float a) { shared_ptr ghast = dynamic_pointer_cast(mob); @@ -18,4 +21,16 @@ void GhastRenderer::scale(shared_ptr mob, float a) float hs = (8+1/ss)/2; glScalef(hs, s, hs); glColor4f(1, 1, 1, 1); +} + +ResourceLocation *GhastRenderer::getTextureLocation(shared_ptr mob) +{ + shared_ptr ghast = dynamic_pointer_cast(mob); + + if (ghast->isCharging()) + { + return &GHAST_SHOOTING_LOCATION; + } + + return &GHAST_LOCATION; } \ No newline at end of file diff --git a/Minecraft.Client/GhastRenderer.h b/Minecraft.Client/GhastRenderer.h index 6778b9a5..eb4618b1 100644 --- a/Minecraft.Client/GhastRenderer.h +++ b/Minecraft.Client/GhastRenderer.h @@ -3,9 +3,14 @@ class GhastRenderer : public MobRenderer { +private: + static ResourceLocation GHAST_LOCATION; + static ResourceLocation GHAST_SHOOTING_LOCATION; + public: - GhastRenderer(); + GhastRenderer(); protected: - virtual void scale(shared_ptr mob, float a); + virtual void scale(shared_ptr mob, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/GiantMobRenderer.cpp b/Minecraft.Client/GiantMobRenderer.cpp index 6dabf7cb..6b232746 100644 --- a/Minecraft.Client/GiantMobRenderer.cpp +++ b/Minecraft.Client/GiantMobRenderer.cpp @@ -1,12 +1,19 @@ #include "stdafx.h" #include "GiantMobRenderer.h" +ResourceLocation GiantMobRenderer::ZOMBIE_LOCATION = ResourceLocation(TN_ITEM_ARROWS); + GiantMobRenderer::GiantMobRenderer(Model *model, float shadow, float _scale) : MobRenderer(model, shadow *_scale) { this->_scale = _scale; } -void GiantMobRenderer::scale(shared_ptr mob, float a) +void GiantMobRenderer::scale(shared_ptr mob, float a) { glScalef(_scale, _scale, _scale); +} + +ResourceLocation *GiantMobRenderer::getTextureLocation(shared_ptr mob) +{ + return &ZOMBIE_LOCATION; } \ No newline at end of file diff --git a/Minecraft.Client/GiantMobRenderer.h b/Minecraft.Client/GiantMobRenderer.h index 5b1cce1d..420fbc49 100644 --- a/Minecraft.Client/GiantMobRenderer.h +++ b/Minecraft.Client/GiantMobRenderer.h @@ -4,11 +4,13 @@ class GiantMobRenderer : public MobRenderer { private: + static ResourceLocation ZOMBIE_LOCATION; float _scale; public: GiantMobRenderer(Model *model, float shadow, float scale); protected: - virtual void scale(shared_ptr mob, float a); + virtual void scale(shared_ptr mob, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/Gui.cpp b/Minecraft.Client/Gui.cpp index 7d76edbd..2db0c83c 100644 --- a/Minecraft.Client/Gui.cpp +++ b/Minecraft.Client/Gui.cpp @@ -5,6 +5,7 @@ #include "Options.h" #include "MultiplayerLocalPlayer.h" #include "Textures.h" +#include "TextureAtlas.h" #include "GameMode.h" #include "Lighting.h" #include "ChatScreen.h" @@ -28,6 +29,8 @@ #include "..\Minecraft.World\LevelChunk.h" #include "..\Minecraft.World\Biome.h" +ResourceLocation Gui::PUMPKIN_BLUR_LOCATION = ResourceLocation(TN__BLUR__MISC_PUMPKINBLUR); + #define RENDER_HUD 0 //#ifndef _XBOX //#undef RENDER_HUD @@ -78,7 +81,7 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) ScreenSizeCalculator ssc(minecraft->options, minecraft->width, minecraft->height, guiScale ); int screenWidth = ssc.getWidth(); int screenHeight = ssc.getHeight(); - int iSafezoneXHalf=0,iSafezoneYHalf=0; + int iSafezoneXHalf=0,iSafezoneYHalf=0,iSafezoneTopYHalf=0; int iTooltipsYOffset=0; int quickSelectWidth=182; int quickSelectHeight=22; @@ -106,11 +109,13 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) // single player iSafezoneXHalf = screenWidth/20; // 5% iSafezoneYHalf = screenHeight/20; // 5% + iSafezoneTopYHalf = iSafezoneYHalf; iTooltipsYOffset=40+splitYOffset; break; case C4JRender::VIEWPORT_TYPE_SPLIT_TOP: iSafezoneXHalf = screenWidth/10; // 5% (need to treat the whole screen is 2x this screen) iSafezoneYHalf = splitYOffset; + iSafezoneTopYHalf = screenHeight/10; fScaleFactorWidth=0.5f; iWidthOffset=(int)((float)screenWidth*(1.0f - fScaleFactorWidth)); iTooltipsYOffset=44; @@ -120,6 +125,7 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) case C4JRender::VIEWPORT_TYPE_SPLIT_BOTTOM: iSafezoneXHalf = screenWidth/10; // 5% (need to treat the whole screen is 2x this screen) iSafezoneYHalf = splitYOffset + screenHeight/10;// 5% (need to treat the whole screen is 2x this screen) + iSafezoneTopYHalf = 0; fScaleFactorWidth=0.5f; iWidthOffset=(int)((float)screenWidth*(1.0f - fScaleFactorWidth)); iTooltipsYOffset=44; @@ -129,6 +135,7 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) case C4JRender::VIEWPORT_TYPE_SPLIT_LEFT: iSafezoneXHalf = screenWidth/10; // 5% (the whole screen is 2x this screen) iSafezoneYHalf = splitYOffset + screenHeight/10;// 5% (need to treat the whole screen is 2x this screen) + iSafezoneTopYHalf = screenHeight/10; fScaleFactorHeight=0.5f; iHeightOffset=screenHeight; iTooltipsYOffset=44; @@ -138,6 +145,7 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) case C4JRender::VIEWPORT_TYPE_SPLIT_RIGHT: iSafezoneXHalf = 0; iSafezoneYHalf = splitYOffset + screenHeight/10;// 5% (need to treat the whole screen is 2x this screen) + iSafezoneTopYHalf = splitYOffset + screenHeight/10; fScaleFactorHeight=0.5f; iHeightOffset=screenHeight; iTooltipsYOffset=44; @@ -147,24 +155,28 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_LEFT: iSafezoneXHalf = screenWidth/10; // 5% (the whole screen is 2x this screen) iSafezoneYHalf = splitYOffset; + iSafezoneTopYHalf = screenHeight/10; iTooltipsYOffset=44; currentGuiScaleFactor *= 0.5f; break; case C4JRender::VIEWPORT_TYPE_QUADRANT_TOP_RIGHT: iSafezoneXHalf = 0; iSafezoneYHalf = splitYOffset; // 5% + iSafezoneTopYHalf = screenHeight/10; iTooltipsYOffset=44; currentGuiScaleFactor *= 0.5f; break; case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_LEFT: iSafezoneXHalf = screenWidth/10; // 5% (the whole screen is 2x this screen) iSafezoneYHalf = splitYOffset + screenHeight/10; // 5% (the whole screen is 2x this screen) + iSafezoneTopYHalf = 0; iTooltipsYOffset=44; currentGuiScaleFactor *= 0.5f; break; case C4JRender::VIEWPORT_TYPE_QUADRANT_BOTTOM_RIGHT: iSafezoneXHalf = 0; iSafezoneYHalf = splitYOffset + screenHeight/10; // 5% (the whole screen is 2x this screen) + iSafezoneTopYHalf = 0; iTooltipsYOffset=44; currentGuiScaleFactor *= 0.5f; break; @@ -421,93 +433,168 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) yLine2 = yLine1 - 10; } + double maxHealth = minecraft->localplayers[iPad]->getAttribute(SharedMonsterAttributes.MAX_HEALTH); + + double totalAbsorption = minecraft->localplayers[iPad]->getAbsorptionAmount(); + int numHealthRows = Mth.ceil((maxHealth + totalAbsorption) / 2 / (float) NUM_HEARTS_PER_ROW); + int healthRowHeight = Math.max(10 - (numHealthRows - 2), 3); + int yLine2 = yLine1 - (numHealthRows - 1) * healthRowHeight - 10; + absorption = totalAbsorption; + int armor = minecraft->player->getArmorValue(); int heartOffsetIndex = -1; if (minecraft->player->hasEffect(MobEffect::regeneration)) { - heartOffsetIndex = tickCount % 25; + heartOffsetIndex = tickCount % (int) ceil(maxHealth + 5); } // render health and armor + //minecraft.profiler.push("armor"); for (int i = 0; i < Player::MAX_HEALTH / 2; i++) { if (armor > 0) { int xo = xLeft + i * 8; - - // HEALTH - if (i * 2 + 1 < armor) blit(xo, yLine2, 16 + 2 * 9, 9 * 1, 9, 9); - if (i * 2 + 1 == armor) blit(xo, yLine2, 16 + 1 * 9, 9 * 1, 9, 9); - if (i * 2 + 1 > armor) blit(xo, yLine2, 16 + 0 * 9, 9 * 1, 9, 9); + if (i * 2 + 1 < armor) blit(xo, yLine2, 16 + 2 * 9, 9, 9, 9); + if (i * 2 + 1 == armor) blit(xo, yLine2, 16 + 1 * 9, 9, 9, 9); + if (i * 2 + 1 > armor) blit(xo, yLine2, 16 + 0 * 9, 9, 9, 9); } + } + //minecraft.profiler.popPush("health"); + for (int i = Mth.ceil((maxHealth + totalAbsorption) / 2) - 1; i >= 0; i--) + { int healthTexBaseX = 16; - if (minecraft->player->hasEffect(MobEffect::poison)) + if (minecraft.player.hasEffect(MobEffect.poison)) { healthTexBaseX += 4 * 9; } + else if (minecraft.player.hasEffect(MobEffect.wither)) + { + healthTexBaseX += 8 * 9; + } int bg = 0; if (blink) bg = 1; - int xo = xLeft + i * 8; - int yo = yLine1; - - if (iHealth <= 4) + int rowIndex = Mth.ceil((i + 1) / (float) NUM_HEARTS_PER_ROW) - 1; + int xo = xLeft + (i % NUM_HEARTS_PER_ROW) * 8; + int yo = yLine1 - rowIndex * healthRowHeight; + if (currentHealth <= 4) { - yo += random->nextInt(2); + yo += random.nextInt(2); } + if (i == heartOffsetIndex) { yo -= 2; } int y0 = 0; - // 4J-PB - no hardcore in xbox -// if (minecraft.level.getLevelData().isHardcore()) { -// y0 = 5; -// } - blit(xo, yo, 16 + bg * 9, 9 * 0, 9, 9); + + // No hardcore on console + /*if (minecraft->level.getLevelData().isHardcore()) + { + y0 = 5; + }*/ + + blit(xo, yo, 16 + bg * 9, 9 * y0, 9, 9); if (blink) { - if (i * 2 + 1 < iLastHealth) blit(xo, yo, healthTexBaseX + 6 * 9, 9 * y0, 9, 9); - if (i * 2 + 1 == iLastHealth) blit(xo, yo, healthTexBaseX + 7 * 9, 9 * y0, 9, 9); + if (i * 2 + 1 < oldHealth) blit(xo, yo, healthTexBaseX + 6 * 9, 9 * y0, 9, 9); + if (i * 2 + 1 == oldHealth) blit(xo, yo, healthTexBaseX + 7 * 9, 9 * y0, 9, 9); + } + + if (absorption > 0) + { + if (absorption == totalAbsorption && totalAbsorption % 2 == 1) + { + blit(xo, yo, healthTexBaseX + 17 * 9, 9 * y0, 9, 9); + } + else + { + blit(xo, yo, healthTexBaseX + 16 * 9, 9 * y0, 9, 9); + } + absorption -= 2; + } + else + { + if (i * 2 + 1 < currentHealth) blit(xo, yo, healthTexBaseX + 4 * 9, 9 * y0, 9, 9); + if (i * 2 + 1 == currentHealth) blit(xo, yo, healthTexBaseX + 5 * 9, 9 * y0, 9, 9); } - if (i * 2 + 1 < iHealth) blit(xo, yo, healthTexBaseX + 4 * 9, 9 * y0, 9, 9); - if (i * 2 + 1 == iHealth) blit(xo, yo, healthTexBaseX + 5 * 9, 9 * y0, 9, 9); } - // render food - for (int i = 0; i < FoodConstants::MAX_FOOD / 2; i++) + std::shared_ptr riding = minecraft->localplayers[iPad].get()->riding; + std::shared_ptr living = dynamic_pointer_cast(riding); + if (riding == NULL) { - int yo = yLine1; - - - 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 716f4dfd..6933a2d7 100644 --- a/Minecraft.Client/Input.cpp +++ b/Minecraft.Client/Input.cpp @@ -83,8 +83,8 @@ void Input::tick(LocalPlayer *player) sprintForward = 0.0f; } - // 4J - in flying mode, don't actually toggle sneaking - if(!player->abilities.flying) + // 4J: In flying mode, don't actually toggle sneaking (unless we're riding in which case we need to sneak to dismount) + if(!player->abilities.flying || player->riding != NULL) { if((player->ullButtonsPressed&(1LL<localgameModes[iPad]->isInputAllowed(MINECRAFT_ACTION_SNEAK_TOGGLE)) { diff --git a/Minecraft.Client/ItemFrameRenderer.cpp b/Minecraft.Client/ItemFrameRenderer.cpp index 40769fb9..2d7493ec 100644 --- a/Minecraft.Client/ItemFrameRenderer.cpp +++ b/Minecraft.Client/ItemFrameRenderer.cpp @@ -4,6 +4,7 @@ #include "entityRenderDispatcher.h" //#include "ItemFrame" #include "ItemFrameRenderer.h" +#include "TextureAtlas.h" #include "..\Minecraft.World\JavaMath.h" #include "..\Minecraft.World\net.minecraft.world.entity.Item.h" @@ -18,6 +19,8 @@ #include "CompassTexture.h" #include "Minimap.h" +ResourceLocation ItemFrameRenderer::MAP_BACKGROUND_LOCATION = ResourceLocation(TN_MISC_MAPBG); + void ItemFrameRenderer::registerTerrainTextures(IconRegister *iconRegister) { backTexture = iconRegister->registerIcon(L"itemframe_back"); @@ -52,7 +55,7 @@ void ItemFrameRenderer::drawFrame(shared_ptr itemFrame) Minecraft *pMinecraft=Minecraft::GetInstance(); glPushMatrix(); - entityRenderDispatcher->textures->bindTexture(TN_TERRAIN); + entityRenderDispatcher->textures->bindTexture(&TextureAtlas::LOCATION_BLOCKS); glRotatef(itemFrame->yRot, 0, 1, 0); Tile *wood = Tile::wood; @@ -134,7 +137,7 @@ void ItemFrameRenderer::drawItem(shared_ptr entity) if (itemEntity->getItem()->getItem() == Item::map) { - entityRenderDispatcher->textures->bindTexture(TN_MISC_MAPBG); + entityRenderDispatcher->textures->bindTexture(&MAP_BACKGROUND_LOCATION); Tesselator *t = Tesselator::getInstance(); glRotatef(180, 0, 1, 0); diff --git a/Minecraft.Client/ItemFrameRenderer.h b/Minecraft.Client/ItemFrameRenderer.h index 47f2fe90..a6eea8f4 100644 --- a/Minecraft.Client/ItemFrameRenderer.h +++ b/Minecraft.Client/ItemFrameRenderer.h @@ -4,9 +4,9 @@ class ItemFrameRenderer : public EntityRenderer { private: + static ResourceLocation MAP_BACKGROUND_LOCATION; Icon *backTexture; - //@Override public: void registerTerrainTextures(IconRegister *iconRegister); virtual void render(shared_ptr _itemframe, double x, double y, double z, float rot, float a); diff --git a/Minecraft.Client/ItemInHandRenderer.cpp b/Minecraft.Client/ItemInHandRenderer.cpp index cee9254d..1e1ca1dd 100644 --- a/Minecraft.Client/ItemInHandRenderer.cpp +++ b/Minecraft.Client/ItemInHandRenderer.cpp @@ -3,6 +3,7 @@ #include "TileRenderer.h" #include "Tesselator.h" #include "Textures.h" +#include "TextureAtlas.h" #include "EntityRenderer.h" #include "PlayerRenderer.h" #include "EntityRenderDispatcher.h" @@ -17,10 +18,15 @@ #include "..\Minecraft.World\net.minecraft.world.level.h" #include "..\Minecraft.World\net.minecraft.world.h" -int ItemInHandRenderer::list = -1; +ResourceLocation ItemInHandRenderer::ENCHANT_GLINT_LOCATION = ResourceLocation(TN__BLUR__MISC_GLINT); +ResourceLocation ItemInHandRenderer::MAP_BACKGROUND_LOCATION = ResourceLocation(TN_MISC_MAPBG); +ResourceLocation ItemInHandRenderer::UNDERWATER_LOCATION = ResourceLocation(TN_MISC_WATER); + +int ItemInHandRenderer::listItem = -1; +int ItemInHandRenderer::listTerrain = -1; int ItemInHandRenderer::listGlint = -1; -ItemInHandRenderer::ItemInHandRenderer(Minecraft *mc, bool optimisedMinimap) +ItemInHandRenderer::ItemInHandRenderer(Minecraft *minecraft, bool optimisedMinimap) { // 4J - added height = 0; @@ -29,18 +35,18 @@ ItemInHandRenderer::ItemInHandRenderer(Minecraft *mc, bool optimisedMinimap) tileRenderer = new TileRenderer(); lastSlot = -1; - this->mc = mc; - minimap = new Minimap(mc->font, mc->options, mc->textures, optimisedMinimap); + this->minecraft = minecraft; + minimap = new Minimap(minecraft->font, minecraft->options, minecraft->textures, optimisedMinimap); // 4J - replaced mesh that is used to render held items with individual cubes, so we can make it all join up properly without seams. This // has a lot more quads in it than the original, so is now precompiled with a UV matrix offset to put it in the final place for the // current icon. Compile it on demand for the first ItemInHandRenderer (list is static) - if( list == -1 ) + if( listItem == -1 ) { - list = MemoryTracker::genLists(1); + listItem = MemoryTracker::genLists(1); float dd = 1 / 16.0f; - glNewList(list, GL_COMPILE); + glNewList(listItem, GL_COMPILE); Tesselator *t = Tesselator::getInstance(); t->begin(); for( int yp = 0; yp < 16; yp++ ) @@ -92,6 +98,64 @@ ItemInHandRenderer::ItemInHandRenderer(Minecraft *mc, bool optimisedMinimap) glEndList(); } + // Terrain texture is a different layout from the item texture + if( listTerrain == -1 ) + { + listTerrain = MemoryTracker::genLists(1); + float dd = 1 / 16.0f; + + glNewList(listTerrain, GL_COMPILE); + Tesselator *t = Tesselator::getInstance(); + t->begin(); + for( int yp = 0; yp < 16; yp++ ) + for( int xp = 0; xp < 16; xp++ ) + { + float u = (15-xp) / 256.0f; + float v = (15-yp) / 512.0f; + u += 0.5f / 256.0f; + v += 0.5f / 512.0f; + float x0 = xp / 16.0f; + float x1 = x0 + 1.0f/16.0f; + float y0 = yp / 16.0f; + float y1 = y0 + 1.0f/16.0f; + float z0 = 0.0f; + float z1 = -dd; + + t->normal(0, 0, 1); + t->vertexUV(x0, y0, z0, u, v); + t->vertexUV(x1, y0, z0, u, v); + t->vertexUV(x1, y1, z0, u, v); + t->vertexUV(x0, y1, z0, u, v); + t->normal(0, 0, -1); + t->vertexUV(x0, y1, z1, u, v); + t->vertexUV(x1, y1, z1, u, v); + t->vertexUV(x1, y0, z1, u, v); + t->vertexUV(x0, y0, z1, u, v); + t->normal(-1, 0, 0); + t->vertexUV(x0, y0, z1, u, v); + t->vertexUV(x0, y0, z0, u, v); + t->vertexUV(x0, y1, z0, u, v); + t->vertexUV(x0, y1, z1, u, v); + t->normal(1, 0, 0); + t->vertexUV(x1, y1, z1, u, v); + t->vertexUV(x1, y1, z0, u, v); + t->vertexUV(x1, y0, z0, u, v); + t->vertexUV(x1, y0, z1, u, v); + t->normal(0, 1, 0); + t->vertexUV(x1, y0, z0, u, v); + t->vertexUV(x0, y0, z0, u, v); + t->vertexUV(x0, y0, z1, u, v); + t->vertexUV(x1, y0, z1, u, v); + t->normal(0, -1, 0); + t->vertexUV(x1, y1, z1, u, v); + t->vertexUV(x0, y1, z1, u, v); + t->vertexUV(x0, y1, z0, u, v); + t->vertexUV(x1, y1, z0, u, v); + } + t->end(); + glEndList(); + } + // Also create special object for glint overlays - this is the same as the previous one, with a different UV scalings, and depth test set to equal if( listGlint == -1 ) { @@ -158,7 +222,7 @@ ItemInHandRenderer::ItemInHandRenderer(Minecraft *mc, bool optimisedMinimap) } -void ItemInHandRenderer::renderItem(shared_ptr mob, shared_ptr item, int layer, bool setColor/* = true*/) +void ItemInHandRenderer::renderItem(shared_ptr mob, shared_ptr item, int layer, bool setColor/* = true*/) { // 4J - code borrowed from render method below, although not factoring in brightness as that should already be being taken into account // by texture lighting. This is for colourising things held in 3rd person view. @@ -177,9 +241,9 @@ void ItemInHandRenderer::renderItem(shared_ptr mob, shared_ptrgetIconType() == Icon::TYPE_TERRAIN && tile != NULL && TileRenderer::canRender(tile->getRenderShape())) { MemSect(31); - mc->textures->bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" + minecraft->textures->bindTexture(minecraft->textures->getTextureLocation(Icon::TYPE_TERRAIN)); MemSect(0); - tileRenderer->renderTile(tile, item->getAuxValue(), SharedConstants::TEXTURE_LIGHTING ? 1.0f : mob->getBrightness(1)); // 4J - change brought forward from 1.8.2 + tileRenderer->renderTile(Tile::tiles[item->id], item->getAuxValue(), SharedConstants::TEXTURE_LIGHTING ? 1.0f : mob->getBrightness(1)); // 4J - change brought forward from 1.8.2 } else { @@ -192,14 +256,9 @@ void ItemInHandRenderer::renderItem(shared_ptr mob, shared_ptrgetIconType() == Icon::TYPE_TERRAIN) - { - mc->textures->bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" - } - else - { - mc->textures->bindTexture(TN_GUI_ITEMS); // 4J was L"/gui/items.png" - } + bool bIsTerrain = item->getIconType() == Icon::TYPE_TERRAIN; + minecraft->textures->bindTexture(minecraft->textures->getTextureLocation(item->getIconType())); + MemSect(0); Tesselator *t = Tesselator::getInstance(); @@ -238,13 +297,13 @@ void ItemInHandRenderer::renderItem(shared_ptr mob, shared_ptrgetSourceWidth(), icon->getSourceHeight(), 1 / 16.0f, false); + renderItem3D(t, u0, v0, u1, v1, icon->getSourceWidth(), icon->getSourceHeight(), 1 / 16.0f, false, bIsTerrain); if (item != NULL && item->isFoil() && layer == 0) { glDepthFunc(GL_EQUAL); glDisable(GL_LIGHTING); - mc->textures->bind(mc->textures->loadTexture(TN__BLUR__MISC_GLINT)); // 4J was L"%blur%/misc/glint.png" + minecraft->textures->bindTexture(&ENCHANT_GLINT_LOCATION); glEnable(GL_BLEND); glBlendFunc(GL_SRC_COLOR, GL_ONE); float br = 0.76f; @@ -257,14 +316,14 @@ void ItemInHandRenderer::renderItem(shared_ptr mob, shared_ptr mob, shared_ptr player = mc->player; + shared_ptr player = minecraft->player; // 4J - added so we can adjust the position of the hands for horizontal & vertical split screens float fudgeX = 0.0f; @@ -355,12 +414,12 @@ void ItemInHandRenderer::render(float a) shared_ptr item = selectedItem; - float br = mc->level->getBrightness(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); + float br = minecraft->level->getBrightness(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); // 4J - change brought forward from 1.8.2 if (SharedConstants::TEXTURE_LIGHTING) { br = 1; - int col = mc->level->getLightColor(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z), 0); + int col = minecraft->level->getLightColor(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z), 0); int u = col % 65536; int v = col / 65536; glMultiTexCoord2f(GL_TEXTURE1, u / 1.0f, v / 1.0f); @@ -413,9 +472,9 @@ void ItemInHandRenderer::render(float a) { // 4J-PB - if we've got a player texture, use that - //glBindTexture(GL_TEXTURE_2D, mc->textures->loadHttpTexture(mc->player->customTextureUrl, mc->player->getTexture())); - glBindTexture(GL_TEXTURE_2D, mc->textures->loadMemTexture(mc->player->customTextureUrl, mc->player->getTexture())); - mc->textures->clearLastBoundId(); + //glBindTexture(GL_TEXTURE_2D, minecraft->textures->loadHttpTexture(minecraft->player->customTextureUrl, minecraft->player->getTexture())); + glBindTexture(GL_TEXTURE_2D, minecraft->textures->loadMemTexture(minecraft->player->customTextureUrl, minecraft->player->getTexture())); + minecraft->textures->clearLastBoundId(); for (int i = 0; i < 2; i++) { int flip = i * 2 - 1; @@ -427,7 +486,7 @@ void ItemInHandRenderer::render(float a) glRotatef(59, 0, 0, 1); glRotatef((float)(-65 * flip), 0, 1, 0); - EntityRenderer *er = EntityRenderDispatcher::instance->getRenderer(mc->player); + EntityRenderer *er = EntityRenderDispatcher::instance->getRenderer(minecraft->player); PlayerRenderer *playerRenderer = (PlayerRenderer *) er; float ss = 1; glScalef(ss, ss, ss); @@ -463,7 +522,7 @@ void ItemInHandRenderer::render(float a) glScalef(s, s, s); MemSect(31); - mc->textures->bindTexture(TN_MISC_MAPBG); // 4J was L"/misc/mapbg.png" + minecraft->textures->bindTexture(&MAP_BACKGROUND_LOCATION); // 4J was L"/misc/mapbg.png" MemSect(0); Tesselator *t = Tesselator::getInstance(); @@ -477,9 +536,9 @@ void ItemInHandRenderer::render(float a) t->vertexUV((float)(0 - vo), (float)( 0 - vo), (float)( 0), (float)( 0), (float)( 0)); t->end(); - shared_ptr data = Item::map->getSavedData(item, mc->level); + shared_ptr data = Item::map->getSavedData(item, minecraft->level); PIXBeginNamedEvent(0,"Minimap render"); - if(data != NULL) minimap->render(mc->player, mc->textures, data, mc->player->entityId); + if(data != NULL) minimap->render(minecraft->player, minecraft->textures, data, minecraft->player->entityId); PIXEndNamedEvent(); glPopMatrix(); @@ -633,12 +692,12 @@ void ItemInHandRenderer::render(float a) // 4J-PB - if we've got a player texture, use that - //glBindTexture(GL_TEXTURE_2D, mc->textures->loadHttpTexture(mc->player->customTextureUrl, mc->player->getTexture())); + //glBindTexture(GL_TEXTURE_2D, minecraft->textures->loadHttpTexture(minecraft->player->customTextureUrl, minecraft->player->getTexture())); MemSect(31); - glBindTexture(GL_TEXTURE_2D, mc->textures->loadMemTexture(mc->player->customTextureUrl, mc->player->getTexture())); + glBindTexture(GL_TEXTURE_2D, minecraft->textures->loadMemTexture(minecraft->player->customTextureUrl, minecraft->player->getTexture())); MemSect(0); - mc->textures->clearLastBoundId(); + minecraft->textures->clearLastBoundId(); glTranslatef(-1.0f, +3.6f, +3.5f); glRotatef(120, 0, 0, 1); glRotatef(180 + 20, 1, 0, 0); @@ -646,7 +705,7 @@ void ItemInHandRenderer::render(float a) glScalef(1.5f / 24.0f * 16, 1.5f / 24.0f * 16, 1.5f / 24.0f * 16); glTranslatef(5.6f, 0, 0); - EntityRenderer *er = EntityRenderDispatcher::instance->getRenderer(mc->player); + EntityRenderer *er = EntityRenderDispatcher::instance->getRenderer(minecraft->player); PlayerRenderer *playerRenderer = (PlayerRenderer *) er; float ss = 1; glScalef(ss, ss, ss); @@ -670,26 +729,19 @@ void ItemInHandRenderer::render(float a) void ItemInHandRenderer::renderScreenEffect(float a) { glDisable(GL_ALPHA_TEST); - if (mc->player->isOnFire()) + if (minecraft->player->isOnFire()) { - MemSect(31); - mc->textures->bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" - MemSect(0); renderFire(a); } - - if (mc->player->isInWall()) // Inside a tile + if (minecraft->player->isInWall()) // Inside a tile { - int x = Mth::floor(mc->player->x); - int y = Mth::floor(mc->player->y); - int z = Mth::floor(mc->player->z); + int x = Mth::floor(minecraft->player->x); + int y = Mth::floor(minecraft->player->y); + int z = Mth::floor(minecraft->player->z); - MemSect(31); - mc->textures->bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" - MemSect(0); - int tile = mc->level->getTile(x, y, z); - if (mc->level->isSolidBlockingTile(x, y, z)) + int tile = minecraft->level->getTile(x, y, z); + if (minecraft->level->isSolidBlockingTile(x, y, z)) { renderTex(a, Tile::tiles[tile]->getTexture(2)); } @@ -697,15 +749,15 @@ void ItemInHandRenderer::renderScreenEffect(float a) { for (int i = 0; i < 8; i++) { - float xo = ((i >> 0) % 2 - 0.5f) * mc->player->bbWidth * 0.9f; - float yo = ((i >> 1) % 2 - 0.5f) * mc->player->bbHeight * 0.2f; - float zo = ((i >> 2) % 2 - 0.5f) * mc->player->bbWidth * 0.9f; + float xo = ((i >> 0) % 2 - 0.5f) * minecraft->player->bbWidth * 0.9f; + float yo = ((i >> 1) % 2 - 0.5f) * minecraft->player->bbHeight * 0.2f; + float zo = ((i >> 2) % 2 - 0.5f) * minecraft->player->bbWidth * 0.9f; int xt = Mth::floor(x + xo); int yt = Mth::floor(y + yo); int zt = Mth::floor(z + zo); - if (mc->level->isSolidBlockingTile(xt, yt, zt)) + if (minecraft->level->isSolidBlockingTile(xt, yt, zt)) { - tile = mc->level->getTile(xt, yt, zt); + tile = minecraft->level->getTile(xt, yt, zt); } } } @@ -713,10 +765,10 @@ void ItemInHandRenderer::renderScreenEffect(float a) if (Tile::tiles[tile] != NULL) renderTex(a, Tile::tiles[tile]->getTexture(2)); } - if (mc->player->isUnderLiquid(Material::water)) + if (minecraft->player->isUnderLiquid(Material::water)) { MemSect(31); - mc->textures->bindTexture(TN_MISC_WATER); // 4J was L"/misc/water.png" + minecraft->textures->bindTexture(&UNDERWATER_LOCATION); // 4J was L"/misc/water.png" MemSect(0); renderWater(a); } @@ -726,6 +778,8 @@ void ItemInHandRenderer::renderScreenEffect(float a) void ItemInHandRenderer::renderTex(float a, Icon *slot) { + minecraft->textures->bindTexture(&TextureAtlas::LOCATION_BLOCKS); // TODO: get this data from Icon + Tesselator *t = Tesselator::getInstance(); float br = 0.1f; @@ -760,9 +814,11 @@ void ItemInHandRenderer::renderTex(float a, Icon *slot) void ItemInHandRenderer::renderWater(float a) { + minecraft->textures->bindTexture(&UNDERWATER_LOCATION); + Tesselator *t = Tesselator::getInstance(); - float br = mc->player->getBrightness(a); + float br = minecraft->player->getBrightness(a); glColor4f(br, br, br, 0.5f); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -777,8 +833,8 @@ void ItemInHandRenderer::renderWater(float a) float y1 = +1; float z0 = -0.5f; - float uo = -mc->player->yRot / 64.0f; - float vo = +mc->player->xRot / 64.0f; + float uo = -minecraft->player->yRot / 64.0f; + float vo = +minecraft->player->xRot / 64.0f; t->begin(); t->vertexUV((float)(x0), (float)( y0), (float)( z0), (float)( size + uo), (float)( size + vo)); @@ -796,7 +852,14 @@ void ItemInHandRenderer::renderWater(float a) void ItemInHandRenderer::renderFire(float a) { Tesselator *t = Tesselator::getInstance(); - glColor4f(1, 1, 1, 0.9f); + + unsigned int col = Minecraft::GetInstance()->getColourTable()->getColor( eMinecraftColour_Fire_Overlay ); + float aCol = ( (col>>24)&0xFF )/255.0f; + float rCol = ( (col>>16)&0xFF )/255.0f; + float gCol = ( (col>>8)&0xFF )/255.0; + float bCol = ( col&0xFF )/255.0; + + glColor4f(rCol, gCol, bCol, aCol); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -805,6 +868,7 @@ void ItemInHandRenderer::renderFire(float a) { glPushMatrix(); Icon *slot = Tile::fire->getTextureLayer(1); + minecraft->textures->bindTexture(&TextureAtlas::LOCATION_BLOCKS); // TODO: Get this from Icon float u0 = slot->getU0(true); float u1 = slot->getU1(true); @@ -837,7 +901,7 @@ void ItemInHandRenderer::tick() oHeight = height; - shared_ptr player = mc->player; + shared_ptr player = minecraft->player; shared_ptr nextTile = player->inventory->getSelected(); bool matches = lastSlot == player->inventory->selected && nextTile == selectedItem; diff --git a/Minecraft.Client/ItemInHandRenderer.h b/Minecraft.Client/ItemInHandRenderer.h index dee51a7f..b5d840a2 100644 --- a/Minecraft.Client/ItemInHandRenderer.h +++ b/Minecraft.Client/ItemInHandRenderer.h @@ -3,19 +3,25 @@ class Minecraft; class ItemInstance; class Minimap; -class Mob; +class LivingEntity; class TileRenderer; class Tesselator; class ItemInHandRenderer { +public: + // 4J - made these public + static ResourceLocation ENCHANT_GLINT_LOCATION; + static ResourceLocation MAP_BACKGROUND_LOCATION; + static ResourceLocation UNDERWATER_LOCATION; + private: - Minecraft *mc; + Minecraft *minecraft; shared_ptr selectedItem; float height; float oHeight; TileRenderer *tileRenderer; - static int list, listGlint; + static int listItem, listGlint, listTerrain; public: // 4J Stu - Made public so we can use it from ItemFramRenderer @@ -23,8 +29,8 @@ public: public: ItemInHandRenderer(Minecraft *mc, bool optimisedMinimap = true); // 4J Added optimisedMinimap param - void renderItem(shared_ptr mob, shared_ptr item, int layer, bool setColor = true); // 4J added setColor parameter - static void renderItem3D(Tesselator *t, float u0, float v0, float u1, float v1, int width, int height, float depth, bool isGlint); // 4J added isGlint parameter + void renderItem(shared_ptr mob, shared_ptr item, int layer, bool setColor = true); // 4J added setColor parameter + static void renderItem3D(Tesselator *t, float u0, float v0, float u1, float v1, int width, int height, float depth, bool isGlint, bool isTerrain); // 4J added isGlint and isTerrain parameter public: void render(float a); void renderScreenEffect(float a); diff --git a/Minecraft.Client/ItemRenderer.cpp b/Minecraft.Client/ItemRenderer.cpp index 03d0d3a5..49e25060 100644 --- a/Minecraft.Client/ItemRenderer.cpp +++ b/Minecraft.Client/ItemRenderer.cpp @@ -10,6 +10,11 @@ #include "..\Minecraft.World\StringHelpers.h" #include "..\Minecraft.World\net.minecraft.world.h" #include "Options.h" +#include "TextureAtlas.h" + +#ifdef _XBOX +extern IDirect3DDevice9 *g_pD3DDevice; +#endif ItemRenderer::ItemRenderer() : EntityRenderer() { @@ -17,8 +22,8 @@ ItemRenderer::ItemRenderer() : EntityRenderer() setColor = true; blitOffset = 0; - this->shadowRadius = 0.15f; - this->shadowStrength = 0.75f; + shadowRadius = 0.15f; + shadowStrength = 0.75f; // 4J added m_bItemFrame= false; @@ -29,13 +34,38 @@ ItemRenderer::~ItemRenderer() delete random; } +ResourceLocation *ItemRenderer::getTextureLocation(shared_ptr entity) +{ + shared_ptr itemEntity = dynamic_pointer_cast(entity); + return getTextureLocation(itemEntity->getItem()->getIconType()); +} + +ResourceLocation *ItemRenderer::getTextureLocation(int iconType) +{ + if (iconType == Icon::TYPE_TERRAIN) + { + return &TextureAtlas::LOCATION_BLOCKS;//L"/terrain.png")); + } + else + { +#ifdef _XBOX + // 4J - make sure we've got linear sampling on minification here as non-mipmapped things like this currently + // default to having point sampling, which makes very small icons render rather badly + g_pD3DDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); +#endif + return &TextureAtlas::LOCATION_ITEMS;//L"/gui/items.png")); + } +} + void ItemRenderer::render(shared_ptr _itemEntity, double x, double y, double z, float rot, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr itemEntity = dynamic_pointer_cast(_itemEntity); + bindTexture(itemEntity); random->setSeed(187); shared_ptr item = itemEntity->getItem(); + if (item->getItem() == NULL) return; glPushMatrix(); float bob = Mth::sin((itemEntity->age + a) / 10.0f + itemEntity->bobOffs) * 0.1f + 0.1f; @@ -45,11 +75,13 @@ void ItemRenderer::render(shared_ptr _itemEntity, double x, double y, do if (itemEntity->getItem()->count > 1) count = 2; if (itemEntity->getItem()->count > 5) count = 3; if (itemEntity->getItem()->count > 20) count = 4; + if (itemEntity->getItem()->count > 40) count = 5; glTranslatef((float) x, (float) y + bob, (float) z); glEnable(GL_RESCALE_NORMAL); Tile *tile = Tile::tiles[item->id]; + if (item->getIconType() == Icon::TYPE_TERRAIN && tile != NULL && TileRenderer::canRender(tile->getRenderShape())) { glRotatef(spin, 0, 1, 0); @@ -61,7 +93,6 @@ void ItemRenderer::render(shared_ptr _itemEntity, double x, double y, do glRotatef(-90, 0, 1, 0); } - bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" float s = 1 / 4.0f; int shape = tile->getRenderShape(); if (shape == Tile::SHAPE_CROSS_TEXTURE || shape == Tile::SHAPE_STEM || shape == Tile::SHAPE_LEVER || shape == Tile::SHAPE_TORCH ) @@ -86,7 +117,7 @@ void ItemRenderer::render(shared_ptr _itemEntity, double x, double y, do glPopMatrix(); } } - else if (item->getItem()->hasMultipleSpriteLayers()) + else if (item->getIconType() == Icon::TYPE_ITEM && item->getItem()->hasMultipleSpriteLayers()) { if (m_bItemFrame) { @@ -99,7 +130,7 @@ void ItemRenderer::render(shared_ptr _itemEntity, double x, double y, do glScalef(1 / 2.0f, 1 / 2.0f, 1 / 2.0f); } - bindTexture(TN_GUI_ITEMS); // 4J was "/gui/items.png" + bindTexture(&TextureAtlas::LOCATION_ITEMS); // 4J was "/gui/items.png" for (int layer = 0; layer <= 1; layer++) { @@ -137,16 +168,9 @@ void ItemRenderer::render(shared_ptr _itemEntity, double x, double y, do // 4J Stu - For rendering the static compass, we give it a non-zero aux value if(item->id == Item::compass_Id) item->setAuxValue(255); - Icon *icon = item->getIcon(); if(item->id == Item::compass_Id) item->setAuxValue(0); - if (item->getIconType() == Icon::TYPE_TERRAIN) - { - bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" - } - else - { - bindTexture(TN_GUI_ITEMS); // 4J was L"/gui/items.png" - } + + Icon *icon = item->getIcon(); if (setColor) { int col = Item::items[item->id]->getColor(item,0); @@ -238,24 +262,28 @@ void ItemRenderer::renderItemBillboard(shared_ptr entity, Icon *icon for (int i = 0; i < count; i++) { glTranslatef(0, 0, width + margin); + + bool bIsTerrain = false; if (item->getIconType() == Icon::TYPE_TERRAIN && Tile::tiles[item->id] != NULL) { - bindTexture(TN_TERRAIN); // Was L"/terrain.png"); - } + bIsTerrain = true; + bindTexture(&TextureAtlas::LOCATION_BLOCKS); // TODO: Do this sanely by Icon + } else - { - bindTexture(TN_GUI_ITEMS); //L"/gui/items.png"); - } + { + bindTexture(&TextureAtlas::LOCATION_ITEMS); // TODO: Do this sanely by Icon + } + glColor4f(red, green, blue, 1); // 4J Stu - u coords were swapped in Java //ItemInHandRenderer::renderItem3D(t, u1, v0, u0, v1, icon->getSourceWidth(), icon->getSourceHeight(), width, false); - ItemInHandRenderer::renderItem3D(t, u0, v0, u1, v1, icon->getSourceWidth(), icon->getSourceHeight(), width, false); + ItemInHandRenderer::renderItem3D(t, u0, v0, u1, v1, icon->getSourceWidth(), icon->getSourceHeight(), width, false, bIsTerrain); if (item != NULL && item->isFoil()) { glDepthFunc(GL_EQUAL); glDisable(GL_LIGHTING); - entityRenderDispatcher->textures->bindTexture(TN__BLUR__MISC_GLINT); // was L"%blur%/misc/glint.png"); + entityRenderDispatcher->textures->bindTexture(&ItemInHandRenderer::ENCHANT_GLINT_LOCATION); glEnable(GL_BLEND); glBlendFunc(GL_SRC_COLOR, GL_ONE); float br = 0.76f; @@ -268,14 +296,14 @@ void ItemRenderer::renderItemBillboard(shared_ptr entity, Icon *icon glTranslatef(sx, 0, 0); glRotatef(-50, 0, 0, 1); - ItemInHandRenderer::renderItem3D(t, 0, 0, 1, 1, 255, 255, width, true); + ItemInHandRenderer::renderItem3D(t, 0, 0, 1, 1, 255, 255, width, true, bIsTerrain); glPopMatrix(); glPushMatrix(); glScalef(ss, ss, ss); sx = Minecraft::currentTimeMillis() % (3000 + 1873) / (3000 + 1873.0f) * 8; glTranslatef(-sx, 0, 0); glRotatef(10, 0, 0, 1); - ItemInHandRenderer::renderItem3D(t, 0, 0, 1, 1, 255, 255, width, true); + ItemInHandRenderer::renderItem3D(t, 0, 0, 1, 1, 255, 255, width, true, bIsTerrain); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glDisable(GL_BLEND); @@ -320,10 +348,6 @@ void ItemRenderer::renderGuiItem(Font *font, Textures *textures, shared_ptr item, float x, float y, float fScaleX,float fScaleY, float fAlpha, bool useCompiled) { @@ -335,7 +359,7 @@ void ItemRenderer::renderGuiItem(Font *font, Textures *textures, shared_ptrbindTexture(TN_TERRAIN);//L"/terrain.png")); + textures->bindTexture(&TextureAtlas::LOCATION_BLOCKS); MemSect(0); Tile *tile = Tile::tiles[itemId]; @@ -371,7 +395,9 @@ void ItemRenderer::renderGuiItem(Font *font, Textures *textures, shared_ptrbindTexture(TN_GUI_ITEMS); // "/gui/items.png" + + ResourceLocation *location = getTextureLocation(item->getIconType()); + textures->bindTexture(location); for (int layer = 0; layer <= 1; layer++) { @@ -403,11 +429,11 @@ void ItemRenderer::renderGuiItem(Font *font, Textures *textures, shared_ptrgetIconType() == Icon::TYPE_TERRAIN) { - textures->bindTexture(TN_TERRAIN);//L"/terrain.png")); + textures->bindTexture(&TextureAtlas::LOCATION_BLOCKS);//L"/terrain.png")); } else { - textures->bindTexture(TN_GUI_ITEMS);//L"/gui/items.png")); + textures->bindTexture(&TextureAtlas::LOCATION_ITEMS);//L"/gui/items.png")); #ifdef _XBOX // 4J - make sure we've got linear sampling on minification here as non-mipmapped things like this currently // default to having point sampling, which makes very small icons render rather badly @@ -475,7 +501,7 @@ void ItemRenderer::renderAndDecorateItem(Font *font, Textures *textures, const s glDepthFunc(GL_GREATER); glDisable(GL_LIGHTING); glDepthMask(false); - textures->bindTexture(TN__BLUR__MISC_GLINT); // 4J was "%blur%/misc/glint.png" + textures->bindTexture(&ItemInHandRenderer::ENCHANT_GLINT_LOCATION); // 4J was "%blur%/misc/glint.png" blitOffset -= 50; if( !isConstantBlended ) glEnable(GL_BLEND); @@ -572,9 +598,6 @@ void ItemRenderer::renderGuiItemDecorations(Font *font, Textures *textures, shar return; } - glEnable(GL_BLEND); - RenderManager.StateSetBlendFactor(0xffffff |(((unsigned int)(fAlpha * 0xff))<<24)); - glBlendFunc(GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA); if (item->count > 1 || !countText.empty() || item->GetForceNumberDisplay()) { MemSect(31); @@ -594,7 +617,7 @@ void ItemRenderer::renderGuiItemDecorations(Font *font, Textures *textures, shar MemSect(0); glDisable(GL_LIGHTING); glDisable(GL_DEPTH_TEST); - font->drawShadow(amount, x + 19 - 2 - font->width(amount), y + 6 + 3, 0xffffff); + font->drawShadow(amount, x + 19 - 2 - font->width(amount), y + 6 + 3, 0xffffff |(((unsigned int)(fAlpha * 0xff))<<24)); glEnable(GL_LIGHTING); glEnable(GL_DEPTH_TEST); } diff --git a/Minecraft.Client/ItemRenderer.h b/Minecraft.Client/ItemRenderer.h index 9690f77c..687b2491 100644 --- a/Minecraft.Client/ItemRenderer.h +++ b/Minecraft.Client/ItemRenderer.h @@ -19,6 +19,8 @@ public: ItemRenderer(); virtual ~ItemRenderer(); virtual void render(shared_ptr _itemEntity, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr entity); + virtual ResourceLocation *getTextureLocation(int iconType); private: virtual void renderItemBillboard(shared_ptr entity, Icon *icon, int count, float a, float red, float green, float blue); diff --git a/Minecraft.Client/ItemSpriteRenderer.cpp b/Minecraft.Client/ItemSpriteRenderer.cpp index 5a1ea620..5f1c7089 100644 --- a/Minecraft.Client/ItemSpriteRenderer.cpp +++ b/Minecraft.Client/ItemSpriteRenderer.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "ItemSpriteRenderer.h" #include "EntityRenderDispatcher.h" +#include "TextureAtlas.h" #include "..\Minecraft.World\net.minecraft.world.entity.projectile.h" #include "..\Minecraft.World\net.minecraft.world.item.alchemy.h" #include "..\Minecraft.World\net.minecraft.world.item.h" @@ -31,7 +32,7 @@ void ItemSpriteRenderer::render(shared_ptr e, double x, double y, double glTranslatef((float) x, (float) y, (float) z); glEnable(GL_RESCALE_NORMAL); glScalef(1 / 2.0f, 1 / 2.0f, 1 / 2.0f); - bindTexture(TN_GUI_ITEMS); // 4J - was L"/gui/items.png" + bindTexture(e); Tesselator *t = Tesselator::getInstance(); if (icon == PotionItem::getTexture(PotionItem::THROWABLE_ICON) ) @@ -76,4 +77,9 @@ void ItemSpriteRenderer::renderIcon(Tesselator *t, Icon *icon) t->vertexUV((float)(r - xo), (float)( r - yo), (float)( 0), (float)( u1), (float)( v0)); t->vertexUV((float)(0 - xo), (float)( r - yo), (float)( 0), (float)( u0), (float)( v0)); t->end(); +} + +ResourceLocation *ItemSpriteRenderer::getTextureLocation(shared_ptr mob) +{ + return &TextureAtlas::LOCATION_ITEMS; } \ No newline at end of file diff --git a/Minecraft.Client/ItemSpriteRenderer.h b/Minecraft.Client/ItemSpriteRenderer.h index e60feece..79499e94 100644 --- a/Minecraft.Client/ItemSpriteRenderer.h +++ b/Minecraft.Client/ItemSpriteRenderer.h @@ -12,6 +12,7 @@ public: ItemSpriteRenderer(Item *sourceItem, int sourceItemAuxValue = 0); //ItemSpriteRenderer(Item *icon); virtual void render(shared_ptr e, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); private: void renderIcon(Tesselator *t, Icon *icon); diff --git a/Minecraft.Client/LavaSlimeModel.cpp b/Minecraft.Client/LavaSlimeModel.cpp index 427b9547..052850f8 100644 --- a/Minecraft.Client/LavaSlimeModel.cpp +++ b/Minecraft.Client/LavaSlimeModel.cpp @@ -41,7 +41,7 @@ int LavaSlimeModel::getModelVersion() return 5; } -void LavaSlimeModel::prepareMobModel(shared_ptr mob, float time, float r, float a) +void LavaSlimeModel::prepareMobModel(shared_ptr mob, float time, float r, float a) { shared_ptr lavaSlime = dynamic_pointer_cast(mob); @@ -59,7 +59,7 @@ void LavaSlimeModel::prepareMobModel(shared_ptr mob, float time, float r, f void LavaSlimeModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) { - setupAnim(time, r, bob, yRot, xRot, scale); + setupAnim(time, r, bob, yRot, xRot, scale, entity); insideCube->render(scale, usecompiled); for (int i = 0; i < BODYCUBESLENGTH; i++) diff --git a/Minecraft.Client/LavaSlimeModel.h b/Minecraft.Client/LavaSlimeModel.h index 44bd1663..29e5e951 100644 --- a/Minecraft.Client/LavaSlimeModel.h +++ b/Minecraft.Client/LavaSlimeModel.h @@ -10,6 +10,6 @@ class LavaSlimeModel : public Model public: LavaSlimeModel(); int getModelVersion(); - virtual void prepareMobModel(shared_ptr mob, float time, float r, float a); + virtual void prepareMobModel(shared_ptr mob, float time, float r, float a); virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); }; diff --git a/Minecraft.Client/LavaSlimeRenderer.cpp b/Minecraft.Client/LavaSlimeRenderer.cpp index 3d2cbf47..e828a353 100644 --- a/Minecraft.Client/LavaSlimeRenderer.cpp +++ b/Minecraft.Client/LavaSlimeRenderer.cpp @@ -3,27 +3,19 @@ #include "LavaSlimeModel.h" #include "LavaSlimeRenderer.h" +ResourceLocation LavaSlimeRenderer::MAGMACUBE_LOCATION = ResourceLocation(TN_MOB_LAVA); + LavaSlimeRenderer::LavaSlimeRenderer() : MobRenderer(new LavaSlimeModel(), .25f) { this->modelVersion = ((LavaSlimeModel *) model)->getModelVersion(); } -void LavaSlimeRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) -{ - // 4J - original version used generics and thus had an input parameter of type LavaSlime rather than shared_ptr we have here - - // do some casting around instead - shared_ptr mob = dynamic_pointer_cast(_mob); - int modelVersion = ((LavaSlimeModel *) model)->getModelVersion(); - if (modelVersion != this->modelVersion) - { - this->modelVersion = modelVersion; - model = new LavaSlimeModel(); - app.DebugPrintf("new lava slime model\n"); - } - MobRenderer::render(mob, x, y, z, rot, a); +ResourceLocation *LavaSlimeRenderer::getTextureLocation(shared_ptr mob) +{ + return &MAGMACUBE_LOCATION; } -void LavaSlimeRenderer::scale(shared_ptr _slime, float a) +void LavaSlimeRenderer::scale(shared_ptr _slime, float a) { // 4J - original version used generics and thus had an input parameter of type LavaSlime rather than shared_ptr we have here - // do some casting around instead diff --git a/Minecraft.Client/LavaSlimeRenderer.h b/Minecraft.Client/LavaSlimeRenderer.h index b0c44d1e..1743c574 100644 --- a/Minecraft.Client/LavaSlimeRenderer.h +++ b/Minecraft.Client/LavaSlimeRenderer.h @@ -1,17 +1,16 @@ #pragma once - #include "MobRenderer.h" class LavaSlimeRenderer : public MobRenderer { private: int modelVersion; + static ResourceLocation MAGMACUBE_LOCATION; public: LavaSlimeRenderer(); - - virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); protected: - virtual void scale(shared_ptr _slime, float a); + virtual void scale(shared_ptr _slime, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/LeashKnotModel.cpp b/Minecraft.Client/LeashKnotModel.cpp new file mode 100644 index 00000000..3d909600 --- /dev/null +++ b/Minecraft.Client/LeashKnotModel.cpp @@ -0,0 +1,37 @@ +#include "stdafx.h"; +#include "LeashKnotModel.h" +#include "ModelPart.h" + +LeashKnotModel::LeashKnotModel() +{ + _init(0, 0, 32, 32); +} + +LeashKnotModel::LeashKnotModel(int u, int v, int tw, int th) +{ + _init(u, v, tw, th); +} + +void LeashKnotModel::_init(int u, int v, int tw, int th) +{ + texWidth = tw; + texHeight = th; + knot = new ModelPart(this, u, v); + knot->addBox(-3, -6, -3, 6, 8, 6, 0); + knot->setPos(0, 0, 0); +} + +void LeashKnotModel::render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled) +{ + setupAnim(time, r, bob, yRot, xRot, scale, entity); + + knot->render(scale, usecompiled); +} + +void LeashKnotModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) +{ + Model::setupAnim(time, r, bob, yRot, xRot, scale, entity); + + knot->yRot = yRot / (180 / PI); + knot->xRot = xRot / (180 / PI); +} \ No newline at end of file diff --git a/Minecraft.Client/LeashKnotModel.h b/Minecraft.Client/LeashKnotModel.h new file mode 100644 index 00000000..45ec1647 --- /dev/null +++ b/Minecraft.Client/LeashKnotModel.h @@ -0,0 +1,15 @@ +#pragma once +#include "Model.h" + +class LeashKnotModel : public Model +{ +public: + ModelPart *knot; + + LeashKnotModel(); + LeashKnotModel(int u, int v, int tw, int th); + void _init(int u, int v, int tw, int th); + + virtual void render(shared_ptr entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled); + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim=0); +}; \ No newline at end of file diff --git a/Minecraft.Client/LeashKnotRenderer.cpp b/Minecraft.Client/LeashKnotRenderer.cpp new file mode 100644 index 00000000..b210379f --- /dev/null +++ b/Minecraft.Client/LeashKnotRenderer.cpp @@ -0,0 +1,39 @@ +#include "stdafx.h" +#include "LeashKnotRenderer.h" +#include "LeashKnotModel.h" + +ResourceLocation LeashKnotRenderer::KNOT_LOCATION = ResourceLocation(TN_ITEM_LEASHKNOT); + +LeashKnotRenderer::LeashKnotRenderer() : EntityRenderer() +{ + model = new LeashKnotModel(); +} + +LeashKnotRenderer::~LeashKnotRenderer() +{ + delete model; +} + +void LeashKnotRenderer::render(shared_ptr entity, double x, double y, double z, float rot, float a) +{ + glPushMatrix(); + glDisable(GL_CULL_FACE); + + glTranslatef((float) x, (float) y, (float) z); + + float scale = 1 / 16.0f; + glEnable(GL_RESCALE_NORMAL); + glScalef(-1, -1, 1); + + glEnable(GL_ALPHA_TEST); + + bindTexture(entity); + model->render(entity, 0, 0, 0, 0, 0, scale, true); + + glPopMatrix(); +} + +ResourceLocation *LeashKnotRenderer::getTextureLocation(shared_ptr entity) +{ + return &KNOT_LOCATION; +} \ No newline at end of file diff --git a/Minecraft.Client/LeashKnotRenderer.h b/Minecraft.Client/LeashKnotRenderer.h new file mode 100644 index 00000000..6eeca574 --- /dev/null +++ b/Minecraft.Client/LeashKnotRenderer.h @@ -0,0 +1,19 @@ +#pragma once +#include "EntityRenderer.h" + +class LeashKnotModel; + +class LeashKnotRenderer : public EntityRenderer +{ +private: + static ResourceLocation KNOT_LOCATION; + LeashKnotModel *model; + +public: + LeashKnotRenderer(); + ~LeashKnotRenderer(); + virtual void render(shared_ptr entity, double x, double y, double z, float rot, float a); + +protected: + virtual ResourceLocation *getTextureLocation(shared_ptr entity); +}; \ No newline at end of file diff --git a/Minecraft.Client/LevelRenderer.cpp b/Minecraft.Client/LevelRenderer.cpp index 98360078..8216f1fe 100644 --- a/Minecraft.Client/LevelRenderer.cpp +++ b/Minecraft.Client/LevelRenderer.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "LevelRenderer.h" #include "Textures.h" +#include "TextureAtlas.h" #include "Tesselator.h" #include "Chunk.h" #include "EntityRenderDispatcher.h" @@ -36,6 +37,7 @@ #include "DripParticle.h" #include "EchantmentTableParticle.h" #include "DragonBreathParticle.h" +#include "FireworksParticles.h" #include "Lighting.h" #include "Options.h" #include "MultiPlayerChunkCache.h" @@ -60,6 +62,8 @@ #include "FrustumCuller.h" #include "..\Minecraft.World\BasicTypeContainers.h" +//#define DISABLE_SPU_CODE + #ifdef __PS3__ #include "PS3\SPU_Tasks\LevelRenderer_cull\LevelRenderer_cull.h" #include "PS3\SPU_Tasks\LevelRenderer_FindNearestChunk\LevelRenderer_FindNearestChunk.h" @@ -69,6 +73,12 @@ static LevelRenderer_cull_DataIn g_cullDataIn[4] __attribute__((__aligned__(16)) static LevelRenderer_FindNearestChunk_DataIn g_findNearestChunkDataIn __attribute__((__aligned__(16))); #endif +ResourceLocation LevelRenderer::MOON_LOCATION = ResourceLocation(TN_TERRAIN_MOON); +ResourceLocation LevelRenderer::MOON_PHASES_LOCATION = ResourceLocation(TN_TERRAIN_MOON_PHASES); +ResourceLocation LevelRenderer::SUN_LOCATION = ResourceLocation(TN_TERRAIN_SUN); +ResourceLocation LevelRenderer::CLOUDS_LOCATION = ResourceLocation(TN_ENVIRONMENT_CLOUDS); +ResourceLocation LevelRenderer::END_SKY_LOCATION = ResourceLocation(TN_MISC_TUNNEL); + const unsigned int HALO_RING_RADIUS = 100; #ifdef _LARGE_WORLDS @@ -173,8 +183,8 @@ LevelRenderer::LevelRenderer(Minecraft *mc, Textures *textures) glDepthMask(false); // 4J - added to get depth mask disabled within the command buffer float yy; int s = 64; - int d = (256 / s) + 2; - yy = (float) (16); + int d = 256 / s + 2; + yy = (float) 16; for (int xx = -s * d; xx <= s * d; xx += s) { for (int zz = -s * d; zz <= s * d; zz += s) @@ -191,7 +201,7 @@ LevelRenderer::LevelRenderer(Minecraft *mc, Textures *textures) darkList = starList + 2; glNewList(darkList, GL_COMPILE); - yy = -(float) (16); + yy = -(float) 16; t->begin(); for (int xx = -s * d; xx <= s * d; xx += s) { @@ -288,7 +298,7 @@ void LevelRenderer::renderStars() { double ___xo = 0; double ___yo = ((c & 2) - 1) * ss; - double ___zo = (((c + 1) & 2) - 1) * ss; + double ___zo = ((c + 1 & 2) - 1) * ss; double __xo = ___xo; double __yo = ___yo * zCos - ___zo * zSin; @@ -497,7 +507,7 @@ void LevelRenderer::renderEntities(Vec3 *cam, Culler *culler, float a) // 4J Stu - Set these up every time, even when not rendering as other things (like particle render) may depend on it for those frames. TileEntityRenderDispatcher::instance->prepare(level[playerIndex], textures, mc->font, mc->cameraTargetPlayer, a); - EntityRenderDispatcher::instance->prepare(level[playerIndex], textures, mc->font, mc->cameraTargetPlayer, mc->options, a); + EntityRenderDispatcher::instance->prepare(level[playerIndex], textures, mc->font, mc->cameraTargetPlayer, mc->crosshairPickMob, mc->options, a); if (noEntityRenderFrames > 0) { @@ -536,11 +546,24 @@ void LevelRenderer::renderEntities(Vec3 *cam, Culler *culler, float a) { shared_ptr entity = *it; //entities[i]; - if ((entity->shouldRender(cam) && (entity->noCulling || culler->isVisible(entity->bb)))) + bool shouldRender = (entity->shouldRender(cam) && (entity->noCulling || culler->isVisible(entity->bb))); + + // Render the mob if the mob's leash holder is within the culler + if ( !shouldRender && entity->instanceof(eTYPE_MOB) ) + { + shared_ptr mob = dynamic_pointer_cast(entity); + if ( mob->isLeashed() && (mob->getLeashHolder() != NULL) ) + { + shared_ptr leashHolder = mob->getLeashHolder(); + shouldRender = culler->isVisible(leashHolder->bb); + } + } + + if (shouldRender) { // 4J-PB - changing this to be per player //if (entity == mc->cameraTargetPlayer && !mc->options->thirdPersonView && !mc->cameraTargetPlayer->isSleeping()) continue; - shared_ptr localplayer = dynamic_pointer_cast(mc->cameraTargetPlayer); + shared_ptr localplayer = mc->cameraTargetPlayer->instanceof(eTYPE_LOCALPLAYER) ? dynamic_pointer_cast(mc->cameraTargetPlayer) : nullptr; if (localplayer && entity == mc->cameraTargetPlayer && !localplayer->ThirdPersonView() && !mc->cameraTargetPlayer->isSleeping()) continue; @@ -669,7 +692,7 @@ void LevelRenderer::resortChunks(int xc, int yc, int zc) LeaveCriticalSection(&m_csDirtyChunks); } -int LevelRenderer::render(shared_ptr player, int layer, double alpha, bool updateChunks) +int LevelRenderer::render(shared_ptr player, int layer, double alpha, bool updateChunks) { int playerIndex = mc->player->GetXboxPad(); @@ -741,7 +764,7 @@ int LevelRenderer::renderChunks(int from, int to, int layer, double alpha) #if 1 // 4J - cut down version, we're not using offsetted render lists, or a sorted chunk list, anymore mc->gameRenderer->turnOnLightLayer(alpha); // 4J - brought forward from 1.8.2 - shared_ptr player = mc->cameraTargetPlayer; + shared_ptr player = mc->cameraTargetPlayer; double xOff = player->xOld + (player->x - player->xOld) * alpha; double yOff = player->yOld + (player->y - player->yOld) * alpha; double zOff = player->zOld + (player->z - player->zOld) * alpha; @@ -941,7 +964,7 @@ void LevelRenderer::renderSky(float alpha) glDepthMask(false); - textures->bind(textures->loadTexture(TN_MISC_TUNNEL)); // 4J was L"/1_2_2/misc/tunnel.png" + textures->bindTexture(&END_SKY_LOCATION); // 4J was L"/1_2_2/misc/tunnel.png" Tesselator *t = Tesselator::getInstance(); t->setMipmapEnable(false); for (int i = 0; i < 6; i++) @@ -1071,7 +1094,7 @@ void LevelRenderer::renderSky(float alpha) float ss = 30; MemSect(31); - textures->bindTexture(TN_TERRAIN_SUN); // 4J was L"/terrain/sun.png" + textures->bindTexture(&SUN_LOCATION); MemSect(0); t->begin(); t->vertexUV((float)(-ss), (float)( 100), (float)( -ss), (float)( 0), (float)( 0)); @@ -1081,8 +1104,8 @@ void LevelRenderer::renderSky(float alpha) t->end(); ss = 20; - textures->bindTexture(TN_TERRAIN_MOON_PHASES); // 4J was L"/1_2_2/terrain/moon_phases.png" - int phase = level[playerIndex]->getMoonPhase(alpha); + textures->bindTexture(&MOON_PHASES_LOCATION); // 4J was L"/1_2_2/terrain/moon_phases.png" + int phase = level[playerIndex]->getMoonPhase(); int u = phase % 4; int v = phase / 4 % 2; float u0 = (u + 0) / 4.0f; @@ -1264,7 +1287,7 @@ void LevelRenderer::renderClouds(float alpha) int d = 256 / s; Tesselator *t = Tesselator::getInstance(); - textures->bindTexture(TN_ENVIRONMENT_CLOUDS); // 4J was L"/environment/clouds.png" + textures->bindTexture(&CLOUDS_LOCATION); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -1556,7 +1579,7 @@ void LevelRenderer::renderAdvancedClouds(float alpha) } MemSect(31); - textures->bindTexture(TN_ENVIRONMENT_CLOUDS); // 4J was L"/environment/clouds.png" + textures->bindTexture(&CLOUDS_LOCATION); // 4J was L"/environment/clouds.png" MemSect(0); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -1809,7 +1832,7 @@ bool LevelRenderer::updateDirtyChunks() static int throttle = 0; if( ( throttle % 100 ) == 0 ) { - app.DebugPrintf("CBuffSize: %d\n",memAlloc/(1024*1024)); + app.DebugPrintf("CBuffSize: %d\n",memAlloc/(1024*1024)); } throttle++; */ @@ -1919,7 +1942,7 @@ bool LevelRenderer::updateDirtyChunks() int py = (int)player->y; int pz = (int)player->z; -// app.DebugPrintf("!! %d %d %d, %d %d %d {%d,%d} ",px,py,pz,stackChunkDirty,nonStackChunkDirty,onlyRebuild, xChunks, zChunks); + // app.DebugPrintf("!! %d %d %d, %d %d %d {%d,%d} ",px,py,pz,stackChunkDirty,nonStackChunkDirty,onlyRebuild, xChunks, zChunks); int considered = 0; int wouldBeNearButEmpty = 0; @@ -2008,13 +2031,13 @@ bool LevelRenderer::updateDirtyChunks() } } } -// app.DebugPrintf("[%d,%d,%d]\n",nearestClipChunks.empty(),considered,wouldBeNearButEmpty); + // app.DebugPrintf("[%d,%d,%d]\n",nearestClipChunks.empty(),considered,wouldBeNearButEmpty); } #endif // __PS3__ PIXEndNamedEvent(); } - + Chunk *chunk = NULL; #ifdef _LARGE_WORLDS @@ -2160,7 +2183,6 @@ bool LevelRenderer::updateDirtyChunks() return false; } - void LevelRenderer::renderHit(shared_ptr player, HitResult *h, int mode, shared_ptr inventoryItem, float a) { Tesselator *t = Tesselator::getInstance(); @@ -2174,7 +2196,7 @@ void LevelRenderer::renderHit(shared_ptr player, HitResult *h, int mode, float br = (Mth::sin(Minecraft::currentTimeMillis() / 100.0f) * 0.2f + 0.8f); glColor4f(br, br, br, (Mth::sin(Minecraft::currentTimeMillis() / 200.0f) * 0.2f + 0.5f)); - textures->bindTexture(TN_TERRAIN); //L"/terrain.png"); + textures->bindTexture(&TextureAtlas::LOCATION_BLOCKS); } glDisable(GL_BLEND); glDisable(GL_ALPHA_TEST); @@ -2191,7 +2213,7 @@ void LevelRenderer::renderDestroyAnimation(Tesselator *t, shared_ptr pla { glBlendFunc(GL_DST_COLOR, GL_SRC_COLOR); - textures->bindTexture(TN_TERRAIN); // 4J was L"/terrain.png" + textures->bindTexture(&TextureAtlas::LOCATION_BLOCKS); glColor4f(1, 1, 1, 0.5f); glPushMatrix(); @@ -2224,7 +2246,7 @@ void LevelRenderer::renderDestroyAnimation(Tesselator *t, shared_ptr pla int iPad = mc->player->GetXboxPad(); // 4J added int tileId = level[iPad]->getTile(block->getX(), block->getY(), block->getZ()); Tile *tile = tileId > 0 ? Tile::tiles[tileId] : NULL; - if (tile == NULL) tile = Tile::rock; + if (tile == NULL) tile = Tile::stone; tileRenderer[iPad]->tesselateInWorldFixedTexture(tile, block->getX(), block->getY(), block->getZ(), breakingTextures[block->getProgress()]); // 4J renamed to differentiate from tesselateInWorld } ++it; @@ -2246,7 +2268,7 @@ void LevelRenderer::renderDestroyAnimation(Tesselator *t, shared_ptr pla } } -void LevelRenderer::renderHitOutline(shared_ptr player, HitResult *h, int mode, shared_ptr inventoryItem, float a) +void LevelRenderer::renderHitOutline(shared_ptr player, HitResult *h, int mode, float a) { if (mode == 0 && h->type == HitResult::TILE) @@ -2590,6 +2612,10 @@ void LevelRenderer::playSound(shared_ptr entity,int iSound, double x, do { } +void LevelRenderer::playSoundExceptPlayer(shared_ptr player, int iSound, double x, double y, double z, float volume, float pitch, float fSoundClipDist) +{ +} + // 4J-PB - original function. I've changed to an enum instead of string compares // 4J removed - /* @@ -2716,6 +2742,10 @@ shared_ptr LevelRenderer::addParticleInternal(ePARTICLE_TYPE eParticle case eParticleType_largeexplode: particle = shared_ptr(new HugeExplosionParticle(textures, lev, x, y, z, xa, ya, za)); break; + case eParticleType_fireworksspark: + particle = shared_ptr(new FireworksParticles::FireworksSparkParticle(lev, x, y, z, xa, ya, za, mc->particleEngine)); + particle->setAlpha(0.99f); + break; case eParticleType_bubble: particle = shared_ptr( new BubbleParticle(lev, x, y, z, xa, ya, za) ); @@ -2783,9 +2813,22 @@ shared_ptr LevelRenderer::addParticleInternal(ePARTICLE_TYPE eParticle particle = shared_ptr(new SpellParticle(lev, x, y, z, 0, 0, 0)); particle->setColor((float) xa, (float) ya, (float) za); break; + case eParticleType_mobSpellAmbient: + particle = shared_ptr(new SpellParticle(lev, x, y, z, 0, 0, 0)); + particle->setAlpha(0.15f); + particle->setColor((float) xa, (float) ya, (float) za); + break; case eParticleType_spell: particle = shared_ptr( new SpellParticle(lev, x, y, z, xa, ya, za) ); break; + case eParticleType_witchMagic: + { + particle = shared_ptr(new SpellParticle(lev, x, y, z, xa, ya, za)); + dynamic_pointer_cast(particle)->setBaseTex(9 * 16); + float randBrightness = lev->random->nextFloat() * 0.5f + 0.35f; + particle->setColor(1 * randBrightness, 0 * randBrightness, 1 * randBrightness); + } + break; case eParticleType_instantSpell: particle = shared_ptr(new SpellParticle(lev, x, y, z, xa, ya, za)); dynamic_pointer_cast(particle)->setBaseTex(9 * 16); @@ -2877,41 +2920,36 @@ shared_ptr LevelRenderer::addParticleInternal(ePARTICLE_TYPE eParticle void LevelRenderer::entityAdded(shared_ptr entity) { - entity->prepareCustomTextures(); - // 4J - these empty string comparisons used to check for NULL references, but we don't have string pointers (currently) in entities, - // hopefully this should be equivalent - /* 4J - removed temp */ - //if (entity->customTextureUrl != L"") textures->addHttpTexture(entity->customTextureUrl, new MobSkinTextureProcessor()); - //if (entity->customTextureUrl2 != L"") textures->addHttpTexture(entity->customTextureUrl2, new MobSkinTextureProcessor()); - - // 4J-PB - adding these from global title storage - if (entity->customTextureUrl != L"") + 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 +2974,49 @@ void LevelRenderer::clear() MemoryTracker::releaseLists(chunkLists); } +void LevelRenderer::globalLevelEvent(int type, int sourceX, int sourceY, int sourceZ, int data) +{ + Level *lev; + int playerIndex = mc->player->GetXboxPad(); // 4J added + lev = level[playerIndex]; + + Random *random = lev->random; + + switch (type) + { + case LevelEvent::SOUND_WITHER_BOSS_SPAWN: + case LevelEvent::SOUND_DRAGON_DEATH: + if (mc->cameraTargetPlayer != NULL) + { + // play the sound at an offset from the player + double dx = sourceX - mc->cameraTargetPlayer->x; + double dy = sourceY - mc->cameraTargetPlayer->y; + double dz = sourceZ - mc->cameraTargetPlayer->z; + + double len = sqrt(dx * dx + dy * dy + dz * dz); + double sx = mc->cameraTargetPlayer->x; + double sy = mc->cameraTargetPlayer->y; + double sz = mc->cameraTargetPlayer->z; + + if (len > 0) + { + sx += dx / len * 2; + sy += dy / len * 2; + sz += dz / len * 2; + } + if (type == LevelEvent::SOUND_WITHER_BOSS_SPAWN) + { + lev->playLocalSound(sx, sy, sz, eSoundType_MOB_WITHER_SPAWN, 1.0f, 1.0f, false); + } + else if (type == LevelEvent::SOUND_DRAGON_DEATH) + { + lev->playLocalSound(sx, sy, sz, eSoundType_MOB_ENDERDRAGON_END, 5.0f, 1.0f, false); + } + } + break; + } +} + void LevelRenderer::levelEvent(shared_ptr source, int type, int x, int y, int z, int data) { int playerIndex = mc->player->GetXboxPad(); // 4J added @@ -2968,13 +3049,13 @@ void LevelRenderer::levelEvent(shared_ptr source, int type, int x, int y break; case LevelEvent::SOUND_CLICK_FAIL: //level[playerIndex]->playSound(x, y, z, L"random.click", 1.0f, 1.2f); - level[playerIndex]->playLocalSound(x, y, z, eSoundType_RANDOM_CLICK, 1.0f, 1.2f); + level[playerIndex]->playLocalSound(x, y, z, eSoundType_RANDOM_CLICK, 1.0f, 1.2f, false); break; case LevelEvent::SOUND_CLICK: - level[playerIndex]->playLocalSound(x, y, z, eSoundType_RANDOM_CLICK, 1.0f, 1.0f); + level[playerIndex]->playLocalSound(x, y, z, eSoundType_RANDOM_CLICK, 1.0f, 1.0f, false); break; case LevelEvent::SOUND_LAUNCH: - level[playerIndex]->playLocalSound(x, y, z, eSoundType_RANDOM_BOW, 1.0f, 1.2f); + level[playerIndex]->playLocalSound(x, y, z, eSoundType_RANDOM_BOW, 1.0f, 1.2f, false); break; case LevelEvent::PARTICLES_SHOOT: { @@ -3021,7 +3102,7 @@ void LevelRenderer::levelEvent(shared_ptr source, int type, int x, int y double yp = y; double zp = z; - ePARTICLE_TYPE particle = PARTICLE_ICONCRACK(Item::potion->id,0); + ePARTICLE_TYPE particle = PARTICLE_ICONCRACK(Item::potion->id, data); for (int i = 0; i < 8; i++) { addParticle(particle, xp, yp, zp, random->nextGaussian() * 0.15, random->nextDouble() * 0.2, random->nextGaussian() * 0.15); @@ -3056,7 +3137,7 @@ void LevelRenderer::levelEvent(shared_ptr source, int type, int x, int y spellParticle->setPower((float) dist); } } - level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_RANDOM_GLASS, 1, level[playerIndex]->random->nextFloat() * 0.1f + 0.9f); + level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_RANDOM_GLASS, 1, level[playerIndex]->random->nextFloat() * 0.1f + 0.9f, false); } break; case LevelEvent::ENDERDRAGON_FIREBALL_SPLASH: @@ -3111,25 +3192,28 @@ void LevelRenderer::levelEvent(shared_ptr source, int type, int x, int y } break; } + case LevelEvent::PARTICLES_PLANT_GROWTH: + DyePowderItem::addGrowthParticles(level[playerIndex], x, y, z, data); + break; case LevelEvent::SOUND_OPEN_DOOR: if (Math::random() < 0.5) { - level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_RANDOM_DOOR_OPEN, 1.0f, level[playerIndex]->random->nextFloat() * 0.1f + 0.9f); + level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_RANDOM_DOOR_OPEN, 1.0f, level[playerIndex]->random->nextFloat() * 0.1f + 0.9f, false); } else { - level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_RANDOM_DOOR_CLOSE, 1.0f, level[playerIndex]->random->nextFloat() * 0.1f + 0.9f); + level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_RANDOM_DOOR_CLOSE, 1.0f, level[playerIndex]->random->nextFloat() * 0.1f + 0.9f, false); } break; case LevelEvent::SOUND_FIZZ: - level[playerIndex]->playLocalSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_RANDOM_FIZZ, 0.5f, 2.6f + (random->nextFloat() - random->nextFloat()) * 0.8f); + level[playerIndex]->playLocalSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_RANDOM_FIZZ, 0.5f, 2.6f + (random->nextFloat() - random->nextFloat()) * 0.8f, false); break; case LevelEvent::SOUND_ANVIL_BROKEN: - level[playerIndex]->playLocalSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_RANDOM_ANVIL_BREAK, 1.0f, level[playerIndex]->random->nextFloat() * 0.1f + 0.9f); + level[playerIndex]->playLocalSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_RANDOM_ANVIL_BREAK, 1.0f, level[playerIndex]->random->nextFloat() * 0.1f + 0.9f, false); break; case LevelEvent::SOUND_ANVIL_USED: - level[playerIndex]->playLocalSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_RANDOM_ANVIL_USE, 1.0f, level[playerIndex]->random->nextFloat() * 0.1f + 0.9f); + level[playerIndex]->playLocalSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_RANDOM_ANVIL_USE, 1.0f, level[playerIndex]->random->nextFloat() * 0.1f + 0.9f, false); break; case LevelEvent::SOUND_ANVIL_LAND: - level[playerIndex]->playLocalSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_RANDOM_ANVIL_LAND, 0.3f, level[playerIndex]->random->nextFloat() * 0.1f + 0.9f); + level[playerIndex]->playLocalSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_RANDOM_ANVIL_LAND, 0.3f, level[playerIndex]->random->nextFloat() * 0.1f + 0.9f, false); break; case LevelEvent::SOUND_PLAY_RECORDING: { @@ -3151,10 +3235,10 @@ void LevelRenderer::levelEvent(shared_ptr source, int type, int x, int y break; // 4J - new level event sounds brought forward from 1.2.3 case LevelEvent::SOUND_GHAST_WARNING: - level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_MOB_GHAST_CHARGE, 2.0f, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f, 80.0f); + level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_MOB_GHAST_CHARGE, 2.0f, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f, false, 80.0f); break; case LevelEvent::SOUND_GHAST_FIREBALL: - level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_MOB_GHAST_FIREBALL, 2.0f, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f, 80.0f); + level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_MOB_GHAST_FIREBALL, 2.0f, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f, false, 80.0f); break; case LevelEvent::SOUND_ZOMBIE_WOODEN_DOOR: level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_MOB_ZOMBIE_WOOD, 2.0f, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f); @@ -3165,6 +3249,12 @@ void LevelRenderer::levelEvent(shared_ptr source, int type, int x, int y case LevelEvent::SOUND_ZOMBIE_IRON_DOOR: level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_MOB_ZOMBIE_METAL, 2.0f, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f); break; + case LevelEvent::SOUND_BLAZE_FIREBALL: + level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_MOB_GHAST_FIREBALL, 2, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f);//, false); + break; + case LevelEvent::SOUND_WITHER_BOSS_SHOOT: + level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_MOB_WITHER_SHOOT, 2, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f);//, false); + break; case LevelEvent::SOUND_ZOMBIE_INFECTED: level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_MOB_ZOMBIE_INFECT, 2.0f, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f);//, false); break; @@ -3176,6 +3266,9 @@ void LevelRenderer::levelEvent(shared_ptr source, int type, int x, int y // 4J Added to show the paricles when the End egg teleports after being attacked EggTile::generateTeleportParticles(level[playerIndex],x,y,z,data); break; + case LevelEvent::SOUND_BAT_LIFTOFF: + level[playerIndex]->playLocalSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_MOB_BAT_TAKEOFF, .05f, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f); + break; } } @@ -3641,4 +3734,41 @@ int LevelRenderer::rebuildChunkThreadProc(LPVOID lpParam) void LevelRenderer::nonStackDirtyChunksAdded() { dirtyChunksLockFreeStack.Push((int *)1); -} \ No newline at end of file +} + +// 4J - for test purposes, check all chunks that are currently present for the player. Currently this is implemented to do tests to identify missing client chunks in flat worlds, but +// this could be extended to do other kinds of automated testing. Returns the number of chunks that are present, so that from the calling function we can determine when chunks have +// finished loading/generating round the current location. +int LevelRenderer::checkAllPresentChunks(bool *faultFound) +{ + int playerIndex = mc->player->GetXboxPad(); // 4J added + + int presentCount = 0; + ClipChunk *pClipChunk = chunks[playerIndex].data; + for( int i = 0; i < chunks[playerIndex].length; i++, pClipChunk++ ) + { + if(pClipChunk->chunk->y == 0 ) + { + bool chunkPresent = level[0]->reallyHasChunk(pClipChunk->chunk->x>>4,pClipChunk->chunk->z>>4); + if( chunkPresent ) + { + presentCount++; + LevelChunk *levelChunk = level[0]->getChunk(pClipChunk->chunk->x>>4,pClipChunk->chunk->z>>4); + + for( int cx = 4; cx <= 12; cx++ ) + { + for( int cz = 4; cz <= 12; cz++ ) + { + int t0 = levelChunk->getTile(cx, 0, cz); + if( ( t0 != Tile::unbreakable_Id ) && (t0 != Tile::dirt_Id) ) + { + *faultFound = true; + } + } + } + } + } + } + return presentCount; +} + diff --git a/Minecraft.Client/LevelRenderer.h b/Minecraft.Client/LevelRenderer.h index c0a98bba..46a4c31f 100644 --- a/Minecraft.Client/LevelRenderer.h +++ b/Minecraft.Client/LevelRenderer.h @@ -4,6 +4,7 @@ #include "OffsettedRenderList.h" #include "..\Minecraft.World\JavaIntHash.h" #include "..\Minecraft.World\Level.h" +#include "ResourceLocation.h" #include #ifdef __PS3__ #include "C4JSpursJob.h" @@ -35,6 +36,14 @@ using namespace std; class LevelRenderer : public LevelListener { friend class Chunk; + +private: + static ResourceLocation MOON_LOCATION; + static ResourceLocation MOON_PHASES_LOCATION; + static ResourceLocation SUN_LOCATION; + static ResourceLocation CLOUDS_LOCATION; + static ResourceLocation END_SKY_LOCATION; + public: static const int CHUNK_XZSIZE = 16; #ifdef _LARGE_WORLDS @@ -71,7 +80,7 @@ public: private: void resortChunks(int xc, int yc, int zc); public: - int render(shared_ptr player, int layer, double alpha, bool updateChunks); + int render(shared_ptr player, int layer, double alpha, bool updateChunks); private: int renderChunks(int from, int to, int layer, double alpha); public: @@ -89,7 +98,7 @@ public: public: void renderHit(shared_ptr player, HitResult *h, int mode, shared_ptr inventoryItem, float a); void renderDestroyAnimation(Tesselator *t, shared_ptr player, float a); - void renderHitOutline(shared_ptr player, HitResult *h, int mode, shared_ptr inventoryItem, float a); + void renderHitOutline(shared_ptr player, HitResult *h, int mode, float a); void render(AABB *b); void setDirty(int x0, int y0, int z0, int x1, int y1, int z1, Level *level); // 4J - added level param void tileChanged(int x, int y, int z); @@ -107,6 +116,7 @@ public: void playStreamingMusic(const wstring& name, int x, int y, int z); void playSound(int iSound, double x, double y, double z, float volume, float pitch, float fSoundClipDist=16.0f); void playSound(shared_ptr entity,int iSound, double x, double y, double z, float volume, float pitch, float fSoundClipDist=16.0f); + void playSoundExceptPlayer(shared_ptr player, int iSound, double x, double y, double z, float volume, float pitch, float fSoundClipDist=16.0f); void addParticle(ePARTICLE_TYPE eParticleType, double x, double y, double z, double xa, double ya, double za); // 4J added shared_ptr addParticleInternal(ePARTICLE_TYPE eParticleType, double x, double y, double z, double xa, double ya, double za); // 4J added void entityAdded(shared_ptr entity); @@ -114,6 +124,7 @@ public: void playerRemoved(shared_ptr entity) {} // 4J added - for when a player is removed from the level's player array, not just the entity storage void skyColorChanged(); void clear(); + void globalLevelEvent(int type, int sourceX, int sourceY, int sourceZ, int data); void levelEvent(shared_ptr source, int type, int x, int y, int z, int data); void destroyTileProgress(int id, int x, int y, int z, int progress); void registerTextures(IconRegister *iconRegister); @@ -274,4 +285,6 @@ public: CRITICAL_SECTION m_csChunkFlags; #endif void nonStackDirtyChunksAdded(); + + int checkAllPresentChunks(bool *faultFound); // 4J - added for testing }; diff --git a/Minecraft.Client/LivingEntityRenderer.cpp b/Minecraft.Client/LivingEntityRenderer.cpp new file mode 100644 index 00000000..89d65614 --- /dev/null +++ b/Minecraft.Client/LivingEntityRenderer.cpp @@ -0,0 +1,656 @@ +#include "stdafx.h" +#include "LivingEntityRenderer.h" +#include "Lighting.h" +#include "Cube.h" +#include "ModelPart.h" +#include "EntityRenderDispatcher.h" +#include "MultiPlayerLocalPlayer.h" +#include "..\Minecraft.World\Arrow.h" +#include "..\Minecraft.World\Mth.h" +#include "..\Minecraft.World\Player.h" + + +ResourceLocation LivingEntityRenderer::ENCHANT_GLINT_LOCATION = ResourceLocation(TN__BLUR__MISC_GLINT); +int LivingEntityRenderer::MAX_ARMOR_LAYERS = 4; + +LivingEntityRenderer::LivingEntityRenderer(Model *model, float shadow) +{ + this->model = model; + shadowRadius = shadow; + armor = NULL; +} + +void LivingEntityRenderer::setArmor(Model *armor) +{ + this->armor = armor; +} + +float LivingEntityRenderer::rotlerp(float from, float to, float a) +{ + float diff = to - from; + while (diff < -180) + diff += 360; + while (diff >= 180) + diff -= 360; + return from + a * diff; +} + +void LivingEntityRenderer::render(shared_ptr _mob, double x, double y, double z, float rot, float a) +{ + shared_ptr mob = dynamic_pointer_cast(_mob); + + glPushMatrix(); + glDisable(GL_CULL_FACE); + + model->attackTime = getAttackAnim(mob, a); + if (armor != NULL) armor->attackTime = model->attackTime; + model->riding = mob->isRiding(); + if (armor != NULL) armor->riding = model->riding; + model->young = mob->isBaby(); + if (armor != NULL) armor->young = model->young; + + /*try*/ + { + float bodyRot = rotlerp(mob->yBodyRotO, mob->yBodyRot, a); + float headRot = rotlerp(mob->yHeadRotO, mob->yHeadRot, a); + + if (mob->isRiding() && mob->riding->instanceof(eTYPE_LIVINGENTITY)) + { + shared_ptr riding = dynamic_pointer_cast(mob->riding); + bodyRot = rotlerp(riding->yBodyRotO, riding->yBodyRot, a); + + float headDiff = Mth::wrapDegrees(headRot - bodyRot); + if (headDiff < -85) headDiff = -85; + if (headDiff >= 85) headDiff = +85; + bodyRot = headRot - headDiff; + if (headDiff * headDiff > 50 * 50) + { + bodyRot += headDiff * 0.2f; + } + } + + float headRotx = (mob->xRotO + (mob->xRot - mob->xRotO) * a); + + setupPosition(mob, x, y, z); + + float bob = getBob(mob, a); + setupRotations(mob, bob, bodyRot, a); + + float fScale = 1 / 16.0f; + glEnable(GL_RESCALE_NORMAL); + glScalef(-1, -1, 1); + + scale(mob, a); + glTranslatef(0, -24 * fScale - 0.125f / 16.0f, 0); + + float ws = mob->walkAnimSpeedO + (mob->walkAnimSpeed - mob->walkAnimSpeedO) * a; + float wp = mob->walkAnimPos - mob->walkAnimSpeed * (1 - a); + if (mob->isBaby()) + { + wp *= 3.0f; + } + + if (ws > 1) ws = 1; + + glEnable(GL_ALPHA_TEST); + model->prepareMobModel(mob, wp, ws, a); + renderModel(mob, wp, ws, bob, headRot - bodyRot, headRotx, fScale); + + for (int i = 0; i < MAX_ARMOR_LAYERS; i++) + { + int armorType = prepareArmor(mob, i, a); + if (armorType > 0) + { + armor->prepareMobModel(mob, wp, ws, a); + armor->render(mob, wp, ws, bob, headRot - bodyRot, headRotx, fScale, true); + if ((armorType & 0xf0) == 16) + { + prepareSecondPassArmor(mob, i, a); + armor->render(mob, wp, ws, bob, headRot - bodyRot, headRotx, fScale, true); + } + // 4J - added condition here for rendering player as part of the gui. Avoiding rendering the glint here as it involves using its own blending, and for gui rendering + // we are globally blending to be able to offer user configurable gui opacity. Note that I really don't know why GL_BLEND is turned off at the end of the first + // armour layer anyway, or why alpha testing is turned on... but we definitely don't want to be turning blending off during the gui render. + if( !entityRenderDispatcher->isGuiRender ) + { + if ((armorType & 0xf) == 0xf) + { + float time = mob->tickCount + a; + bindTexture(&ENCHANT_GLINT_LOCATION); + glEnable(GL_BLEND); + float br = 0.5f; + glColor4f(br, br, br, 1); + glDepthFunc(GL_EQUAL); + glDepthMask(false); + + for (int j = 0; j < 2; j++) + { + glDisable(GL_LIGHTING); + float brr = 0.76f; + glColor4f(0.5f * brr, 0.25f * brr, 0.8f * brr, 1); + glBlendFunc(GL_SRC_COLOR, GL_ONE); + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + float uo = time * (0.001f + j * 0.003f) * 20; + float ss = 1 / 3.0f; + glScalef(ss, ss, ss); + glRotatef(30 - (j) * 60.0f, 0, 0, 1); + glTranslatef(0, uo, 0); + glMatrixMode(GL_MODELVIEW); + armor->render(mob, wp, ws, bob, headRot - bodyRot, headRotx, fScale, false); + } + + glColor4f(1, 1, 1, 1); + glMatrixMode(GL_TEXTURE); + glDepthMask(true); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + glEnable(GL_LIGHTING); + glDisable(GL_BLEND); + glDepthFunc(GL_LEQUAL); + + } + glDisable(GL_BLEND); + } + glEnable(GL_ALPHA_TEST); + } + } + glDepthMask(true); + + additionalRendering(mob, a); + float br = mob->getBrightness(a); + int overlayColor = getOverlayColor(mob, br, a); + glActiveTexture(GL_TEXTURE1); + glDisable(GL_TEXTURE_2D); + glActiveTexture(GL_TEXTURE0); + + if (((overlayColor >> 24) & 0xff) > 0 || mob->hurtTime > 0 || mob->deathTime > 0) + { + glDisable(GL_TEXTURE_2D); + glDisable(GL_ALPHA_TEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glDepthFunc(GL_EQUAL); + + // 4J - changed these renders to not use the compiled version of their models, because otherwise the render states set + // about (in particular the depth & alpha test) don't work with our command buffer versions + if (mob->hurtTime > 0 || mob->deathTime > 0) + { + glColor4f(br, 0, 0, 0.4f); + model->render(mob, wp, ws, bob, headRot - bodyRot, headRotx, fScale, false); + for (int i = 0; i < MAX_ARMOR_LAYERS; i++) + { + if (prepareArmorOverlay(mob, i, a) >= 0) + { + glColor4f(br, 0, 0, 0.4f); + armor->render(mob, wp, ws, bob, headRot - bodyRot, headRotx, fScale, false); + } + } + } + + if (((overlayColor >> 24) & 0xff) > 0) + { + float r = ((overlayColor >> 16) & 0xff) / 255.0f; + float g = ((overlayColor >> 8) & 0xff) / 255.0f; + float b = ((overlayColor) & 0xff) / 255.0f; + float aa = ((overlayColor >> 24) & 0xff) / 255.0f; + glColor4f(r, g, b, aa); + model->render(mob, wp, ws, bob, headRot - bodyRot, headRotx, fScale, false); + for (int i = 0; i < MAX_ARMOR_LAYERS; i++) + { + if (prepareArmorOverlay(mob, i, a) >= 0) + { + glColor4f(r, g, b, aa); + armor->render(mob, wp, ws, bob, headRot - bodyRot, headRotx, fScale, false); + } + } + } + + glDepthFunc(GL_LEQUAL); + glDisable(GL_BLEND); + glEnable(GL_ALPHA_TEST); + glEnable(GL_TEXTURE_2D); + } + glDisable(GL_RESCALE_NORMAL); + } + /* catch (Exception e) + { + e.printStackTrace(); + }*/ + + glActiveTexture(GL_TEXTURE1); + glEnable(GL_TEXTURE_2D); + glActiveTexture(GL_TEXTURE0); + glEnable(GL_CULL_FACE); + + glPopMatrix(); + + MemSect(31); + renderName(mob, x, y, z); + MemSect(0); +} + +void LivingEntityRenderer::renderModel(shared_ptr mob, float wp, float ws, float bob, float headRotMinusBodyRot, float headRotx, float scale) +{ + bindTexture(mob); + if (!mob->isInvisible()) + { + model->render(mob, wp, ws, bob, headRotMinusBodyRot, headRotx, scale, true); + } + else if(!mob->isInvisibleTo(dynamic_pointer_cast(Minecraft::GetInstance()->player))) + { + glPushMatrix(); + glColor4f(1, 1, 1, 0.15f); + glDepthMask(false); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glAlphaFunc(GL_GREATER, 1.0f / 255.0f); + model->render(mob, wp, ws, bob, headRotMinusBodyRot, headRotx, scale, true); + glDisable(GL_BLEND); + glAlphaFunc(GL_GREATER, .1f); + glPopMatrix(); + glDepthMask(true); + } + else + { + model->setupAnim(wp, ws, bob, headRotMinusBodyRot, headRotx, scale, mob); + } +} + +void LivingEntityRenderer::setupPosition(shared_ptr mob, double x, double y, double z) +{ + glTranslatef((float) x, (float) y, (float) z); +} + +void LivingEntityRenderer::setupRotations(shared_ptr mob, float bob, float bodyRot, float a) +{ + glRotatef(180 - bodyRot, 0, 1, 0); + if (mob->deathTime > 0) + { + float fall = (mob->deathTime + a - 1) / 20.0f * 1.6f; + fall = sqrt(fall); + if (fall > 1) fall = 1; + glRotatef(fall * getFlipDegrees(mob), 0, 0, 1); + } + else + { + wstring name = mob->getAName(); + if (name == L"Dinnerbone" || name == L"Grumm") + { + if ( !mob->instanceof(eTYPE_PLAYER) || !dynamic_pointer_cast(mob)->isCapeHidden() ) + { + glTranslatef(0, mob->bbHeight + 0.1f, 0); + glRotatef(180, 0, 0, 1); + } + } + } +} + +float LivingEntityRenderer::getAttackAnim(shared_ptr mob, float a) +{ + return mob->getAttackAnim(a); +} + +float LivingEntityRenderer::getBob(shared_ptr mob, float a) +{ + return (mob->tickCount + a); +} + +void LivingEntityRenderer::additionalRendering(shared_ptr mob, float a) +{ + +} + +void LivingEntityRenderer::renderArrows(shared_ptr mob, float a) +{ + int arrowCount = mob->getArrowCount(); + if (arrowCount > 0) + { + shared_ptr arrow = shared_ptr(new Arrow(mob->level, mob->x, mob->y, mob->z)); + Random random = Random(mob->entityId); + Lighting::turnOff(); + for (int i = 0; i < arrowCount; i++) + { + glPushMatrix(); + ModelPart *modelPart = model->getRandomModelPart(random); + Cube *cube = modelPart->cubes[random.nextInt(modelPart->cubes.size())]; + modelPart->translateTo(1 / 16.0f); + float xd = random.nextFloat(); + float yd = random.nextFloat(); + float zd = random.nextFloat(); + float xo = (cube->x0 + (cube->x1 - cube->x0) * xd) / 16.0f; + float yo = (cube->y0 + (cube->y1 - cube->y0) * yd) / 16.0f; + float zo = (cube->z0 + (cube->z1 - cube->z0) * zd) / 16.0f; + glTranslatef(xo, yo, zo); + xd = xd * 2 - 1; + yd = yd * 2 - 1; + zd = zd * 2 - 1; + if (true) + { + xd *= -1; + yd *= -1; + zd *= -1; + } + float sd = (float) sqrt(xd * xd + zd * zd); + arrow->yRotO = arrow->yRot = (float) (atan2(xd, zd) * 180 / PI); + arrow->xRotO = arrow->xRot = (float) (atan2(yd, sd) * 180 / PI); + double x = 0; + double y = 0; + double z = 0; + float yRot = 0; + entityRenderDispatcher->render(arrow, x, y, z, yRot, a); + glPopMatrix(); + } + Lighting::turnOn(); + } +} + +int LivingEntityRenderer::prepareArmorOverlay(shared_ptr mob, int layer, float a) +{ + return prepareArmor(mob, layer, a); +} + +int LivingEntityRenderer::prepareArmor(shared_ptr mob, int layer, float a) +{ + return -1; +} + +void LivingEntityRenderer::prepareSecondPassArmor(shared_ptr mob, int layer, float a) +{ +} + +float LivingEntityRenderer::getFlipDegrees(shared_ptr mob) +{ + return 90; +} + +int LivingEntityRenderer::getOverlayColor(shared_ptr mob, float br, float a) +{ + return 0; +} + +void LivingEntityRenderer::scale(shared_ptr mob, float a) +{ +} + +void LivingEntityRenderer::renderName(shared_ptr mob, double x, double y, double z) +{ + if (shouldShowName(mob) || Minecraft::renderDebug()) + { + float size = 1.60f; + float s = 1 / 60.0f * size; + double dist = mob->distanceToSqr(entityRenderDispatcher->cameraEntity); + + float maxDist = mob->isSneaking() ? 32 : 64; + + if (dist < maxDist * maxDist) + { + wstring msg = mob->getDisplayName(); + + if (!msg.empty()) + { + if (mob->isSneaking()) + { + if ( app.GetGameSettings(eGameSetting_DisplayHUD)==0 ) + { + // 4J-PB - turn off gamertag render + return; + } + + if(app.GetGameHostOption(eGameHostOption_Gamertags)==0) + { + // turn off gamertags if the host has set them off + return; + } + + Font *font = getFont(); + glPushMatrix(); + glTranslatef((float) x + 0, (float) y + mob->bbHeight + 0.5f, (float) z); + glNormal3f(0, 1, 0); + + glRotatef(-entityRenderDispatcher->playerRotY, 0, 1, 0); + glRotatef(entityRenderDispatcher->playerRotX, 1, 0, 0); + + glScalef(-s, -s, s); + glDisable(GL_LIGHTING); + + glTranslatef(0, 0.25f / s, 0); + glDepthMask(false); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + Tesselator *t = Tesselator::getInstance(); + + glDisable(GL_TEXTURE_2D); + t->begin(); + int w = font->width(msg) / 2; + t->color(0.f, 0.f, 0.f, 0.25f); + t->vertex(-w - 1, -1, 0); + t->vertex(-w - 1, +8, 0); + t->vertex(+w + 1, +8, 0); + t->vertex(+w + 1, -1, 0); + t->end(); + glEnable(GL_TEXTURE_2D); + glDepthMask(true); + font->draw(msg, -font->width(msg) / 2, 0, 0x20ffffff); + glEnable(GL_LIGHTING); + glDisable(GL_BLEND); + glColor4f(1, 1, 1, 1); + glPopMatrix(); + } + else + { + renderNameTags(mob, x, y, z, msg, s, dist); + } + } + } + } +} + +bool LivingEntityRenderer::shouldShowName(shared_ptr mob) +{ + return Minecraft::renderNames() && mob != entityRenderDispatcher->cameraEntity && !mob->isInvisibleTo(Minecraft::GetInstance()->player) && mob->rider.lock() == NULL; +} + +void LivingEntityRenderer::renderNameTags(shared_ptr mob, double x, double y, double z, const wstring &msg, float scale, double dist) +{ + if (mob->isSleeping()) + { + renderNameTag(mob, msg, x, y - 1.5f, z, 64); + } + else + { + renderNameTag(mob, msg, x, y, z, 64); + } +} + +// 4J Added parameter for color here so that we can colour players names +void LivingEntityRenderer::renderNameTag(shared_ptr mob, const wstring &name, double x, double y, double z, int maxDist, int color /*= 0xff000000*/) +{ + if ( app.GetGameSettings(eGameSetting_DisplayHUD)==0 ) + { + // 4J-PB - turn off gamertag render + return; + } + + if(app.GetGameHostOption(eGameHostOption_Gamertags)==0) + { + // turn off gamertags if the host has set them off + return; + } + + float dist = mob->distanceTo(entityRenderDispatcher->cameraEntity); + + if (dist > maxDist ) + { + return; + } + + Font *font = getFont(); + + float size = 1.60f; + float s = 1 / 60.0f * size; + + glPushMatrix(); + glTranslatef((float) x + 0, (float) y + 2.3f, (float) z); + glNormal3f(0, 1, 0); + + glRotatef(-this->entityRenderDispatcher->playerRotY, 0, 1, 0); + glRotatef(this->entityRenderDispatcher->playerRotX, 1, 0, 0); + + glScalef(-s, -s, s); + glDisable(GL_LIGHTING); + + // 4J Stu - If it's beyond readable distance, then just render a coloured box + int readableDist = PLAYER_NAME_READABLE_FULLSCREEN; + if( !RenderManager.IsHiDef() ) + { + readableDist = PLAYER_NAME_READABLE_DISTANCE_SD; + } + else if ( app.GetLocalPlayerCount() > 2 ) + { + readableDist = PLAYER_NAME_READABLE_DISTANCE_SPLITSCREEN; + } + + float textOpacity = 1.0f; + if( dist >= readableDist ) + { + int diff = dist - readableDist; + + textOpacity /= (diff/2); + + if( diff > readableDist ) textOpacity = 0.0f; + } + + if( textOpacity < 0.0f ) textOpacity = 0.0f; + if( textOpacity > 1.0f ) textOpacity = 1.0f; + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + Tesselator *t = Tesselator::getInstance(); + + int offs = 0; + + wstring playerName; + WCHAR wchName[2]; + + if(mob->instanceof(eTYPE_PLAYER)) + { + shared_ptr player = dynamic_pointer_cast(mob); + + if(app.isXuidDeadmau5( player->getXuid() ) ) offs = -10; + +#if defined(__PS3__) || defined(__ORBIS__) + // Check we have all the font characters for this player name + switch(player->GetPlayerNameValidState()) + { + case Player::ePlayerNameValid_NotSet: + if(font->AllCharactersValid(name)) + { + playerName=name; + player->SetPlayerNameValidState(true); + } + else + { + memset(wchName,0,sizeof(WCHAR)*2); + swprintf(wchName, 2, L"%d",player->getPlayerIndex()+1); + playerName=wchName; + player->SetPlayerNameValidState(false); + } + break; + case Player::ePlayerNameValid_True: + playerName=name; + break; + case Player::ePlayerNameValid_False: + memset(wchName,0,sizeof(WCHAR)*2); + swprintf(wchName, 2, L"%d",player->getPlayerIndex()+1); + playerName=wchName; + break; + } +#else + playerName = name; +#endif + } + else + { + playerName = name; + } + + if( textOpacity > 0.0f ) + { + glColor4f(1.0f,1.0f,1.0f,textOpacity); + + glDepthMask(false); + glDisable(GL_DEPTH_TEST); + + glDisable(GL_TEXTURE_2D); + + t->begin(); + int w = font->width(playerName) / 2; + + if( textOpacity < 1.0f ) + { + t->color(color, 255 * textOpacity); + } + else + { + t->color(0.0f, 0.0f, 0.0f, 0.25f); + } + t->vertex((float)(-w - 1), (float)( -1 + offs), (float)( 0)); + t->vertex((float)(-w - 1), (float)( +8 + offs + 1), (float)( 0)); + t->vertex((float)(+w + 1), (float)( +8 + offs + 1), (float)( 0)); + t->vertex((float)(+w + 1), (float)( -1 + offs), (float)( 0)); + t->end(); + + glEnable(GL_DEPTH_TEST); + glDepthMask(true); + glDepthFunc(GL_ALWAYS); + glLineWidth(2.0f); + t->begin(GL_LINE_STRIP); + t->color(color, 255 * textOpacity); + t->vertex((float)(-w - 1), (float)( -1 + offs), (float)( 0)); + t->vertex((float)(-w - 1), (float)( +8 + offs + 1), (float)( 0)); + t->vertex((float)(+w + 1), (float)( +8 + offs + 1), (float)( 0)); + t->vertex((float)(+w + 1), (float)( -1 + offs), (float)( 0)); + t->vertex((float)(-w - 1), (float)( -1 + offs), (float)( 0)); + t->end(); + glDepthFunc(GL_LEQUAL); + glDepthMask(false); + glDisable(GL_DEPTH_TEST); + + glEnable(GL_TEXTURE_2D); + font->draw(playerName, -font->width(playerName) / 2, offs, 0x20ffffff); + glEnable(GL_DEPTH_TEST); + + glDepthMask(true); + } + + if( textOpacity < 1.0f ) + { + glColor4f(1.0f,1.0f,1.0f,1.0f); + glDisable(GL_TEXTURE_2D); + glDepthFunc(GL_ALWAYS); + t->begin(); + int w = font->width(playerName) / 2; + t->color(color, 255); + t->vertex((float)(-w - 1), (float)( -1 + offs), (float)( 0)); + t->vertex((float)(-w - 1), (float)( +8 + offs), (float)( 0)); + t->vertex((float)(+w + 1), (float)( +8 + offs), (float)( 0)); + t->vertex((float)(+w + 1), (float)( -1 + offs), (float)( 0)); + t->end(); + glDepthFunc(GL_LEQUAL); + glEnable(GL_TEXTURE_2D); + + glTranslatef(0.0f, 0.0f, -0.04f); + } + + if( textOpacity > 0.0f ) + { + int textColor = ( ( (int)(textOpacity*255) << 24 ) | 0xffffff ); + font->draw(playerName, -font->width(playerName) / 2, offs, textColor); + } + + glEnable(GL_LIGHTING); + glDisable(GL_BLEND); + glColor4f(1, 1, 1, 1); + glPopMatrix(); +} \ No newline at end of file diff --git a/Minecraft.Client/LivingEntityRenderer.h b/Minecraft.Client/LivingEntityRenderer.h new file mode 100644 index 00000000..2f77e1b5 --- /dev/null +++ b/Minecraft.Client/LivingEntityRenderer.h @@ -0,0 +1,47 @@ +#pragma once +#include "ResourceLocation.h" +#include "EntityRenderer.h" +#include "..\Minecraft.World\LivingEntity.h" + +class LivingEntity; + +class LivingEntityRenderer : public EntityRenderer +{ + static const int PLAYER_NAME_READABLE_FULLSCREEN = 16; + static const int PLAYER_NAME_READABLE_DISTANCE_SPLITSCREEN = 8; + static const int PLAYER_NAME_READABLE_DISTANCE_SD = 8; + + static ResourceLocation ENCHANT_GLINT_LOCATION; + static int MAX_ARMOR_LAYERS; + +protected: + //Model *model; // 4J Stu - This shadows the one in EntityRenderer + Model *armor; + +public: + LivingEntityRenderer(Model *model, float shadow); + virtual void render(shared_ptr mob, double x, double y, double z, float rot, float a); + virtual void setArmor(Model *armor); + +private: + float rotlerp(float from, float to, float a); + +protected: + virtual void renderModel(shared_ptr mob, float wp, float ws, float bob, float headRotMinusBodyRot, float headRotx, float scale); + virtual void setupPosition(shared_ptr mob, double x, double y, double z); + virtual void setupRotations(shared_ptr mob, float bob, float bodyRot, float a); + virtual float getAttackAnim(shared_ptr mob, float a); + virtual float getBob(shared_ptr mob, float a); + virtual void additionalRendering(shared_ptr mob, float a); + virtual void renderArrows(shared_ptr mob, float a); + virtual int prepareArmorOverlay(shared_ptr mob, int layer, float a); + virtual int prepareArmor(shared_ptr mob, int layer, float a); + virtual void prepareSecondPassArmor(shared_ptr mob, int layer, float a); + virtual float getFlipDegrees(shared_ptr mob); + virtual int getOverlayColor(shared_ptr mob, float br, float a); + virtual void scale(shared_ptr mob, float a); + virtual void renderName(shared_ptr mob, double x, double y, double z); + virtual bool shouldShowName(shared_ptr mob); + virtual void renderNameTags(shared_ptr mob, double x, double y, double z, const wstring &msg, float scale, double dist); + virtual void renderNameTag(shared_ptr mob, const wstring &name, double x, double y, double z, int maxDist, int color = 0xff000000); +}; \ No newline at end of file diff --git a/Minecraft.Client/LocalPlayer.cpp b/Minecraft.Client/LocalPlayer.cpp index 97891046..bb25105f 100644 --- a/Minecraft.Client/LocalPlayer.cpp +++ b/Minecraft.Client/LocalPlayer.cpp @@ -16,18 +16,22 @@ #include "CreativeMode.h" #include "GameRenderer.h" #include "ItemInHandRenderer.h" +#include "..\Minecraft.World\AttributeInstance.h" #include "..\Minecraft.World\LevelData.h" #include "..\Minecraft.World\net.minecraft.world.damagesource.h" #include "..\Minecraft.World\net.minecraft.world.item.h" #include "..\Minecraft.World\net.minecraft.world.food.h" #include "..\Minecraft.World\net.minecraft.world.effect.h" #include "..\Minecraft.World\net.minecraft.world.entity.player.h" +#include "..\Minecraft.World\net.minecraft.world.entity.monster.h" #include "..\Minecraft.World\ItemEntity.h" #include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\net.minecraft.world.level.tile.entity.h" #include "..\Minecraft.World\net.minecraft.world.phys.h" #include "..\Minecraft.World\net.minecraft.stats.h" #include "..\Minecraft.World\com.mojang.nbt.h" #include "..\Minecraft.World\Random.h" +#include "..\Minecraft.World\TileEntity.h" #include "..\Minecraft.World\Mth.h" #include "AchievementPopup.h" #include "CritParticle.h" @@ -55,7 +59,7 @@ -LocalPlayer::LocalPlayer(Minecraft *minecraft, Level *level, User *user, int dimension) : Player(level) +LocalPlayer::LocalPlayer(Minecraft *minecraft, Level *level, User *user, int dimension) : Player(level, user->name) { flyX = flyY = flyZ = 0.0f; // 4J added m_awardedThisSession = 0; @@ -65,20 +69,23 @@ LocalPlayer::LocalPlayer(Minecraft *minecraft, Level *level, User *user, int dim twoJumpsRegistered = false; sprintTime = 0; m_uiInactiveTicks=0; + portalTime = 0.0f; + oPortalTime = 0.0f; + jumpRidingTicks = 0; + jumpRidingScale = 0.0f; yBob = xBob = yBobO = xBobO = 0.0f; - this->minecraft = minecraft; - this->dimension = dimension; + this->minecraft = minecraft; + this->dimension = dimension; - if (user != NULL && user->name.length() > 0) + if (user != NULL && user->name.length() > 0) { - customTextureUrl = L"http://s3.amazonaws.com/MinecraftSkins/" + user->name + L".png"; - } + customTextureUrl = L"http://s3.amazonaws.com/MinecraftSkins/" + user->name + L".png"; + } if( user != NULL ) { this->name = user->name; - m_UUID = name; //wprintf(L"Created LocalPlayer with name %ls\n", name.c_str() ); // check to see if this player's xuid is in the list of special players MOJANG_DATA *pMojangData=app.GetMojangDataForXuid(getOnlineXuid()); @@ -121,50 +128,20 @@ LocalPlayer::~LocalPlayer() delete input; } -// 4J - added noEntityCubes parameter -void LocalPlayer::move(double xa, double ya, double za, bool noEntityCubes) -{ - if (ClientConstants::DEADMAU5_CAMERA_CHEATS) - { - if (shared_from_this() == minecraft->player && minecraft->options->isFlying) - { - noPhysics = true; - float tmp = walkDist; // update - calculateFlight((float) xa, (float) ya, (float) za); - fallDistance = 0.0f; - yd = 0.0f; - Player::move(flyX, flyY, flyZ, noEntityCubes); - onGround = true; - walkDist = tmp; - } - else - { - noPhysics = false; - Player::move(xa, ya, za, noEntityCubes); - } - } - else - { - Player::move(xa, ya, za, noEntityCubes); - } - -} - void LocalPlayer::calculateFlight(float xa, float ya, float za) { - xa = xa * minecraft->options->flySpeed; - ya = 0; - za = za * minecraft->options->flySpeed; - - flyX = smoothFlyX.getNewDeltaValue(xa, .35f * minecraft->options->sensitivity); - flyY = smoothFlyY.getNewDeltaValue(ya, .35f * minecraft->options->sensitivity); - flyZ = smoothFlyZ.getNewDeltaValue(za, .35f * minecraft->options->sensitivity); + xa = xa * minecraft->options->flySpeed; + ya = 0; + za = za * minecraft->options->flySpeed; + flyX = smoothFlyX.getNewDeltaValue(xa, .35f * minecraft->options->sensitivity); + flyY = smoothFlyY.getNewDeltaValue(ya, .35f * minecraft->options->sensitivity); + flyZ = smoothFlyZ.getNewDeltaValue(za, .35f * minecraft->options->sensitivity); } void LocalPlayer::serverAiStep() { - Player::serverAiStep(); + Player::serverAiStep(); if( abilities.flying && abilities.mayfly ) { @@ -199,7 +176,7 @@ void LocalPlayer::serverAiStep() this->xxa = input->xa; this->yya = input->ya; } - this->jumping = input->jumping; + this->jumping = input->jumping; yBobO = yBob; xBobO = xBob; @@ -211,7 +188,7 @@ void LocalPlayer::serverAiStep() // mapPlayerChunk(8); } -bool LocalPlayer::isEffectiveAI() +bool LocalPlayer::isEffectiveAi() { return true; } @@ -237,26 +214,26 @@ void LocalPlayer::aiStep() y = 68.5; return; } - oPortalTime = portalTime; - if (isInsidePortal) + oPortalTime = portalTime; + if (isInsidePortal) { - if (!level->isClientSide) + if (!level->isClientSide) { - if (riding != NULL) this->ride(nullptr); - } - if (minecraft->screen != NULL) minecraft->setScreen(NULL); + if (riding != NULL) this->ride(nullptr); + } + if (minecraft->screen != NULL) minecraft->setScreen(NULL); - if (portalTime == 0) + if (portalTime == 0) { - minecraft->soundEngine->playUI(eSoundType_PORTAL_TRIGGER, 1, random->nextFloat() * 0.4f + 0.8f); - } - portalTime += 1 / 80.0f; - if (portalTime >= 1) + minecraft->soundEngine->playUI(eSoundType_PORTAL_TRIGGER, 1, random->nextFloat() * 0.4f + 0.8f); + } + portalTime += 1 / 80.0f; + if (portalTime >= 1) { - portalTime = 1; - } - isInsidePortal = false; - } + portalTime = 1; + } + isInsidePortal = false; + } else if (hasEffect(MobEffect::confusion) && getEffect(MobEffect::confusion)->getDuration() > (SharedConstants::TICKS_PER_SECOND * 3)) { portalTime += 1 / 150.0f; @@ -267,11 +244,11 @@ void LocalPlayer::aiStep() } else { - if (portalTime > 0) portalTime -= 1 / 20.0f; - if (portalTime < 0) portalTime = 0; - } + if (portalTime > 0) portalTime -= 1 / 20.0f; + if (portalTime < 0) portalTime = 0; + } - if (changingDimensionDelay > 0) changingDimensionDelay--; + if (changingDimensionDelay > 0) changingDimensionDelay--; bool wasJumping = input->jumping; float runTreshold = 0.8f; float sprintForward = input->sprintForward; @@ -281,22 +258,22 @@ void LocalPlayer::aiStep() // 4J-PB - make it a localplayer input->tick( this ); sprintForward = input->sprintForward; - if (isUsingItem()) + if (isUsingItem() && !isRiding()) { input->xa *= 0.2f; input->ya *= 0.2f; sprintTriggerTime = 0; } - // this.heightOffset = input.sneaking?1.30f:1.62f; // 4J - this was already commented out - if (input->sneaking) // 4J - removed - TODO replace + // this.heightOffset = input.sneaking?1.30f:1.62f; // 4J - this was already commented out + if (input->sneaking) // 4J - removed - TODO replace { - if (ySlideOffset < 0.2f) ySlideOffset = 0.2f; - } + if (ySlideOffset < 0.2f) ySlideOffset = 0.2f; + } - checkInTile(x - bbWidth * 0.35, bb->y0 + 0.5, z + bbWidth * 0.35); - checkInTile(x - bbWidth * 0.35, bb->y0 + 0.5, z - bbWidth * 0.35); - checkInTile(x + bbWidth * 0.35, bb->y0 + 0.5, z - bbWidth * 0.35); - checkInTile(x + bbWidth * 0.35, bb->y0 + 0.5, z + bbWidth * 0.35); + checkInTile(x - bbWidth * 0.35, bb->y0 + 0.5, z + bbWidth * 0.35); + checkInTile(x - bbWidth * 0.35, bb->y0 + 0.5, z - bbWidth * 0.35); + checkInTile(x + bbWidth * 0.35, bb->y0 + 0.5, z - bbWidth * 0.35); + checkInTile(x + bbWidth * 0.35, bb->y0 + 0.5, z + bbWidth * 0.35); bool enoughFoodToSprint = getFoodData()->getFoodLevel() > FoodConstants::MAX_FOOD * FoodConstants::FOOD_SATURATION_LOW; @@ -427,7 +404,49 @@ void LocalPlayer::aiStep() } } - Player::aiStep(); + if (isRidingJumpable()) + { + if (jumpRidingTicks < 0) + { + jumpRidingTicks++; + if (jumpRidingTicks == 0) + { + // reset scale (for gui) + jumpRidingScale = 0; + } + } + if (wasJumping && !input->jumping) + { + // jump release + jumpRidingTicks = -10; + sendRidingJump(); + } + else if (!wasJumping && input->jumping) + { + // jump press + jumpRidingTicks = 0; + jumpRidingScale = 0; + } + else if (wasJumping) + { + // calc jump scale + jumpRidingTicks++; + if (jumpRidingTicks < 10) + { + jumpRidingScale = (float) jumpRidingTicks * .1f; + } + else + { + jumpRidingScale = .8f + (2.f / ((float) (jumpRidingTicks - 9))) * .1f; + } + } + } + else + { + jumpRidingScale = 0; + } + + Player::aiStep(); // 4J-PB - If we're in Creative Mode, allow flying on ground if(!abilities.mayfly && !isAllowedToFly() ) @@ -494,7 +513,7 @@ void LocalPlayer::aiStep() fallDistance = 0.0f; yd = 0.0f; onGround = true; - } + } // Check if the player is idle and the rich presence needs updated if( !m_bIsIdle && InputManager.GetIdleSeconds( m_iPad ) > PLAYER_IDLE_TIME ) @@ -561,7 +580,9 @@ float LocalPlayer::getFieldOfViewModifier() // modify for movement if (abilities.flying) targetFov *= 1.1f; - targetFov *= ((walkingSpeed * getWalkingSpeedModifier()) / defaultWalkSpeed + 1) / 2; + + AttributeInstance *speed = getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED); + targetFov *= (speed->getValue() / abilities.getWalkingSpeed() + 1) / 2; // modify for bow =) if (isUsingItem() && getUseItem()->id == Item::bow->id) @@ -584,20 +605,20 @@ float LocalPlayer::getFieldOfViewModifier() void LocalPlayer::addAdditonalSaveData(CompoundTag *entityTag) { - Player::addAdditonalSaveData(entityTag); - entityTag->putInt(L"Score", score); + Player::addAdditonalSaveData(entityTag); + //entityTag->putInt(L"Score", score); } void LocalPlayer::readAdditionalSaveData(CompoundTag *entityTag) { - Player::readAdditionalSaveData(entityTag); - score = entityTag->getInt(L"Score"); + Player::readAdditionalSaveData(entityTag); + //score = entityTag->getInt(L"Score"); } void LocalPlayer::closeContainer() { - Player::closeContainer(); - minecraft->setScreen(NULL); + Player::closeContainer(); + minecraft->setScreen(NULL); // 4J - Close any xui here // Fix for #9164 - CRASH: MP: Title crashes upon opening a chest and having another user destroy it. @@ -605,9 +626,19 @@ void LocalPlayer::closeContainer() ui.CloseUIScenes( m_iPad ); } -void LocalPlayer::openTextEdit(shared_ptr sign) +void LocalPlayer::openTextEdit(shared_ptr tileEntity) { - bool success = app.LoadSignEntryMenu(GetXboxPad(), sign ); + bool success; + + if (tileEntity->GetType() == eTYPE_SIGNTILEENTITY) + { + success = app.LoadSignEntryMenu(GetXboxPad(), dynamic_pointer_cast(tileEntity)); + } + else if (tileEntity->GetType() == eTYPE_COMMANDBLOCKTILEENTITY) + { + success = app.LoadCommandBlockMenu(GetXboxPad(), dynamic_pointer_cast(tileEntity)); + } + if( success ) ui.PlayUISFX(eSFX_Press); //minecraft->setScreen(new TextEditScreen(sign)); } @@ -620,6 +651,30 @@ bool LocalPlayer::openContainer(shared_ptr container) return success; } +bool LocalPlayer::openHopper(shared_ptr container) +{ + //minecraft->setScreen(new HopperScreen(inventory, container)); + bool success = app.LoadHopperMenu(GetXboxPad(), inventory, container ); + if( success ) ui.PlayUISFX(eSFX_Press); + return success; +} + +bool LocalPlayer::openHopper(shared_ptr container) +{ + //minecraft->setScreen(new HopperScreen(inventory, container)); + bool success = app.LoadHopperMenu(GetXboxPad(), inventory, container ); + if( success ) ui.PlayUISFX(eSFX_Press); + return success; +} + +bool LocalPlayer::openHorseInventory(shared_ptr horse, shared_ptr container) +{ + //minecraft->setScreen(new HorseInventoryScreen(inventory, container, horse)); + bool success = app.LoadHorseMenu(GetXboxPad(), inventory, container, horse); + if( success ) ui.PlayUISFX(eSFX_Press); + return success; +} + bool LocalPlayer::startCrafting(int x, int y, int z) { bool success = app.LoadCrafting3x3Menu(GetXboxPad(), dynamic_pointer_cast( shared_from_this() ), x, y, z ); @@ -629,9 +684,16 @@ bool LocalPlayer::startCrafting(int x, int y, int z) return success; } -bool LocalPlayer::startEnchanting(int x, int y, int z) +bool LocalPlayer::openFireworks(int x, int y, int z) { - bool success = app.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 607d158c..6a51baa4 100644 --- a/Minecraft.Client/Minecraft.Client.vcxproj +++ b/Minecraft.Client/Minecraft.Client.vcxproj @@ -17,6 +17,10 @@ ContentPackage_NO_TU PSVita + + ContentPackage_NO_TU + Win32 + ContentPackage_NO_TU x64 @@ -41,6 +45,10 @@ CONTENTPACKAGE_SYMBOLS PSVita + + CONTENTPACKAGE_SYMBOLS + Win32 + CONTENTPACKAGE_SYMBOLS x64 @@ -65,6 +73,10 @@ ContentPackage_Vita PSVita + + ContentPackage_Vita + Win32 + ContentPackage_Vita x64 @@ -89,6 +101,10 @@ ContentPackage PSVita + + ContentPackage + Win32 + ContentPackage x64 @@ -113,6 +129,10 @@ Debug PSVita + + Debug + Win32 + Debug x64 @@ -137,6 +157,10 @@ ReleaseForArt PSVita + + ReleaseForArt + Win32 + ReleaseForArt x64 @@ -161,6 +185,10 @@ Release PSVita + + Release + Win32 + Release x64 @@ -179,7 +207,6 @@ SAK Xbox360Proj title - 10.0 @@ -234,7 +261,11 @@ Application MultiByte v143 - 10.0 + + + Application + MultiByte + v143 Application @@ -246,13 +277,22 @@ Application MultiByte v143 - 10.0 + + + Application + MultiByte + v143 Application MultiByte v143 + + Application + MultiByte + v143 + Application Unicode @@ -340,24 +380,48 @@ true v143 + + Application + MultiByte + true + v143 + Application MultiByte true v143 + + Application + MultiByte + true + v143 + Application MultiByte true v143 + + Application + MultiByte + true + v143 + Application MultiByte true v143 + + Application + MultiByte + true + v143 + Application Unicode @@ -386,7 +450,7 @@ Application MultiByte true - v110 + v143 Clang @@ -411,6 +475,7 @@ + @@ -442,15 +507,24 @@ + + + + + + + + + @@ -496,15 +570,27 @@ + + + + + + + + + + + + @@ -545,7 +631,7 @@ true $(OutDir)$(ProjectName)_D.xex - $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(MINECRAFT_CONSOLES_DIR)\Minecraft.Client\PSVita\Assert;$(ProjectDir);$(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras + $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(ProjectDir)\..\Minecraft.Client\PSVita\Assert;$(ProjectDir);$(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras false @@ -561,7 +647,7 @@ true $(OutDir)$(ProjectName)_D.xex - $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(MINECRAFT_CONSOLES_DIR)\Minecraft.Client\PSVita\Assert;$(ProjectDir);$(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras + $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(ProjectDir)..\Minecraft.Client\PSVita\Assert;$(ProjectDir);$(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras true @@ -573,6 +659,11 @@ $(OutDir)$(ProjectName)_D.xex $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + true + $(OutDir)$(ProjectName)_D.xex + $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + true $(OutDir)$(ProjectName)_D.xex @@ -594,11 +685,21 @@ $(OutDir)$(ProjectName)_D.xex $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + true + $(OutDir)$(ProjectName)_D.xex + $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + true $(OutDir)$(ProjectName)_D.xex $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + true + $(OutDir)$(ProjectName)_D.xex + $(ProjectDir)\..\Minecraft.World\x64headers;$(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + true $(OutDir)$(ProjectName)_D.xex @@ -657,7 +758,7 @@ true $(OutDir)$(ProjectName)_D.xex - $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(MINECRAFT_CONSOLES_DIR)\Minecraft.Client\PSVita\Assert;$(ProjectDir);$(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras + $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(ProjectDir)..\Minecraft.Client\PSVita\Assert;$(ProjectDir);$(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras false @@ -684,7 +785,7 @@ false $(OutDir)default$(TargetExt) $(OutDir)default.xex - $(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras + $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(ProjectDir)\..\Minecraft.Client\PSVita\Assert;$(ProjectDir);$(ProjectDir)..\Minecraft.World\x64headers;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras .self @@ -705,24 +806,48 @@ $(OutDir)default.xex $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + false $(OutDir)default$(TargetExt) $(OutDir)default.xex $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + false $(OutDir)default$(TargetExt) $(OutDir)default.xex $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + false $(OutDir)default$(TargetExt) $(OutDir)default.xex $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + + false + $(OutDir)default$(TargetExt) + $(OutDir)default.xex + $(ProjectDir)\Xbox\Sentient\Include;$(IncludePath) + false $(OutDir)default$(TargetExt) @@ -1276,6 +1401,52 @@ 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 + + + true + $(OutDir)$(ProjectName).pdb + d3d11.lib;Shcore.lib;..\Minecraft.World\x64_Debug\Minecraft.World.lib;%(AdditionalDependencies);XInput9_1_0.lib;..\Minecraft.Client\Windows64\Miles\Lib\mss64.lib;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,7 +1470,6 @@ if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" d3d11.lib;Shcore.lib;..\Minecraft.World\x64_Debug\Minecraft.World.lib;%(AdditionalDependencies);XInput9_1_0.lib;..\Minecraft.Client\Windows64\Miles\Lib\mss64.lib NotSet false - MultiplyDefinedSymbolOnly Run postbuild script @@ -1330,7 +1500,7 @@ if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" 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 @@ -1381,11 +1551,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 @@ -1429,7 +1600,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true $(OutDir)$(ProjectName).pdb - d3d11.lib;Shcore.lib;..\Minecraft.World\x64_Release\Minecraft.World.lib;XInput9_1_0.lib;Windows64\Iggy\lib\iggy_w64.lib;%(AdditionalDependencies) + 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 @@ -1452,6 +1623,47 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU$(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp + + + Use + Level3 + ProgramDatabase + Full + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) + Disabled + Windows64\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + true + true + Default + false + Speed + + + true + $(OutDir)$(ProjectName).pdb + d3d11.lib;Shcore.lib;..\Minecraft.World\x64_Release\Minecraft.World.lib;XInput9_1_0.lib;Windows64\Iggy\lib\iggy_w64.lib;%(AdditionalDependencies) + NotSet + false + + + $(ProjectDir)xbox\xex-dev.xml + + + 1480659447 + + + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + true + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp + + Use @@ -1493,6 +1705,47 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU$(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp + + + Use + Level3 + ProgramDatabase + Full + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) + Disabled + Windows64\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + true + true + Default + false + Speed + + + true + $(OutDir)$(ProjectName).pdb + d3d11.lib;Shcore.lib;..\Minecraft.World\x64_Release\Minecraft.World.lib;XInput9_1_0.lib;Windows64\Iggy\lib\iggy_w64.lib;%(AdditionalDependencies) + NotSet + false + + + $(ProjectDir)xbox\xex-dev.xml + + + 1480659447 + + + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + true + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech;$(RemoteRoot)=Xbox\XZP\TMSFiles.xzp + + Use @@ -1555,11 +1808,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 @@ -2088,18 +2342,19 @@ if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" false $(OutDir)$(ProjectName).pch MultiThreaded - _EXTENDED_ACHIEVEMENTS;_RELEASE_FOR_ART;_DEBUG_MENUS_ENABLED;_ITERATOR_DEBUG_LEVEL=0;_SECURE_SCL=0;__PSVITA__;%(PreprocessorDefinitions) + _EXTENDED_ACHIEVEMENTS;_DEBUG_MENUS_ENABLED;_ITERATOR_DEBUG_LEVEL=0;_SECURE_SCL=0;__PSVITA__;%(PreprocessorDefinitions) true true Disabled Default 1700;613;1011 -Xpch_override=1 %(AdditionalOptions) - PS3\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) - Level2 - false + PSVita\Iggy\include;$(ProjectDir);%(AdditionalIncludeDirectories) + Level3 + true Branchless2 Cpp11 + true true @@ -2107,7 +2362,7 @@ if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" false $(OutDir)default.pdb true - $(OutDir)Minecraft.World.a + -lSceDbg_stub;-lSceGxm_stub;-lSceAppUtil_stub;-lSceCommonDialog_stub;-lSceDisplay_stub;-lSceTouch_stub;-lSceCtrl_stub;-lSceAudio_stub;-lSceDbgFont;-lSceRazorCapture_stub_weak;-lSceSysmodule_stub;-lSceDeflt;-lScePng;$(OutDir)Minecraft.World.a;libSceRtc_stub.a;libSceFios2_stub_weak.a;libSceCes.a;libScePerf_stub.a;libScePerf_stub_weak.a;libSceUlt_stub.a;libSceUlt_stub_weak.a;libSceNpManager_stub_weak.a;libSceNpCommon_stub_weak.a;libSceHttp_stub.a;libSceNpTrophy_stub.a;libSceNpScore_stub.a;libSceRudp_stub_weak.a;libSceVoice_stub.a;libSceNetAdhocMatching_stub.a;libScePspnetAdhoc_stub.a;libScePower_stub.a;libSceAppUtil_stub.a;libSceAppMgr_stub.a;..\Minecraft.Client\PSVita\Miles\lib\msspsp2.a;..\Minecraft.Client\PSVita\Miles\lib\binkapsp2.a;..\Minecraft.Client\PSVita\Miles\lib\msspsp2midi.a;..\Minecraft.Client\PSVita\Miles\lib\fltpsp2.a;..\Minecraft.Client\Common\Network\Sony\sceRemoteStorage\psvita\lib\sceRemoteStorage.a xapilib.lib false false @@ -2115,6 +2370,7 @@ if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" None --strip-duplicates StripFuncsAndData + StripSymsAndDebug $(ProjectDir)xbox\xex.xml @@ -2254,6 +2510,46 @@ if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); + true + true + Disabled + Default + + + true + true + false + $(OutDir)default.pdb + true + xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) + xapilib.lib + false + false + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + Level3 @@ -2294,6 +2590,46 @@ if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_CONTENT_PACKAGE;%(PreprocessorDefinitions) + true + true + Disabled + Default + + + true + true + false + $(OutDir)default.pdb + true + xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) + xapilib.lib + false + false + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + Level3 @@ -2334,6 +2670,46 @@ if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); + true + true + Disabled + Default + + + true + true + false + $(OutDir)default.pdb + true + xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) + xapilib.lib + false + false + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + Level3 @@ -2374,6 +2750,46 @@ if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;_ITERATOR_DEBUG_LEVEL=0;NDEBUG;_XBOX;_CONTENT_PACKAGE;%(PreprocessorDefinitions); + true + true + Disabled + Default + + + true + true + false + $(OutDir)default.pdb + true + xavatar2.lib;xapilib.lib;d3d9.lib;d3dx9.lib;xgraphics.lib;xboxkrnl.lib;xbox\Sentient\libs\SenCore.lib;xnet.lib;xaudio2.lib;xact3.lib;x3daudio.lib;xmcore.lib;vcomp.lib;xuirun.lib;xuirender.lib;xuihtml.lib;xonline.lib;xhv2.lib;qnetxaudio2.lib;xbox\4JLibs\libs\4J_Input.lib;xbox\4JLibs\libs\4J_Storage.lib;xbox\4JLibs\libs\4J_Profile.lib;xbox\4JLibs\libs\4J_Render.lib;..\Minecraft.World\ContentPackage\Minecraft.World.lib;xsocialpost.lib;xrnm.lib;xparty.lib;xbox\Sentient\libs\SenNews.lib;xbox\Sentient\libs\SenUGC.lib;xbox\Sentient\libs\SenBoxArt.lib;NuiApi.lib;ST.lib;NuiFitnessApi.lib;NuiHandles.lib;NuiSpeech.lib;NuiAudio.lib;xhttp.lib;xauth.lib;xgetserviceendpoint.lib;xav.lib;xjson.lib;%(AdditionalDependencies) + xapilib.lib + false + false + + + $(ProjectDir)xbox\xex.xml + 1480659447 + 584111F7=$(ProjectDir)xbox\GameConfig\Minecraft.spa,RO;media=$(ProjectDir)xbox\XZP\Minecraft.xzp,RO + + + CopyToHardDrive + $(RemoteRoot)=$(ImagePath);$(RemoteRoot)\res=Xbox\res;$(RemoteRoot)=Xbox\AvatarAwards;$(RemoteRoot)\Tutorial=Xbox\Tutorial\Tutorial;$(RemoteRoot)=Xbox\584111F70AAAAAAA;$(RemoteRoot)=Xbox\kinect\speech + + Level3 @@ -2429,7 +2845,8 @@ copy /B /Y $(ProjectDir)Durango\DurangoExtras\xcompress.dll $(LayoutDir)Image\Lo xcopy /q /y $(ProjectDir)Durango\DLCImages\*.png $(LayoutDir)Image\Loose\DLCImages\ xcopy /q /y $(ProjectDir)Durango\DLCXbox1.cmp $(LayoutDir)Image\Loose xcopy /q /y $(ProjectDir)DurangoMedia\DLC $(LayoutDir)Image\Loose\DLC -xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU +xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\Tutorial $(LayoutDir)Image\Loose\Tutorial +xcopy /q /y /i /s /e $(ProjectDir)DurangoMedia\CU $(LayoutDir)Image\Loose\CU Copying files for deployment @@ -2753,7 +3170,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU StripFuncsAndData - ..\Minecraft.World\ORBIS_ReleaseForArt\Minecraft.World.a;Orbis\4JLibs\libs\4j_Render.a;Orbis\4JLibs\libs\4j_Input_r.a;Orbis\4JLibs\libs\4J_Storage_r.a;Orbis\4JLibs\libs\4J_Profile_r.a;Orbis\Iggy\lib\libiggy_orbis.a;Orbis\Miles\lib\mssorbis.a;Orbis\Miles\lib\binkaorbis.a;Common\Network\Sony\sceRemoteStorage\ps4\lib\sceRemoteStorage.a;-lSceGnmDriver_stub_weak;-lSceGnmx;-lSceGnm;-lSceGpuAddress;-lSceCes;-lSceVideoOut_stub_weak;-lScePad_stub_weak;-lScePngDec_stub_weak;-lScePngEnc_stub_weak;-lSceFios2_stub_weak;-lSceUlt_stub_weak;-lSceShaderBinary;-lSceUserService_stub_weak;-lSceSysmodule_stub_weak;-lSceImeDialog_stub_weak;-lScePosix_stub_weak;-lSceAudioOut_stub_weak;-lSceSaveData_stub_weak;-lSceRtc_stub_weak;-lSceSystemService_stub_weak;-lSceNetCtl_stub_weak;-lSceNpCommon_stub_weak;-lSceNpManager_stub_weak;-lSceNpToolkit_rtti;-lSceNpToolkitUtils_rtti;-lSceNpWebApi_stub_weak;-lSceNpAuth_stub_weak;-lSceNpTrophy_stub_weak;-lSceInvitationDialog_stub_weak;-lSceGameCustomDataDialog_stub_weak;-lSceNpCommerce_stub_weak;-lSceNet_stub_weak;-lSceHttp_stub_weak;-lSceSsl_stub_weak;-lSceNpMatching2_stub_weak;-lSceNpTus_stub_weak;-lSceNpUtility_stub_weak;-lSceNpScore_stub_weak;-lSceCommonDialog_stub_weak;-lSceNpSns_stub_weak;-lSceNpSnsFacebookDialog_stub_weak;-lSceRudp_stub_weak;-lSceAppContent_stub_weak;-lSceVoice_stub_weak;-lSceAudioIn_stub_weak;-lSceRemoteplay_stub_weak;-lSceSaveDataDialog_stub_weak;-lSceErrorDialog_stub_weak;-lSceMsgDialog_stub_weak + ..\Minecraft.World\ORBIS_ReleaseForArt\Minecraft.World.a;Orbis\4JLibs\libs\4j_Render.a;Orbis\4JLibs\libs\4j_Input_r.a;Orbis\4JLibs\libs\4J_Storage_r.a;Orbis\4JLibs\libs\4J_Profile_r.a;Orbis\Iggy\lib\libiggy_orbis.a;Orbis\Miles\lib\mssorbis.a;Orbis\Miles\lib\binkaorbis.a;Common\Network\Sony\sceRemoteStorage\ps4\lib\sceRemoteStorage.a;-lSceGnmDriver_stub_weak;-lSceGnmx;-lSceGnm;-lSceGpuAddress;-lSceCes;-lSceVideoOut_stub_weak;-lScePad_stub_weak;-lScePngDec_stub_weak;-lScePngEnc_stub_weak;-lSceFios2_stub_weak;-lSceUlt_stub_weak;-lSceShaderBinary;-lSceUserService_stub_weak;-lSceSysmodule_stub_weak;-lSceImeDialog_stub_weak;-lScePosix_stub_weak;-lSceAudioOut_stub_weak;-lSceSaveData_stub_weak;-lSceRtc_stub_weak;-lSceSystemService_stub_weak;-lSceNetCtl_stub_weak;-lSceNpCommon_stub_weak;-lSceNpManager_stub_weak;-lSceNpToolkit_rtti;-lSceNpToolkitUtils_rtti;-lSceNpWebApi_stub_weak;-lSceNpAuth_stub_weak;-lSceNpTrophy_stub_weak;-lSceInvitationDialog_stub_weak;-lSceGameCustomDataDialog_stub_weak;-lSceNpCommerce_stub_weak;-lSceNet_stub_weak;-lSceHttp_stub_weak;-lSceSsl_stub_weak;-lSceNpMatching2_stub_weak;-lSceNpTus_stub_weak;-lSceNpUtility_stub_weak;-lSceNpScore_stub_weak;-lSceCommonDialog_stub_weak;-lSceNpSns_stub_weak;-lSceNpSnsFacebookDialog_stub_weak;-lSceRudp_stub_weak;-lSceAppContent_stub_weak;-lSceVoice_stub_weak;-lSceAudioIn_stub_weak;-lSceRemoteplay_stub_weak;-lSceSaveDataDialog_stub_weak;-lSceErrorDialog_stub_weak;-lSceMsgDialog_stub_weak;-lSceGameLiveStreaming_stub_weak @@ -2836,12 +3253,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -2881,12 +3305,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -2926,12 +3357,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -2947,6 +3385,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true + + Document + true @@ -2979,12 +3420,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -3024,12 +3472,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -3068,12 +3523,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -3113,12 +3575,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -3158,12 +3627,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -3203,12 +3679,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -3240,12 +3723,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -3274,12 +3764,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -3316,12 +3813,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true @@ -3333,7 +3837,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -3341,6 +3847,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true true true @@ -3355,8 +3862,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true + true true + true true true true @@ -3373,7 +3883,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -3381,6 +3893,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true true true @@ -3395,8 +3908,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true + true true + true true true true @@ -3405,12 +3921,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -3443,12 +3966,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -3481,12 +4011,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -3519,12 +4056,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -3557,12 +4101,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -3595,12 +4146,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -3633,12 +4191,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -3671,12 +4236,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -3709,12 +4281,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -3747,12 +4326,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -3785,12 +4371,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -3846,12 +4439,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -3883,12 +4483,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -3915,12 +4522,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -3946,12 +4560,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -3967,18 +4588,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -4005,18 +4633,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -4124,9 +4759,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU Designer true + true true true + true true + true true true true @@ -4178,18 +4816,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -4216,18 +4861,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -4264,7 +4916,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -4272,7 +4926,36 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true @@ -4288,16 +4971,21 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse + + + + + @@ -4306,9 +4994,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU false + false false false + false false + false false false @@ -4363,7 +5054,68 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + @@ -4405,15 +5157,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true true true true true + true true + true true true true true + true true true false @@ -4427,15 +5183,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true true true true true + true true + true true true true true + true true true false @@ -4449,15 +5209,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true true true true true + true true + true true true true true + true true true false @@ -4471,15 +5235,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true true true true true + true true + true true true true true + true true true false @@ -4506,12 +5274,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false true + true true + true true + true true + true true + true true + true true + true true true true @@ -4523,15 +5298,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true true true true true + true true + true true true true true + true true true false @@ -4545,15 +5324,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true true true true true + true true + true true true true true + true true true false @@ -4580,6 +5363,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -4587,6 +5371,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -4609,13 +5394,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + + + + + + @@ -4644,6 +5435,60 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true true @@ -4694,7 +5539,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4710,7 +5555,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4726,7 +5571,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4742,7 +5587,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4758,7 +5603,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4774,7 +5619,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4790,7 +5635,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4806,7 +5651,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4822,7 +5667,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4838,7 +5683,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4854,7 +5699,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4868,6 +5713,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + false true @@ -4879,7 +5725,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -4908,12 +5754,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -5183,12 +6036,28 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true + + + true + true + true + true + true + true + true true @@ -5360,7 +6229,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5383,12 +6252,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false false + false false + false false false false false false + false false false false @@ -5402,8 +6274,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false false + false false + false false + false false @@ -5416,7 +6291,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5432,7 +6307,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5448,7 +6323,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5464,7 +6339,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5480,7 +6355,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5496,7 +6371,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5512,7 +6387,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5528,7 +6403,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5544,7 +6419,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -5560,7 +6435,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -6007,6 +6882,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false + + true + true + true + true + true + true + true + true true @@ -6262,6 +7146,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false + true @@ -6279,10 +7164,115 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true true + true true + true true true true @@ -6311,16 +7301,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true false false false true + true true + true true + true true true true @@ -6349,20 +7345,30 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true false false false true + true true + true true + true true + true true + true true + true true + true true true true @@ -6389,14 +7395,225 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true true + true true true - true true - true + true true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true true true true @@ -6425,8 +7642,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true true true @@ -6455,8 +7675,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true false false false @@ -6484,12 +7707,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -6505,7 +7735,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true false false true @@ -6513,18 +7745,21 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true false true true true true true + true false true true true true true + true true true @@ -6792,9 +8027,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true @@ -6810,7 +8048,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -6818,7 +8058,36 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true @@ -6833,7 +8102,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -6841,7 +8112,36 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true @@ -6859,12 +8159,16 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true + @@ -6893,12 +8197,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -6930,12 +8241,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -6967,12 +8285,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7004,12 +8329,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7050,12 +8382,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7090,11 +8429,17 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true true true @@ -7174,12 +8519,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7232,12 +8584,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true @@ -7269,12 +8628,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true @@ -7306,12 +8672,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true @@ -7343,12 +8716,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true @@ -7373,12 +8753,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7417,12 +8804,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7461,12 +8855,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7493,9 +8894,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -7524,9 +8929,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -7561,9 +8970,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -7596,9 +9009,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -7631,9 +9048,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -7665,12 +9086,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7710,12 +9138,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true @@ -7733,12 +9168,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7763,12 +9205,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7793,12 +9242,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7823,12 +9279,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7853,12 +9316,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7883,12 +9353,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7914,12 +9391,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -7937,18 +9421,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true false false false false false true + true false true + true true + true false false true @@ -7989,12 +9480,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true false @@ -8026,12 +9524,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -8061,6 +9566,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -8079,7 +9585,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -8087,7 +9595,36 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true @@ -8099,6 +9636,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -8117,7 +9655,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -8125,7 +9665,36 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true @@ -8137,47 +9706,67 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + + + + false + false false false + false false + false false false + false + false false false + false false + false false false false + false false false + false false + false false false false + false false false + false false + false false false false + false false false + false false + false false false @@ -8217,12 +9806,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -8254,12 +9850,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -8288,12 +9891,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -8322,12 +9932,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -8356,12 +9973,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -8390,12 +10014,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -8424,12 +10055,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -8458,61 +10096,24 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true true - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true true @@ -8544,12 +10145,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -8589,12 +10197,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true @@ -8627,12 +10242,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true @@ -8665,12 +10287,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -8709,12 +10338,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -8728,6 +10364,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true @@ -8736,13 +10373,16 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true true true true + true true true true @@ -8757,6 +10397,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true @@ -8773,11 +10414,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true true + true true true @@ -8804,12 +10448,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -8848,12 +10499,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -8867,6 +10525,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true @@ -8883,11 +10542,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true true + true true true @@ -8897,7 +10559,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -8911,10 +10575,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true true true @@ -8931,6 +10600,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true false false @@ -8940,6 +10610,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true @@ -8969,12 +10640,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9018,12 +10696,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9063,12 +10748,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9108,12 +10800,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9139,12 +10838,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9187,12 +10893,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9215,9 +10928,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -9240,7 +10957,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -9248,6 +10967,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true @@ -9262,8 +10982,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true true true @@ -9300,12 +11023,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9345,12 +11075,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9390,12 +11127,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9435,12 +11179,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9480,12 +11231,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9525,12 +11283,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9570,12 +11335,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9615,12 +11387,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -9629,17 +11408,20 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - - + + true + true true true + true true + true true true @@ -9647,18 +11429,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -9671,18 +11460,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -9695,18 +11491,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -9719,18 +11522,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -9753,10 +11563,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true true true @@ -9782,7 +11597,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -9790,6 +11607,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true true true @@ -9804,8 +11622,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true + true true + true true true true @@ -9866,46 +11687,6 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - - true - true - true - true - false - false - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - false - true - false - true - false - true - true - true - true - true - true - true - true - true - true true @@ -9916,7 +11697,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -9924,6 +11707,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true true true @@ -9938,8 +11722,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true + true true + true true true true @@ -9948,12 +11735,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -9986,12 +11780,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -10024,18 +11825,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -10062,8 +11870,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true true true @@ -10099,12 +11910,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -10146,12 +11964,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -10162,8 +11987,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true true true @@ -10194,18 +12022,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true true true true + true true + true true true true true true + true true true true @@ -10220,8 +12052,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true true true @@ -10249,12 +12084,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -10273,12 +12115,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -10318,12 +12167,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -10360,7 +12216,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -10368,6 +12226,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true true true @@ -10382,8 +12241,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true + true true + true true true true @@ -10400,7 +12262,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -10408,6 +12272,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true true true @@ -10422,8 +12287,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true + true true + true true true true @@ -10432,18 +12300,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -10470,18 +12345,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -10532,11 +12414,17 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false false false @@ -10549,18 +12437,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -10603,18 +12498,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -10646,9 +12548,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -10677,7 +12583,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -10685,6 +12593,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true true true @@ -10699,8 +12608,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true + true true + true true true true @@ -10709,18 +12621,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -10747,18 +12666,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -10778,18 +12704,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -10816,18 +12749,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -10854,18 +12794,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -10892,18 +12839,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -10930,18 +12884,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -10968,12 +12929,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11006,12 +12974,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11044,12 +13019,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11082,12 +13064,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11120,12 +13109,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11158,12 +13154,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11196,12 +13199,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11234,12 +13244,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11272,12 +13289,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11310,12 +13334,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11348,12 +13379,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11386,12 +13424,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11424,12 +13469,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11462,12 +13514,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11500,12 +13559,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11538,12 +13604,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11576,12 +13649,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11614,12 +13694,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11652,12 +13739,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11690,12 +13784,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11728,12 +13829,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11766,12 +13874,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11804,12 +13919,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11842,12 +13964,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11880,12 +14009,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11918,12 +14054,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11956,12 +14099,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -11994,12 +14144,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12032,12 +14189,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12070,12 +14234,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12108,12 +14279,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12146,12 +14324,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12184,12 +14369,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12222,12 +14414,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12260,12 +14459,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12298,12 +14504,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12336,12 +14549,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12374,12 +14594,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12412,12 +14639,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12450,12 +14684,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12488,12 +14729,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12526,12 +14774,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12564,12 +14819,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12602,12 +14864,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12640,12 +14909,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12678,12 +14954,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12716,12 +14999,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12754,12 +15044,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12792,12 +15089,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12830,12 +15134,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12868,12 +15179,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12906,12 +15224,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12944,12 +15269,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -12982,12 +15314,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13020,12 +15359,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13058,12 +15404,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13096,12 +15449,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13134,12 +15494,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13172,12 +15539,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13210,12 +15584,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13248,12 +15629,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13286,12 +15674,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13324,12 +15719,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13362,12 +15764,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13400,12 +15809,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13438,12 +15854,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13476,12 +15899,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13514,12 +15944,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13552,12 +15989,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13590,12 +16034,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13628,12 +16079,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13666,12 +16124,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13704,12 +16169,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13742,12 +16214,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13780,12 +16259,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13818,12 +16304,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13856,12 +16349,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13894,12 +16394,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13932,12 +16439,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -13970,12 +16484,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -14008,12 +16529,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -14053,7 +16581,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -14061,6 +16591,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true true false @@ -14068,7 +16599,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true false @@ -14102,12 +16635,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14139,12 +16679,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14176,12 +16723,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14213,12 +16767,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14251,12 +16812,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14288,12 +16856,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14325,12 +16900,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14362,12 +16944,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14399,12 +16988,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14436,12 +17032,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14473,49 +17076,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true + true true true true @@ -14547,12 +17120,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14584,12 +17164,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14628,12 +17215,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false true + true true + true true + true true + true true + true true + true true + true true true true @@ -14665,12 +17259,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14702,12 +17303,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14741,12 +17349,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14778,12 +17393,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14815,12 +17437,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14852,12 +17481,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -14896,12 +17532,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true @@ -14933,12 +17576,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true @@ -14963,12 +17613,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15000,12 +17657,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15037,12 +17701,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15074,12 +17745,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15111,12 +17789,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15148,12 +17833,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15185,12 +17877,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15222,12 +17921,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15259,12 +17965,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15274,50 +17987,6 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true true @@ -15348,12 +18017,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false true + true true + true true + true true + true true + true true + true true + true true true true @@ -15385,12 +18061,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15422,12 +18105,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15459,12 +18149,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15496,12 +18193,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15533,12 +18237,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15570,12 +18281,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -15588,13 +18306,17 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true + @@ -15605,9 +18327,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU false + false false false + false false + false false false @@ -15616,9 +18341,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU false + false false false + false false + false false false @@ -15654,6 +18382,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -15665,6 +18394,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + + @@ -15683,9 +18414,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU false + false true false + false false + false true true false @@ -15735,7 +18469,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -15743,9 +18479,39 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + @@ -15758,6 +18524,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -15770,7 +18537,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -15778,7 +18547,36 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true @@ -15807,12 +18605,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true @@ -15831,12 +18636,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true @@ -15855,12 +18667,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true @@ -15879,12 +18698,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true @@ -15903,12 +18729,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -16162,12 +18995,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -16241,12 +19081,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -16286,12 +19133,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -16362,12 +19216,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -16407,12 +19268,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -16452,12 +19320,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -16497,12 +19372,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -16542,12 +19424,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -16587,12 +19476,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -16632,12 +19528,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -16677,12 +19580,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -16746,12 +19656,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -16760,23 +19677,35 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true + + + + + true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -16803,18 +19732,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -16841,18 +19777,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -16879,18 +19822,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -16921,9 +19871,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -16951,9 +19904,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -16981,9 +19937,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -17011,18 +19970,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -17067,12 +20033,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true false false true true true + true false true true @@ -17081,8 +20050,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true false false false @@ -17118,12 +20090,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false false false false @@ -17140,11 +20119,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true true + true true true true @@ -17155,8 +20137,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true true true @@ -17174,9 +20159,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -17684,9 +20672,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -17714,9 +20705,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -17744,9 +20738,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -17774,9 +20771,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -17804,9 +20804,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -17834,15 +20837,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true true + true true true true @@ -17889,18 +20899,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -17935,7 +20952,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true false false true @@ -17943,6 +20962,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true false true true @@ -17957,26 +20977,36 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true false false false true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -18003,18 +21033,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -18041,15 +21078,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18083,15 +21127,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18125,15 +21176,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18167,15 +21225,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18209,15 +21274,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18251,15 +21323,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18293,15 +21372,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18335,15 +21421,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18377,15 +21470,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18419,15 +21519,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18461,15 +21568,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18503,15 +21617,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18545,15 +21666,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18587,15 +21715,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18629,15 +21764,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18671,15 +21813,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18713,15 +21862,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18755,15 +21911,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18797,15 +21960,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18839,15 +22009,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18881,15 +22058,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18923,15 +22107,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -18965,15 +22156,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19007,15 +22205,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19049,15 +22254,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19091,15 +22303,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19133,15 +22352,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19175,15 +22401,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19217,15 +22450,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19259,15 +22499,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19301,15 +22548,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19343,15 +22597,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19385,15 +22646,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19427,15 +22695,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19469,15 +22744,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19511,15 +22793,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19553,15 +22842,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19595,15 +22891,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19637,15 +22940,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19679,15 +22989,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19721,15 +23038,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19763,15 +23087,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19805,15 +23136,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19847,15 +23185,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19889,15 +23234,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19931,15 +23283,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -19973,15 +23332,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20015,15 +23381,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20057,15 +23430,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20099,15 +23479,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20141,15 +23528,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20183,15 +23577,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20225,15 +23626,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20267,15 +23675,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20309,15 +23724,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20351,15 +23773,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20393,15 +23822,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20435,15 +23871,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20477,15 +23920,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20519,15 +23969,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20561,15 +24018,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20603,15 +24067,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20645,15 +24116,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20687,15 +24165,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20729,15 +24214,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20771,15 +24263,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20813,15 +24312,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20855,15 +24361,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20897,15 +24410,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20939,15 +24459,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -20981,15 +24508,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -21023,15 +24557,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -21065,15 +24606,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -21107,15 +24655,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -21149,15 +24704,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -21191,15 +24753,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -21233,15 +24802,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -21275,15 +24851,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -21317,8 +24900,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true true true @@ -21347,23 +24933,33 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true false false false true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -21397,15 +24993,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -21439,15 +25042,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -21493,7 +25103,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -21501,13 +25113,38 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true - - true - NotUsing - @@ -21521,16 +25158,21 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse + + + + + @@ -21539,9 +25181,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU false + false false false + false false + false false false @@ -21571,6 +25216,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false false + false @@ -21611,7 +25257,68 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true @@ -21650,15 +25357,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true true true true true + true true + true true true true true + true true true false @@ -21672,15 +25383,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true true true true true + true true + true true true true true + true true true false @@ -21694,15 +25409,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true true true true true + true true + true true true true true + true true true false @@ -21729,12 +25448,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false true + true true + true true + true true + true true + true true + true true + true true true true @@ -21773,12 +25499,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false true + true true + true true + true true + true true + true true + true true + true true true true @@ -21790,15 +25523,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true true true true true + true true + true true true true true + true true true false @@ -21824,6 +25561,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -21831,6 +25569,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -21845,13 +25584,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + + + + + + @@ -21886,6 +25631,60 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true true @@ -21936,7 +25735,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -21952,7 +25751,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -21968,7 +25767,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -21984,7 +25783,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22000,7 +25799,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22016,7 +25815,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22032,7 +25831,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22048,7 +25847,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22064,7 +25863,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22080,7 +25879,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22096,7 +25895,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22110,6 +25909,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + false true @@ -22121,7 +25921,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22150,12 +25950,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -22425,12 +26232,28 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true + + + true + true + true + true + true + true + true true @@ -22586,7 +26409,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22609,12 +26432,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false false + false false + false false false false false false + false false false false @@ -22628,8 +26454,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false false + false false + false false + false false @@ -22642,7 +26471,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22658,7 +26487,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22674,7 +26503,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22690,7 +26519,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22706,7 +26535,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22722,7 +26551,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22738,7 +26567,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22754,7 +26583,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22770,7 +26599,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -22786,7 +26615,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue false true - true + false false false false @@ -23224,6 +27053,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false + + true + true + true + true + true + true + true + true true @@ -23479,6 +27317,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false + true true @@ -23495,10 +27334,115 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + true + true true + true true + true true true true @@ -23527,16 +27471,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true false false false true + true true + true true + true true true true @@ -23565,20 +27515,30 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true false false false true + true true + true true + true true + true true + true true + true true + true true true true @@ -23605,14 +27565,225 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true true + true true true - true true - true + true true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + false + false + false + false + false + false + false + + + true + true + true + true + true + true + true + true + true + true + true + true + true + true true true true @@ -23641,8 +27812,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true true true @@ -23671,8 +27845,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true false false false @@ -23700,12 +27877,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -23721,7 +27905,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -23729,18 +27915,21 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true true true true + true true true true true true true + true true true true @@ -23771,12 +27960,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -23818,12 +28014,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -23863,12 +28066,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -23908,12 +28118,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -23953,12 +28170,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24005,12 +28229,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24057,12 +28288,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24109,12 +28347,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24161,12 +28406,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24206,12 +28458,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24251,12 +28510,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24296,12 +28562,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24341,12 +28614,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24386,12 +28666,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24431,12 +28718,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -24454,12 +28748,18 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse + + NotUsing + true + true true true + true true + true true true @@ -24474,7 +28774,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -24482,7 +28784,36 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true @@ -24497,7 +28828,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -24505,7 +28838,36 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true @@ -24516,18 +28878,72 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU - + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true true true + true true + true true true + @@ -24563,12 +28979,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true @@ -24601,12 +29024,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -24641,11 +29071,17 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true true true @@ -24664,7 +29100,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true false @@ -24672,6 +29110,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true false false @@ -24686,8 +29125,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true true true @@ -24703,7 +29145,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true false @@ -24711,6 +29155,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true false false @@ -24725,8 +29170,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true true true @@ -24755,12 +29203,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -24778,18 +29233,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true false false false false false true + true false true + true true + true false false true @@ -24837,12 +29299,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -24881,12 +29350,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true @@ -24918,12 +29394,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true false @@ -24955,12 +29438,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -24999,12 +29489,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -25031,9 +29528,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -25079,12 +29580,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -25123,12 +29631,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -25167,12 +29682,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -25211,12 +29733,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -25239,9 +29768,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -25276,9 +29809,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -25311,9 +29848,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -25346,9 +29887,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -25393,12 +29938,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true false @@ -25430,12 +29982,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -25473,6 +30032,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -25491,7 +30051,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -25499,7 +30061,36 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true @@ -25516,6 +30107,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -25533,7 +30125,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -25541,7 +30135,36 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true @@ -25553,6 +30176,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + + Disabled Disabled @@ -25563,23 +30188,31 @@ 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 @@ -25589,36 +30222,49 @@ 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 @@ -25651,61 +30297,24 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true true - - true - true - true - true - true - true - true - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true true @@ -25737,12 +30346,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -25781,12 +30397,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -25800,6 +30423,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true @@ -25808,13 +30432,16 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true true true true + true true true true @@ -25829,6 +30456,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true @@ -25845,11 +30473,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true true + true true true @@ -25876,12 +30507,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -25920,12 +30558,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -25939,6 +30584,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true @@ -25955,11 +30601,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true true + true true true @@ -25968,13 +30617,16 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true true true true + true true + true true true true @@ -25986,9 +30638,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -26028,12 +30684,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -26073,12 +30736,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -26118,12 +30788,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -26163,12 +30840,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -26191,9 +30875,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -26216,7 +30904,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -26224,6 +30914,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true @@ -26238,8 +30929,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true true true @@ -26268,12 +30962,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -26305,12 +31006,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -26342,12 +31050,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -26356,8 +31071,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - - + + @@ -26367,9 +31082,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU false + false false false + false false + false false false @@ -26392,10 +31110,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true true true @@ -26435,12 +31158,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true false false true @@ -26462,7 +31192,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -26470,6 +31202,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true true true @@ -26484,48 +31217,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true + true true - true - true - true - true - true - - - true - true - true - true - false - false - true - true - true - true - true - true - true - true - false - true - true - true - true - true - true - true - true - true - false - true - false - true - false - true - true - true - true + true true true true @@ -26542,7 +31238,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -26550,6 +31248,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true true true @@ -26564,8 +31263,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true + true true + true true true true @@ -26574,8 +31276,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true true true @@ -26611,12 +31316,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -26658,12 +31370,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -26674,8 +31393,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true true true @@ -26706,18 +31428,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true true true true + true true + true true true true true true + true true true true @@ -26754,12 +31480,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true false true true @@ -26771,12 +31504,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -26816,12 +31556,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -26858,7 +31605,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -26866,6 +31615,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true true true @@ -26880,8 +31630,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true + true true + true true true true @@ -26890,18 +31643,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -26952,11 +31712,17 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false false false @@ -26969,18 +31735,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -27007,18 +31780,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -27045,18 +31825,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -27088,9 +31875,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -27119,7 +31910,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -27135,8 +31928,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true + true true + true true true true @@ -27145,18 +31941,26 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true true true true + true true + true true + true true + true true + true true + true true + true true true true @@ -27189,50 +31993,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true + true true true true @@ -27265,12 +32038,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27303,12 +32083,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27341,12 +32128,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27379,12 +32173,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27417,12 +32218,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27455,12 +32263,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27493,12 +32308,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27531,12 +32353,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27569,12 +32398,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27607,12 +32443,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27645,12 +32488,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27683,12 +32533,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27721,12 +32578,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27759,12 +32623,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27797,12 +32668,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -27842,7 +32720,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -27850,6 +32730,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse true true + true true true false @@ -27857,7 +32738,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true false @@ -27891,49 +32774,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true + true true true true @@ -27965,12 +32818,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -28002,12 +32862,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -28046,12 +32913,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false true + true true + true true + true true + true true + true true + true true + true true true true @@ -28083,12 +32957,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -28120,12 +33001,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -28157,12 +33045,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -28194,12 +33089,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -28231,12 +33133,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -28275,12 +33184,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true @@ -28312,12 +33228,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true @@ -28342,12 +33265,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -28386,12 +33316,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false true + true true + true true + true true + true true + true true + true true + true true true true @@ -28423,12 +33360,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -28460,12 +33404,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -28497,12 +33448,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -28534,12 +33492,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -28571,12 +33536,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -28615,12 +33587,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false true + true true + true true + true true + true true + true true + true true + true true true true @@ -28645,12 +33624,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -28666,50 +33652,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 @@ -28740,12 +33682,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false true + true true + true true + true true + true true + true true + true true + true true true true @@ -28756,9 +33705,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true @@ -28781,6 +33733,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -28792,6 +33745,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + + @@ -28809,9 +33764,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU false + false false false + false false + false false false false @@ -28851,9 +33809,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUCreate Create Create + Create Create Create + Create Create + Create Create Create Create @@ -28869,18 +33830,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUCreate Create Create + Create Create + Create Create + Create Create + Create Create Create Create Create Create false + false false false + false false + false false false Create @@ -28929,7 +33897,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -28937,9 +33907,39 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + @@ -28952,6 +33952,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + @@ -28964,7 +33965,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -28972,7 +33975,36 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true @@ -29024,12 +34056,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU false + false false + false false + false false + false false + false false + false false + false true true true @@ -29081,12 +34120,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -29126,12 +34172,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false true true true @@ -29237,17 +34290,29 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true + + + + + true + true true + true true + true true + true true + true true + true true + true true true true @@ -29280,9 +34345,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -29310,9 +34378,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -29340,9 +34411,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -29388,12 +34462,15 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true false false true true true + true false true true @@ -29402,8 +34479,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true false false false @@ -29438,12 +34518,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false false + false false + false false + false false false false @@ -29460,11 +34547,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true true + true true true true @@ -29475,8 +34565,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true true true @@ -29484,9 +34577,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -29514,9 +34610,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true @@ -29553,9 +34652,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUNotUsing NotUsing NotUsing + NotUsing NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing @@ -29571,18 +34673,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUNotUsing NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing + NotUsing NotUsing NotUsing NotUsing NotUsing NotUsing true + true true true + true true + true true true true @@ -29610,15 +34719,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true true + true true true true @@ -29648,15 +34764,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true true + true true true true @@ -29686,15 +34809,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true true + true true true true @@ -29732,7 +34862,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true false false true @@ -29740,6 +34872,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true false true true @@ -29754,26 +34887,36 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true false false false true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -29800,15 +34943,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -29842,15 +34992,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -29884,15 +35041,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -29926,15 +35090,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -29968,15 +35139,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30010,15 +35188,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30052,15 +35237,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30094,15 +35286,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30136,15 +35335,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30178,15 +35384,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30220,15 +35433,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30262,15 +35482,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30304,15 +35531,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30346,15 +35580,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30388,15 +35629,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30430,15 +35678,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30472,15 +35727,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30514,15 +35776,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30556,15 +35825,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30598,15 +35874,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30640,15 +35923,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30682,15 +35972,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30724,15 +36021,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30766,15 +36070,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30808,15 +36119,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30850,15 +36168,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30892,15 +36217,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30934,15 +36266,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -30976,15 +36315,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31018,15 +36364,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31060,15 +36413,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31102,15 +36462,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31158,15 +36525,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31200,15 +36574,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31242,15 +36623,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31284,15 +36672,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31326,15 +36721,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31368,15 +36770,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31410,15 +36819,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31452,15 +36868,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31494,15 +36917,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31536,15 +36966,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31578,15 +37015,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31620,15 +37064,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31662,15 +37113,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31704,15 +37162,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31746,15 +37211,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31788,15 +37260,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31830,15 +37309,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31872,15 +37358,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31914,15 +37407,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31956,15 +37456,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -31998,15 +37505,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32040,15 +37554,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32082,15 +37603,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32124,15 +37652,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32166,15 +37701,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32208,15 +37750,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32250,15 +37799,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32292,15 +37848,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32334,15 +37897,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32376,15 +37946,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32418,15 +37995,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32460,15 +38044,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32502,15 +38093,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32544,15 +38142,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32586,15 +38191,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32628,15 +38240,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32670,15 +38289,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32712,15 +38338,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32754,15 +38387,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32796,15 +38436,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32838,15 +38485,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32880,15 +38534,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32922,15 +38583,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -32964,15 +38632,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true true true + true true + true true + true false + false true true true @@ -33010,13 +38685,20 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true true + true true + true true + true true + true true true true @@ -33030,14 +38712,21 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true true true + true true + true true + true true + true true + true true true true @@ -33078,12 +38767,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -33115,12 +38811,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -33153,12 +38856,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -33198,12 +38908,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -33214,9 +38931,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true true + true true + true false false true @@ -33234,9 +38954,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -33268,14 +38992,21 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true + true true + true true + true true + true true + true true true true @@ -33295,7 +39026,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true false @@ -33303,12 +39036,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true true true true + true true @@ -33321,7 +39056,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -33329,12 +39066,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true false true true true true + true true @@ -33347,7 +39086,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -33355,19 +39096,24 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true true true true + true true true true + true true + true true + true true true true @@ -33377,8 +39123,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true true + true true + true true true true @@ -33389,8 +39138,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true true + true true + true true true true @@ -33400,8 +39152,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true true + true true + true true + true true true true @@ -33411,13 +39166,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true @@ -33449,12 +39210,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -33493,12 +39261,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -33537,12 +39312,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -33563,8 +39345,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true true true @@ -33583,8 +39368,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true true true @@ -33603,8 +39391,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true true true @@ -33634,12 +39425,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -33668,12 +39466,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -33681,12 +39486,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -33715,12 +39527,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -33761,8 +39580,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true true true @@ -33770,12 +39592,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -33804,12 +39633,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -33850,8 +39686,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true true true @@ -33859,12 +39698,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -33893,12 +39739,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -33939,8 +39792,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true true true @@ -33948,12 +39804,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -33982,12 +39845,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true + true true + true true + true true true true @@ -34028,8 +39898,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true true true @@ -34045,7 +39918,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -34053,6 +39928,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true @@ -34065,7 +39941,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -34073,6 +39951,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true @@ -34085,7 +39964,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -34093,12 +39974,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true false true - true + false true false true @@ -34125,12 +40007,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -34169,12 +40058,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -34213,12 +40109,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -34230,7 +40133,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU false true - true + false true false true @@ -34257,12 +40160,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -34301,12 +40211,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -34345,12 +40262,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -34362,7 +40286,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU false true - true + false true false true @@ -34389,12 +40313,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -34433,12 +40364,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -34477,12 +40415,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -34494,7 +40439,7 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU false true - true + false true false true @@ -34521,12 +40466,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -34565,12 +40517,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -34609,12 +40568,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -34623,24 +40589,14 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - + true true @@ -34664,12 +40620,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -34701,12 +40664,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -34715,22 +40685,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 @@ -34741,12 +40699,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true false + false false + false true + true true true true @@ -34772,12 +40737,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true false + false true true true @@ -34810,12 +40782,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true false + false false + false true + true true true true @@ -34855,12 +40834,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false false + false false + false true + true true + true false + false true true true @@ -34879,7 +40865,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false false + false true true true @@ -34887,20 +40875,24 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true true true true true + true true true true true true true + true true true + true true @@ -34913,7 +40905,9 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true true true @@ -34921,20 +40915,24 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true false + false true true true true true true + true true true true true true true + true true true + true true @@ -35070,18 +41068,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -35113,18 +41118,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -35153,8 +41165,11 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true true true @@ -35168,18 +41183,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -35210,18 +41232,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -35250,10 +41279,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true true true + true true @@ -35267,15 +41299,22 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true + true true + true true true true + true true + true true + true true + true true true true @@ -35311,18 +41350,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -35346,18 +41392,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUfalse false true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -35388,18 +41441,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -35428,10 +41488,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true true true + true true @@ -35464,12 +41527,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -35508,12 +41578,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true false true true @@ -35526,18 +41603,25 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true true + true true + true true + true true true true true true true + true true true + true true + true true true true @@ -35581,9 +41665,13 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true true true @@ -35599,9 +41687,12 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true true + true true + true true true @@ -35657,12 +41748,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -35697,12 +41795,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -35737,12 +41842,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -35791,12 +41903,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -35824,12 +41943,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -35864,12 +41990,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -35904,12 +42037,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -35944,12 +42084,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -35984,12 +42131,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36024,12 +42178,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36066,12 +42227,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36106,12 +42274,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36146,12 +42321,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36198,12 +42380,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36233,12 +42422,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36273,12 +42469,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36313,12 +42516,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36353,12 +42563,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36393,12 +42610,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36433,12 +42657,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36471,12 +42702,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36510,12 +42748,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36549,12 +42794,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36606,12 +42858,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36633,12 +42892,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36672,12 +42938,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36711,12 +42984,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36750,12 +43030,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36789,12 +43076,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36828,12 +43122,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true true + true true + true true + true true + true true + true true + true true + true true true true @@ -36860,20 +43161,19 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue - - - + - + Durango\Network\windows.xbox.networking.realtimesession.winmd true - + + \ No newline at end of file diff --git a/Minecraft.Client/Minecraft.Client.vcxproj.filters b/Minecraft.Client/Minecraft.Client.vcxproj.filters index 451dec44..ab31a46e 100644 --- a/Minecraft.Client/Minecraft.Client.vcxproj.filters +++ b/Minecraft.Client/Minecraft.Client.vcxproj.filters @@ -723,6 +723,9 @@ {0061db22-43de-4b54-a161-c43958cdcd7e} + + {889a84db-3009-4a7c-8234-4bf93d412690} + @@ -2434,15 +2437,9 @@ Common - - net\minecraft\client\model - net\minecraft\client\model - - net\minecraft\client\renderer\entity - net\minecraft\client\renderer\entity @@ -3193,9 +3190,6 @@ PS3\Source Files\Leaderboards - - PS3\Source Files\Leaderboards - Common\Source Files\Leaderboards @@ -3466,18 +3460,12 @@ PSVita - - PSVita\Source Files - PSVita\GameConfig Orbis\Network - - Orbis\Source Files\Leaderboards - Common\Source Files\UI\Scenes\Debug @@ -3574,9 +3562,6 @@ PSVita\Source Files\Network - - PSVita\Source Files\Leaderboards - PSVita\Source Files\Leaderboards @@ -3628,6 +3613,162 @@ Common\Source Files\UI\Scenes + + Common\Source Files\Leaderboards + + + Common\Source Files\Leaderboards + + + net\minecraft\server + + + net\minecraft\server + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\particle + + + net\minecraft\client\resources + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\tileentity + + + net\minecraft\client\renderer\texture + + + net\minecraft\client\renderer + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + net\minecraft\client\model + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Controls + + + Common\Source Files\UI\All Platforms + + + Xbox\Source Files\XUI\Containers + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI + + + Common\Source Files\UI\Controls + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\Leaderboards + @@ -4812,15 +4953,9 @@ net\minecraft\client\renderer\entity - - net\minecraft\client\renderer\entity - net\minecraft\client\model - - net\minecraft\client\model - Xbox\Source Files\Audio @@ -4839,9 +4974,6 @@ PS3\ChunkRebuild_SPU - - PS3\ChunkRebuild_SPU - PS3\ChunkRebuild_SPU @@ -5268,9 +5400,6 @@ PS3\Source Files\Leaderboards - - PS3\Source Files\Leaderboards - Common\Source Files\Leaderboards @@ -5490,9 +5619,6 @@ PSVita - - PSVita\Source Files - PSVita\Source Files @@ -5505,9 +5631,6 @@ Common\Source Files\Network\Sony - - Orbis\Source Files\Leaderboards - Common\Source Files\UI\Scenes\Debug @@ -5598,9 +5721,6 @@ PSVita\Source Files\Network - - PSVita\Source Files\Leaderboards - PSVita\Source Files\Leaderboards @@ -5640,7 +5760,160 @@ Common\Source Files\UI\Scenes - + + Common\Source Files\Leaderboards + + + Common\Source Files\Leaderboards + + + Common\Source Files\UI\Scenes\Help & Options + + + Common\Source Files\UI + + + net\minecraft\server + + + net\minecraft\server + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\model + + + net\minecraft\client\particle + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\entity + + + net\minecraft\client\renderer\tileentity + + + net\minecraft\client\renderer\texture + + + net\minecraft\client\renderer + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\All Platforms + + + net\minecraft\client\model + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Controls + + + Xbox\Source Files\XUI\Containers + + + Xbox\Source Files\XUI\Controls + + + Common\Source Files\UI\All Platforms + + + Xbox\Source Files\XUI\Containers + + + Common\Source Files\UI\Controls + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\Scenes\In-Game Menu Screens\Containers + + + Common\Source Files\UI\All Platforms + + + Common\Source Files\UI\Controls + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\Tutorial\Tasks + + + Common\Source Files\UI\Scenes\Frontend Menu screens + + + Common\Source Files\Leaderboards + + Source Files @@ -5870,25 +6143,13 @@ PSVita\Iggy\Lib - - PSVita\Miles Sound System\lib - - - PSVita\Miles Sound System\lib - - - PSVita\Miles Sound System\lib - - - PSVita\Miles Sound System\lib - Xbox\4JLibs\libs Xbox\4JLibs\libs - + @@ -6017,4 +6278,12 @@ + + + Source Files + + + + + \ No newline at end of file diff --git a/Minecraft.Client/Minecraft.cpp b/Minecraft.Client/Minecraft.cpp index 3192410d..87f1b8be 100644 --- a/Minecraft.Client/Minecraft.cpp +++ b/Minecraft.Client/Minecraft.cpp @@ -61,6 +61,7 @@ #include "..\Minecraft.World\Villager.h" #include "..\Minecraft.World\SparseLightStorage.h" #include "..\Minecraft.World\SparseDataStorage.h" +#include "..\Minecraft.World\ChestTileEntity.h" #include "TextureManager.h" #ifdef _XBOX #include "Xbox\Network\NetworkPlayerXbox.h" @@ -73,6 +74,7 @@ #include "Orbis\Network\PsPlusUpsellWrapper_Orbis.h" #endif +// #define DISABLE_SPU_CODE // 4J Turning this on will change the graph at the bottom of the debug overlay to show the number of packets of each type added per fram //#define DEBUG_RENDER_SHOWS_PACKETS 1 //#define SPLITSCREEN_TEST @@ -103,8 +105,16 @@ int QuickSelectBoxWidth[3]= 111, 142 }; + +// 4J - TomK ToDo: these really shouldn't be magic numbers, it should read the hud position from flash. +int iToolTipOffset = 85; + #endif +ResourceLocation Minecraft::DEFAULT_FONT_LOCATION = ResourceLocation(TN_DEFAULT_FONT); +ResourceLocation Minecraft::ALT_FONT_LOCATION = ResourceLocation(TN_ALT_FONT); + + Minecraft::Minecraft(Component *mouseComponent, Canvas *parent, MinecraftApplet *minecraftApplet, int width, int height, bool fullscreen) { // 4J - added this block of initialisers @@ -294,7 +304,7 @@ void Minecraft::init() */ } catch (LWJGLException e) { // This COULD be because of a bug! A delay followed by a new attempt - // is supposed to fix it. + // is supposed getWorkingDirectoryto fix it. e.printStackTrace(); try { Thread.sleep(1000); @@ -311,7 +321,7 @@ void Minecraft::init() // glClearColor(0.2f, 0.2f, 0.2f, 1); - workingDirectory = getWorkingDirectory(); + workingDirectory = File(L"");//getWorkingDirectory(); levelSource = new McRegionLevelStorageSource(File(workingDirectory, L"saves")); // levelSource = new MemoryLevelStorageSource(); options = new Options(this, workingDirectory); @@ -320,8 +330,8 @@ void Minecraft::init() textures = new Textures(skins, options); //renderLoadingScreen(); - font = new Font(options, L"font/Default.png", textures, false, TN_DEFAULT_FONT, 23, 20, 8, 8, SFontData::Codepoints); - altFont = new Font(options, L"font/alternate.png", textures, false, TN_ALT_FONT, 16, 16, 8, 8); + font = new Font(options, L"font/Default.png", textures, false, &DEFAULT_FONT_LOCATION, 23, 20, 8, 8, SFontData::Codepoints); + altFont = new Font(options, L"font/alternate.png", textures, false, &ALT_FONT_LOCATION, 16, 16, 8, 8); //if (options.languageCode != null) { // Language.getInstance().loadLanguage(options.languageCode); @@ -390,16 +400,13 @@ void Minecraft::init() // openGLCapabilities = new OpenGLCapabilities(); // 4J - removed levelRenderer = new LevelRenderer(this, textures); + //textures->register(&TextureAtlas::LOCATION_BLOCKS, new TextureAtlas(Icon::TYPE_TERRAIN, TN_TERRAIN)); + //textures->register(&TextureAtlas::LOCATION_ITEMS, new TextureAtlas(Icon::TYPE_ITEM, TN_GUI_ITEMS)); textures->stitch(); glViewport(0, 0, width, height); particleEngine = new ParticleEngine(level, textures); - // try { // 4J - removed try/catch - bgLoader = new BackgroundDownloader(workingDirectory, this); - bgLoader->start(); - // } catch (Exception e) { - // } MemSect(31); checkGlError(L"Post startup"); @@ -483,53 +490,6 @@ void Minecraft::blit(int x, int y, int sx, int sy, int w, int h) t->end(); } -File Minecraft::getWorkingDirectory() -{ - if (workDir.getPath().empty()) workDir = getWorkingDirectory(L"minecraft"); - return workDir; -} - -File Minecraft::getWorkingDirectory(const wstring& applicationName) -{ -#if 0 - // 4J - original version - final String userHome = System.getProperty("user.home", "."); - final File workingDirectory; - switch (getPlatform()) { - case linux: - case solaris: - workingDirectory = new File(userHome, '.' + applicationName + '/'); - break; - case windows: - final String applicationData = System.getenv("APPDATA"); - if (applicationData != null) workingDirectory = new File(applicationData, "." + applicationName + '/'); - else workingDirectory = new File(userHome, '.' + applicationName + '/'); - break; - case macos: - workingDirectory = new File(userHome, "Library/Application Support/" + applicationName); - break; - default: - workingDirectory = new File(userHome, applicationName + '/'); - } - if (!workingDirectory.exists()) if (!workingDirectory.mkdirs()) throw new RuntimeException("The working directory could not be created: " + workingDirectory); - return workingDirectory; -#else - wstring userHome = L"home"; // 4J - TODO - File workingDirectory(userHome, applicationName); - // 4J Removed - //if (!workingDirectory.exists()) - //{ - // workingDirectory.mkdirs(); - //} - return workingDirectory; -#endif -} - -Minecraft::OS Minecraft::getPlatform() -{ - return xbox; -} - LevelStorageSource *Minecraft::getLevelSource() { return levelSource; @@ -537,8 +497,6 @@ LevelStorageSource *Minecraft::getLevelSource() void Minecraft::setScreen(Screen *screen) { - if( dynamic_cast(this->screen) != NULL ) return; - if (this->screen != NULL) { this->screen->removed(); @@ -631,15 +589,6 @@ void Minecraft::destroy() /*stats->forceSend(); stats->forceSave();*/ - // 4J - all try/catch/finally things in here removed - // try { - if (this->bgLoader != NULL) - { - bgLoader->halt(); - } - // } catch (Exception e) { - // } - // try { setLevel(NULL); // } catch (Throwable e) { @@ -651,8 +600,6 @@ void Minecraft::destroy() // } soundEngine->destroy(); - Mouse::destroy(); - Keyboard::destroy(); //} finally { Display::destroy(); // if (!hasCrashed) System.exit(0); //4J - removed @@ -1088,7 +1035,7 @@ shared_ptr Minecraft::createExtraLocalPlayer(int idx, co localplayers[idx]->setOnlineXuid(playerXUIDOnline); localplayers[idx]->setIsGuest(ProfileManager.IsGuest(idx)); - localplayers[idx]->displayName = ProfileManager.GetDisplayName(idx); + localplayers[idx]->m_displayName = ProfileManager.GetDisplayName(idx); localplayers[idx]->m_iScreenSection = tempScreenSection; @@ -1177,7 +1124,7 @@ void Minecraft::removeLocalPlayerIdx(int idx) updateXui = false; #endif // 4J Stu - Adding this back in for exactly the reason my comment above suggests it was added in the first place -#ifdef _XBOX_ONE +#if defined(_XBOX_ONE) || defined(__ORBIS__) g_NetworkManager.RemoveLocalPlayerByUserIndex(idx); #endif } @@ -1463,7 +1410,7 @@ void Minecraft::run_middle() else { UINT uiIDA[1] = { IDS_OK }; - ui.RequestMessageBox( IDS_CANTJOIN_TITLE, IDS_NO_PLAYSTATIONPLUS, uiIDA, 1, i, NULL, NULL, app.GetStringTable() ); + ui.RequestErrorMessage( IDS_CANTJOIN_TITLE, IDS_NO_PLAYSTATIONPLUS, uiIDA, 1, i); } } else @@ -1704,7 +1651,7 @@ void Minecraft::run_middle() { UINT uiIDA[1]; uiIDA[0] = IDS_OK; - ui.RequestMessageBox(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, i, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_ONLINE_SERVICE_TITLE, IDS_CONTENT_RESTRICTION, uiIDA, 1, i); } else if (ProfileManager.IsSignedIn(i) && !ProfileManager.IsSignedInLive(i)) { @@ -1712,14 +1659,14 @@ void Minecraft::run_middle() UINT uiIDA[2]; uiIDA[0] = IDS_PRO_NOTONLINE_ACCEPT; uiIDA[1] = IDS_CANCEL; - ui.RequestMessageBox(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, i,&Minecraft::MustSignInReturnedPSN, this, app.GetStringTable(), NULL, 0, false); + ui.RequestAlertMessage(IDS_PRO_NOTONLINE_TITLE, IDS_PRO_NOTONLINE_TEXT, uiIDA, 2, i,&Minecraft::MustSignInReturnedPSN, this); } else #endif { UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox(IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA, 1, i, NULL, NULL, app.GetStringTable()); + ui.RequestErrorMessage(IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA, 1, i); } } //else @@ -1755,14 +1702,14 @@ void Minecraft::run_middle() { firstEmptyUser = i; break; + } } - } // For durango, check for unmapped controllers for(unsigned int iPad = XUSER_MAX_COUNT; iPad < (XUSER_MAX_COUNT + InputManager.MAX_GAMEPADS); ++iPad) { - if(InputManager.IsPadLocked(iPad) || !InputManager.IsPadConnected(iPad) ) continue; - if(!InputManager.ButtonPressed(iPad)) continue; + bool isPadLocked = InputManager.IsPadLocked(iPad), isPadConnected = InputManager.IsPadConnected(iPad), buttonPressed = InputManager.ButtonPressed(iPad); + if (isPadLocked || !isPadConnected || !buttonPressed) continue; if(!ui.PressStartPlaying(firstEmptyUser)) { @@ -1897,7 +1844,6 @@ void Minecraft::run_middle() PIXBeginNamedEvent(0,"Light update"); - if (level != NULL) level->updateLights(); glEnable(GL_TEXTURE_2D); PIXEndNamedEvent(); @@ -1978,6 +1924,10 @@ void Minecraft::run_middle() } */ +#if PACKET_ENABLE_STAT_TRACKING + Packet::updatePacketStatsPIX(); +#endif + if (options->renderDebug) { //renderFpsMeter(tickDuraction); @@ -2278,7 +2228,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) if (!pause && level != NULL) gameMode->tick(); MemSect(31); - glBindTexture(GL_TEXTURE_2D, textures->loadTexture(TN_TERRAIN));//L"/terrain.png")); + glBindTexture(GL_TEXTURE_2D, textures->loadTexture(TN_TERRAIN)); //L"/terrain.png")); MemSect(0); if( bFirst ) { @@ -2330,7 +2280,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) if (screen == NULL && !ui.GetMenuDisplayed(iPad) ) { // 4J-PB - add some tooltips if required - int iA=-1, iB=-1, iX, iY=IDS_CONTROLS_INVENTORY, iLT=-1, iRT=-1, iLB=-1, iRB=-1; + int iA=-1, iB=-1, iX, iY=IDS_CONTROLS_INVENTORY, iLT=-1, iRT=-1, iLB=-1, iRB=-1, iLS=-1, iRS=-1; if(player->abilities.instabuild) { @@ -2344,10 +2294,12 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) int *piAction; int *piJump; int *piUse; + int *piAlt; unsigned int uiAction = InputManager.GetGameJoypadMaps(InputManager.GetJoypadMapVal( iPad ) ,MINECRAFT_ACTION_ACTION ); unsigned int uiJump = InputManager.GetGameJoypadMaps(InputManager.GetJoypadMapVal( iPad ) ,MINECRAFT_ACTION_JUMP ); unsigned int uiUse = InputManager.GetGameJoypadMaps(InputManager.GetJoypadMapVal( iPad ) ,MINECRAFT_ACTION_USE ); + unsigned int uiAlt = InputManager.GetGameJoypadMaps(InputManager.GetJoypadMapVal( iPad ) ,MINECRAFT_ACTION_SNEAK_TOGGLE ); // Also need to handle PS3 having swapped triggers/bumpers switch(uiAction) @@ -2407,6 +2359,16 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) break; } + switch(uiAlt) + { + default: + case _360_JOY_BUTTON_LSTICK_RIGHT: + piAlt=&iRS; + break; + + //TODO + } + if (player->isUnderLiquid(Material::water)) { *piJump=IDS_TOOLTIPS_SWIMUP; @@ -2418,6 +2380,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) *piUse=-1; *piAction=-1; + *piAlt=-1; // 4J-PB another special case for when the player is sleeping in a bed if (player->isSleeping() && (level != NULL) && level->isClientSide) @@ -2426,6 +2389,20 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) } else { + if (player->isRiding()) + { + shared_ptr mount = player->riding; + + if ( mount->instanceof(eTYPE_MINECART) || mount->instanceof(eTYPE_BOAT) ) + { + *piAlt = IDS_TOOLTIPS_EXIT; + } + else + { + *piAlt = IDS_TOOLTIPS_DISMOUNT; + } + } + // no hit result, but we may have something in our hand that we can do something with shared_ptr itemInstance = player->inventory->getSelected(); @@ -2470,11 +2447,12 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) } break; - case Item::milk_Id: + case Item::bucket_milk_Id: *piUse=IDS_TOOLTIPS_DRINK; break; case Item::fishingRod_Id: // use + case Item::emptyMap_Id: *piUse=IDS_TOOLTIPS_USE; break; @@ -2504,6 +2482,11 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) if (bUseItem) *piUse=IDS_TOOLTIPS_COLLECT; break; + case Item::bucket_lava_Id: + case Item::bucket_water_Id: + *piUse=IDS_TOOLTIPS_EMPTY; + break; + case Item::boat_Id: case Tile::waterLily_Id: if (bUseItem) *piUse=IDS_TOOLTIPS_PLACE; @@ -2568,8 +2551,8 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) { switch (itemInstance->getItem()->id) { - case Tile::mushroom1_Id: - case Tile::mushroom2_Id: + case Tile::mushroom_brown_Id: + case Tile::mushroom_red_Id: case Tile::tallgrass_Id: case Tile::cactus_Id: case Tile::sapling_Id: @@ -2589,28 +2572,10 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) break; case Item::seeds_wheat_Id: - case Item::netherStalkSeeds_Id: + case Item::netherwart_seeds_Id: *piUse=IDS_TOOLTIPS_PLANT; break; - case Item::bucket_empty_Id: - switch(iTileID) - { - // can collect lava or water in the empty bucket - case Tile::water_Id: - case Tile::calmWater_Id: - case Tile::lava_Id: - case Tile::calmLava_Id: - *piUse=IDS_TOOLTIPS_COLLECT; - break; - } - break; - - case Item::bucket_lava_Id: - case Item::bucket_water_Id: - *piUse=IDS_TOOLTIPS_EMPTY; - break; - case Item::dye_powder_Id: // bonemeal grows various plants if (itemInstance->getAuxValue() == DyePowderItem::WHITE) @@ -2618,10 +2583,10 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) switch(iTileID) { case Tile::sapling_Id: - case Tile::crops_Id: + case Tile::wheat_Id: case Tile::grass_Id: - case Tile::mushroom1_Id: - case Tile::mushroom2_Id: + case Tile::mushroom_brown_Id: + case Tile::mushroom_red_Id: case Tile::melonStem_Id: case Tile::pumpkinStem_Id: case Tile::carrots_Id: @@ -2641,6 +2606,14 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) *piUse=IDS_TOOLTIPS_IGNITE; break; + case Item::fireworks_Id: + *piUse=IDS_TOOLTIPS_FIREWORK_LAUNCH; + break; + + case Item::lead_Id: + *piUse=IDS_TOOLTIPS_ATTACH; + break; + default: *piUse=IDS_TOOLTIPS_PLACE; break; @@ -2662,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) ) @@ -3502,14 +3663,22 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) if((player->ullButtonsPressed&(1LL<isInputAllowed(MINECRAFT_ACTION_INVENTORY)) { - shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->player ); + shared_ptr player = Minecraft::GetInstance()->player; ui.PlayUISFX(eSFX_Press); - app.LoadInventoryMenu(iPad,player); + + if(gameMode->isServerControlledInventory()) + { + player->sendOpenInventory(); + } + else + { + app.LoadInventoryMenu(iPad,player); + } } if((player->ullButtonsPressed&(1LL<isInputAllowed(MINECRAFT_ACTION_CRAFTING)) { - shared_ptr player = dynamic_pointer_cast( Minecraft::GetInstance()->player ); + shared_ptr player = Minecraft::GetInstance()->player; // 4J-PB - reordered the if statement so creative mode doesn't bring up the crafting table // Fix for #39014 - TU5: Creative Mode: Pressing X to access the creative menu while looking at a crafting table causes the crafting menu to display @@ -3561,8 +3730,9 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) if(pTouchData->reportNum==1) { int iHudSize=app.GetGameSettings(iPad,eGameSetting_UISize); + int iYOffset = (app.GetGameSettings(ProfileManager.GetPrimaryPad(),eGameSetting_Tooltips) == 0) ? iToolTipOffset : 0; if((pTouchData->report[0].x>QuickSelectRect[iHudSize].left)&&(pTouchData->report[0].xreport[0].y>QuickSelectRect[iHudSize].top)&&(pTouchData->report[0].yreport[0].y>QuickSelectRect[iHudSize].top+iYOffset)&&(pTouchData->report[0].yinventory->selected=(pTouchData->report[0].x-QuickSelectRect[iHudSize].left)/QuickSelectBoxWidth[iHudSize]; selected = true; @@ -3822,7 +3992,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) { if (!pause) { - if (levels[i]->lightningBoltTime > 0) levels[i]->lightningBoltTime--; + if (levels[i]->skyFlashTime > 0) levels[i]->skyFlashTime--; PIXBeginNamedEvent(0,"Level entity tick"); levels[i]->tickEntities(); PIXEndNamedEvent(); @@ -3841,7 +4011,7 @@ void Minecraft::tick(bool bFirst, bool bUpdateTextures) setLocalPlayerIdx(idx); gameRenderer->setupCamera(timer->a, i); Camera::prepare(localplayers[idx], localplayers[idx]->ThirdPersonView() == 2); - shared_ptr cameraEntity = cameraTargetPlayer; + shared_ptr cameraEntity = cameraTargetPlayer; double xOff = cameraEntity->xOld + (cameraEntity->x - cameraEntity->xOld) * timer->a; double yOff = cameraEntity->yOld + (cameraEntity->y - cameraEntity->yOld) * timer->a; double zOff = cameraEntity->zOld + (cameraEntity->z - cameraEntity->zOld) * timer->a; @@ -4107,7 +4277,7 @@ void Minecraft::setLevel(MultiPlayerLevel *level, int message /*=-1*/, shared_pt player->setXuid(playerXUIDOffline); player->setOnlineXuid(playerXUIDOnline); - player->displayName = ProfileManager.GetDisplayName(iPrimaryPlayer); + player->m_displayName = ProfileManager.GetDisplayName(iPrimaryPlayer); @@ -4226,8 +4396,6 @@ void Minecraft::prepareLevel(int title) if(progressRenderer != NULL) this->progressRenderer->progressStagePercentage((pp++) * 100 / max); level->getTile(spawnPos->x + x, 64, spawnPos->z + z); if (!gameMode->isCutScene()) { - while (level->updateLights()) - ; } } } @@ -4239,34 +4407,6 @@ void Minecraft::prepareLevel(int title) } } -void Minecraft::fileDownloaded(const wstring& name, File *file) -{ - int p = (int)name.find(L"/"); - wstring category = name.substr(0, p); - wstring name2 = name.substr(p + 1); - toLower(category); - if (category==L"sound") - { - soundEngine->add(name, file); - } - else if (category==L"newsound") - { - soundEngine->add(name, file); - } - else if (category==L"streaming") - { - soundEngine->addStreaming(name, file); - } - else if (category==L"music") - { - soundEngine->addMusic(name, file); - } - else if (category==L"newmusic") - { - soundEngine->addMusic(name, file); - } -} - wstring Minecraft::gatherStats1() { //return levelRenderer->gatherStats1(); @@ -4300,7 +4440,6 @@ void Minecraft::respawnPlayer(int iPad, int dimension, int newEntityId) if (localPlayer != NULL) { - level->removeEntity(localPlayer); } @@ -4321,7 +4460,7 @@ void Minecraft::respawnPlayer(int iPad, int dimension, int newEntityId) player->setOnlineXuid(playerXUIDOnline); player->setIsGuest( ProfileManager.IsGuest(iTempPad) ); - player->displayName = ProfileManager.GetDisplayName(iPad); + player->m_displayName = ProfileManager.GetDisplayName(iPad); player->SetXboxPad(iTempPad); @@ -4520,24 +4659,26 @@ void Minecraft::main() #endif // 4J Stu - This block generates XML for the game rules schema - //for(unsigned int i = 0; i < Item::items.length; ++i) - //{ - // if(Item::items[i] != NULL) - // { - // wprintf(L"%ls\n", i, app.GetString( Item::items[i]->getDescriptionId() )); - // } - //} +#if 0 + for(unsigned int i = 0; i < Item::items.length; ++i) + { + if(Item::items[i] != NULL) + { + app.DebugPrintf("%ls\n", i, app.GetString( Item::items[i]->getDescriptionId() )); + } + } - //wprintf(L"\n\n\n\n\n"); - // - //for(unsigned int i = 0; i < 256; ++i) - //{ - // if(Tile::tiles[i] != NULL) - // { - // wprintf(L"%ls\n", i, app.GetString( Tile::tiles[i]->getDescriptionId() )); - // } - //} - //__debugbreak(); + app.DebugPrintf("\n\n\n\n\n"); + + for(unsigned int i = 0; i < 256; ++i) + { + if(Tile::tiles[i] != NULL) + { + app.DebugPrintf("%ls\n", i, app.GetString( Tile::tiles[i]->getDescriptionId() )); + } + } + __debugbreak(); +#endif // 4J-PB - Can't call this for the first 5 seconds of a game - MS rule //if (ProfileManager.IsFullVersion()) @@ -4577,7 +4718,7 @@ bool Minecraft::useFancyGraphics() bool Minecraft::useAmbientOcclusion() { - return (m_instance != NULL && m_instance->options->ambientOcclusion); + return (m_instance != NULL && m_instance->options->ambientOcclusion != Options::AO_OFF); } bool Minecraft::renderDebug() @@ -4587,43 +4728,6 @@ bool Minecraft::renderDebug() bool Minecraft::handleClientSideCommand(const wstring& chatMessage) { - /* 4J - TODO - if (chatMessage.startsWith("/")) { - if (DEADMAU5_CAMERA_CHEATS) { - if (chatMessage.startsWith("/follow")) { - String[] tokens = chatMessage.split(" "); - if (tokens.length >= 2) { - String playerName = tokens[1]; - - boolean found = false; - for (Player player : level.players) { - if (playerName.equalsIgnoreCase(player.name)) { - cameraTargetPlayer = player; - found = true; - break; - } - } - - if (!found) { - try { - int entityId = Integer.parseInt(playerName); - for (Entity e : level.entities) { - if (e.entityId == entityId && e instanceof Mob) { - cameraTargetPlayer = (Mob) e; - found = true; - break; - } - } - } catch (NumberFormatException e) { - } - } - } - - return true; - } - } - } - */ return false; } @@ -4848,7 +4952,7 @@ void Minecraft::inGameSignInCheckAllPrivilegesCallback(LPVOID lpParam, bool hasP { UINT uiIDA[1]; uiIDA[0]=IDS_OK; - ui.RequestMessageBox(IDS_MULTIPLAYER_FULL_TITLE, IDS_MULTIPLAYER_FULL_TEXT, uiIDA, 1); + ui.RequestErrorMessage(IDS_MULTIPLAYER_FULL_TITLE, IDS_MULTIPLAYER_FULL_TEXT, uiIDA, 1); ProfileManager.RemoveGamepadFromGame(iPad); } else if( ProfileManager.IsSignedInLive(iPad) && ProfileManager.AllowedToPlayMultiplayer(iPad) ) @@ -4876,7 +4980,11 @@ void Minecraft::inGameSignInCheckAllPrivilegesCallback(LPVOID lpParam, bool hasP } #endif +#ifdef _XBOX_ONE +int Minecraft::InGame_SignInReturned(void *pParam,bool bContinue, int iPad, int iController) +#else int Minecraft::InGame_SignInReturned(void *pParam,bool bContinue, int iPad) +#endif { Minecraft* pMinecraftClass = (Minecraft*)pParam; @@ -4905,7 +5013,7 @@ int Minecraft::InGame_SignInReturned(void *pParam,bool bContinue, int iPad) { UINT uiIDA[1]; uiIDA[0]=IDS_OK; - ui.RequestMessageBox(IDS_MULTIPLAYER_FULL_TITLE, IDS_MULTIPLAYER_FULL_TEXT, uiIDA, 1); + ui.RequestErrorMessage(IDS_MULTIPLAYER_FULL_TITLE, IDS_MULTIPLAYER_FULL_TEXT, uiIDA, 1); #ifdef _DURANGO ProfileManager.RemoveGamepadFromGame(iPad); #endif @@ -4949,7 +5057,7 @@ int Minecraft::InGame_SignInReturned(void *pParam,bool bContinue, int iPad) //ProfileManager.RequestConvertOfflineToGuestUI( &Minecraft::InGame_SignInReturned, pMinecraftClass,iPad); UINT uiIDA[1]; uiIDA[0]=IDS_CONFIRM_OK; - ui.RequestMessageBox( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,iPad,NULL,NULL, app.GetStringTable()); + ui.RequestErrorMessage( IDS_NO_MULTIPLAYER_PRIVILEGE_TITLE, IDS_NO_MULTIPLAYER_PRIVILEGE_JOIN_TEXT, uiIDA,1,iPad); #ifdef _DURANGO ProfileManager.RemoveGamepadFromGame(iPad); #endif @@ -5016,14 +5124,14 @@ ColourTable *Minecraft::getColourTable() #if defined __ORBIS__ int Minecraft::MustSignInReturnedPSN(void *pParam, int iPad, C4JStorage::EMessageResult result) { - Minecraft* pMinecraft = (Minecraft *)pParam; + Minecraft* pMinecraft = (Minecraft *)pParam; - if(result == C4JStorage::EMessage_ResultAccept) - { + if(result == C4JStorage::EMessage_ResultAccept) + { SQRNetworkManager_Orbis::AttemptPSNSignIn(&Minecraft::InGame_SignInReturned, pMinecraft, false, iPad); - } + } - return 0; + return 0; } #endif diff --git a/Minecraft.Client/Minecraft.h b/Minecraft.Client/Minecraft.h index caec4702..cc1e5d18 100644 --- a/Minecraft.Client/Minecraft.h +++ b/Minecraft.Client/Minecraft.h @@ -41,6 +41,7 @@ class PsPlusUpsellWrapper; #include "..\Minecraft.World\File.h" #include "..\Minecraft.World\DisconnectPacket.h" #include "..\Minecraft.World\C4JThread.h" +#include "ResourceLocation.h" using namespace std; @@ -51,6 +52,9 @@ private: linux, solaris, windows, macos, unknown, xbox }; + static ResourceLocation DEFAULT_FONT_LOCATION; + static ResourceLocation ALT_FONT_LOCATION; + public: static const wstring VERSION_STRING; Minecraft(Component *mouseComponent, Canvas *parent, MinecraftApplet *minecraftApplet, int width, int height, bool fullscreen); @@ -119,7 +123,8 @@ public: void updatePlayerViewportAssignments(); int unoccupiedQuadrant; // 4J - added - shared_ptr cameraTargetPlayer; + shared_ptr cameraTargetPlayer; + shared_ptr crosshairPickMob; ParticleEngine *particleEngine; User *user; wstring serverDomain; @@ -193,11 +198,6 @@ public: private: static File workDir; -public: - static File getWorkingDirectory(); - static File getWorkingDirectory(const wstring& applicationName); -private: - static OS getPlatform(); public: LevelStorageSource *getLevelSource(); void setScreen(Screen *screen); @@ -280,7 +280,6 @@ public: // 4J-PB - added to force in the 'other' level when the main player creates the level at game load time void forceaddLevel(MultiPlayerLevel *level); void prepareLevel(int title); // 4J - changed to public - void fileDownloaded(const wstring& name, File *file); // OpenGLCapabilities getOpenGLCapabilities(); // 4J - removed wstring gatherStats1(); @@ -305,8 +304,10 @@ public: #ifdef _DURANGO static void inGameSignInCheckAllPrivilegesCallback(LPVOID lpParam, bool hasPrivileges, int iPad); -#endif + static int InGame_SignInReturned(void *pParam,bool bContinue, int iPad, int iController); +#else static int InGame_SignInReturned(void *pParam,bool bContinue, int iPad); +#endif // 4J-PB Screen * getScreen(); diff --git a/Minecraft.Client/MinecraftServer.cpp b/Minecraft.Client/MinecraftServer.cpp index ceb9554b..4206a399 100644 --- a/Minecraft.Client/MinecraftServer.cpp +++ b/Minecraft.Client/MinecraftServer.cpp @@ -3,17 +3,19 @@ #include -#include "Options.h" -#include "MinecraftServer.h" #include "ConsoleInput.h" -#include "PlayerList.h" -#include "ServerLevel.h" #include "DerivedServerLevel.h" +#include "DispenserBootstrap.h" #include "EntityTracker.h" -#include "ServerConnection.h" -#include "Settings.h" +#include "MinecraftServer.h" +#include "Options.h" +#include "PlayerList.h" #include "ServerChunkCache.h" +#include "ServerConnection.h" +#include "ServerLevel.h" #include "ServerLevelListener.h" +#include "Settings.h" +#include "..\Minecraft.World\Command.h" #include "..\Minecraft.World\AABB.h" #include "..\Minecraft.World\Vec3.h" #include "..\Minecraft.World\net.minecraft.network.h" @@ -48,6 +50,10 @@ #include "..\Minecraft.World\BiomeSource.h" #include "PlayerChunkMap.h" #include "Common\Telemetry\TelemetryManager.h" +#include "PlayerConnection.h" +#ifdef _XBOX_ONE +#include "Durango\Network\NetworkPlayerDurango.h" +#endif #define DEBUG_SERVER_DONT_SPAWN_MOBS 0 @@ -60,9 +66,15 @@ __int64 MinecraftServer::setTimeOfDay = 0; bool MinecraftServer::m_bPrimaryPlayerSignedOut=false; bool MinecraftServer::s_bServerHalted=false; bool MinecraftServer::s_bSaveOnExitAnswered=false; +#ifdef _ACK_CHUNK_SEND_THROTTLING +bool MinecraftServer::s_hasSentEnoughPackets = false; +__int64 MinecraftServer::s_tickStartTime = 0; +vector MinecraftServer::s_sentTo; +#else int MinecraftServer::s_slowQueuePlayerIndex = 0; int MinecraftServer::s_slowQueueLastTime = 0; bool MinecraftServer::s_slowQueuePacketSent = false; +#endif unordered_map MinecraftServer::ironTimers; @@ -70,15 +82,15 @@ MinecraftServer::MinecraftServer() { // 4J - added initialisers connection = NULL; - settings = NULL; - players = NULL; + settings = NULL; + players = NULL; commands = NULL; - running = true; + running = true; m_bLoaded = false; stopped = false; - tickCount = 0; + tickCount = 0; wstring progressStatus; - progress = 0; + progress = 0; motd = L""; m_isServerPaused = false; @@ -90,9 +102,13 @@ MinecraftServer::MinecraftServer() m_ugcPlayersVersion = 0; m_texturePackId = 0; maxBuildHeight = Level::maxBuildHeight; + playerIdleTimeout = 0; m_postUpdateThread = NULL; + forceGameType = false; commandDispatcher = new ServerCommandDispatcher(); + + DispenserBootstrap::bootStrap(); } MinecraftServer::~MinecraftServer() @@ -103,171 +119,171 @@ bool MinecraftServer::initServer(__int64 seed, NetworkGameInitData *initData, DW { // 4J - removed #if 0 - commands = new ConsoleCommands(this); + 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.DebugPrintf("\n*** SERVER SETTINGS ***\n"); + app.DebugPrintf("ServerSettings: host-friends-only is %s\n",(app.GetGameHostOption(eGameHostOption_FriendsOfFriends)>0)?"on":"off"); + app.DebugPrintf("ServerSettings: game-type is %s\n",(app.GetGameHostOption(eGameHostOption_GameType)==0)?"Survival Mode":"Creative Mode"); + app.DebugPrintf("ServerSettings: pvp is %s\n",(app.GetGameHostOption(eGameHostOption_PvP)>0)?"on":"off"); + app.DebugPrintf("ServerSettings: fire spreads is %s\n",(app.GetGameHostOption(eGameHostOption_FireSpreads)>0)?"on":"off"); + app.DebugPrintf("ServerSettings: tnt explodes is %s\n",(app.GetGameHostOption(eGameHostOption_TNT)>0)?"on":"off"); + app.DebugPrintf("\n"); - // TODO 4J Stu - Init a load of settings based on data passed as params - //settings->setBooleanAndSave( L"host-friends-only", (app.GetGameHostOption(eGameHostOption_FriendsOfFriends)>0) ); + // TODO 4J Stu - Init a load of settings based on data passed as params + //settings->setBooleanAndSave( L"host-friends-only", (app.GetGameHostOption(eGameHostOption_FriendsOfFriends)>0) ); - // 4J - Unused - //localIp = settings->getString(L"server-ip", L""); - //onlineMode = settings->getBoolean(L"online-mode", true); - //motd = settings->getString(L"motd", L"A Minecraft Server"); - //motd.replace('§', '$'); + // 4J - Unused + //localIp = settings->getString(L"server-ip", L""); + //onlineMode = settings->getBoolean(L"online-mode", true); + //motd = settings->getString(L"motd", L"A Minecraft Server"); + //motd.replace('§', '$'); - setAnimals(settings->getBoolean(L"spawn-animals", true)); - setNpcsEnabled(settings->getBoolean(L"spawn-npcs", true)); - setPvpAllowed(app.GetGameHostOption( eGameHostOption_PvP )>0?true:false); // settings->getBoolean(L"pvp", true); + setAnimals(settings->getBoolean(L"spawn-animals", true)); + setNpcsEnabled(settings->getBoolean(L"spawn-npcs", true)); + setPvpAllowed(app.GetGameHostOption( eGameHostOption_PvP )>0?true:false); // settings->getBoolean(L"pvp", true); - // 4J Stu - We should never have hacked clients flying when they shouldn't be like the PC version, so enable flying always - // Fix for #46612 - TU5: Code: Multiplayer: A client can be banned for flying when accidentaly being blown by dynamite - setFlightAllowed(true); //settings->getBoolean(L"allow-flight", false); + // 4J Stu - We should never have hacked clients flying when they shouldn't be like the PC version, so enable flying always + // Fix for #46612 - TU5: Code: Multiplayer: A client can be banned for flying when accidentaly being blown by dynamite + setFlightAllowed(true); //settings->getBoolean(L"allow-flight", false); - // 4J Stu - Enabling flight to stop it kicking us when we use it + // 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 = settings->getString(L"level-name", L"world"); - wstring levelTypeString; + wstring levelName = settings->getString(L"level-name", L"world"); + wstring levelTypeString; - bool gameRuleUseFlatWorld = false; - if(app.getLevelGenerationOptions() != NULL) - { - gameRuleUseFlatWorld = app.getLevelGenerationOptions()->getuseFlatWorld(); - } - if(gameRuleUseFlatWorld || app.GetGameHostOption(eGameHostOption_LevelType)>0) - { - levelTypeString = settings->getString(L"level-type", L"flat"); - } - else - { - levelTypeString = settings->getString(L"level-type",L"default"); - } + bool gameRuleUseFlatWorld = false; + if(app.getLevelGenerationOptions() != NULL) + { + gameRuleUseFlatWorld = app.getLevelGenerationOptions()->getuseFlatWorld(); + } + if(gameRuleUseFlatWorld || app.GetGameHostOption(eGameHostOption_LevelType)>0) + { + levelTypeString = settings->getString(L"level-type", L"flat"); + } + else + { + levelTypeString = settings->getString(L"level-type",L"default"); + } - LevelType *pLevelType = LevelType::getLevelType(levelTypeString); - if (pLevelType == NULL) - { - pLevelType = LevelType::lvl_normal; - } + LevelType *pLevelType = LevelType::getLevelType(levelTypeString); + if (pLevelType == NULL) + { + pLevelType = LevelType::lvl_normal; + } - ProgressRenderer *mcprogress = Minecraft::GetInstance()->progressRenderer; - mcprogress->progressStart(IDS_PROGRESS_INITIALISING_SERVER); + ProgressRenderer *mcprogress = Minecraft::GetInstance()->progressRenderer; + mcprogress->progressStart(IDS_PROGRESS_INITIALISING_SERVER); - if( findSeed ) - { + if( findSeed ) + { #ifdef __PSVITA__ - seed = BiomeSource::findSeed(pLevelType, &running); + seed = BiomeSource::findSeed(pLevelType, &running); #else - seed = BiomeSource::findSeed(pLevelType); + seed = BiomeSource::findSeed(pLevelType); #endif - } + } - setMaxBuildHeight(settings->getInt(L"max-build-height", Level::maxBuildHeight)); - setMaxBuildHeight(((getMaxBuildHeight() + 8) / 16) * 16); - setMaxBuildHeight(Mth::clamp(getMaxBuildHeight(), 64, Level::maxBuildHeight)); - //settings->setProperty(L"max-build-height", maxBuildHeight); + setMaxBuildHeight(settings->getInt(L"max-build-height", Level::maxBuildHeight)); + setMaxBuildHeight(((getMaxBuildHeight() + 8) / 16) * 16); + setMaxBuildHeight(Mth::clamp(getMaxBuildHeight(), 64, Level::maxBuildHeight)); + //settings->setProperty(L"max-build-height", maxBuildHeight); #if 0 - wstring levelSeedString = settings->getString(L"level-seed", L""); - __int64 levelSeed = (new Random())->nextLong(); - if (levelSeedString.length() > 0) - { - long newSeed = _fromString<__int64>(levelSeedString); - if (newSeed != 0) { - levelSeed = newSeed; - } - } -#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 +321,7 @@ int MinecraftServer::runPostUpdate(void* lpParam) } Sleep(1); } while (!server->m_postUpdateTerminate && ShutdownManager::ShouldRun(ShutdownManager::ePostProcessThread)); -//#ifndef __PS3__ + //#ifndef __PS3__ // One final pass through updates to make sure we're done EnterCriticalSection(&server->m_postProcessCS); int maxRequests = server->m_postProcessRequests.size(); @@ -325,7 +341,7 @@ int MinecraftServer::runPostUpdate(void* lpParam) EnterCriticalSection(&server->m_postProcessCS); } LeaveCriticalSection(&server->m_postProcessCS); -//#endif //__PS3__ + //#endif //__PS3__ Tile::ReleaseThreadStorage(); IntCache::ReleaseThreadStorage(); AABB::ReleaseThreadStorage(); @@ -377,15 +393,15 @@ void MinecraftServer::postProcessTerminate(ProgressRenderer *mcprogress) bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring& name, __int64 levelSeed, LevelType *pLevelType, NetworkGameInitData *initData) { -// 4J - TODO - do with new save stuff -// if (storageSource->requiresConversion(name)) -// { -// assert(false); -// } + // 4J - TODO - do with new save stuff + // if (storageSource->requiresConversion(name)) + // { + // assert(false); + // } ProgressRenderer *mcprogress = Minecraft::GetInstance()->progressRenderer; // 4J TODO - free levels here if there are already some? - levels = ServerLevelArray(3); + levels = ServerLevelArray(3); int gameTypeId = settings->getInt(L"gamemode", app.GetGameHostOption(eGameHostOption_GameType));//LevelSettings::GAMETYPE_SURVIVAL); GameType *gameType = LevelSettings::validateGameType(gameTypeId); @@ -404,7 +420,7 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring #ifdef SPLIT_SAVES ConsoleSaveFileOriginal oldFormatSave( initData->saveData->saveName, initData->saveData->data, initData->saveData->fileSize, false, initData->savePlatform ); ConsoleSaveFile* pSave = new ConsoleSaveFileSplit( &oldFormatSave ); - + //ConsoleSaveFile* pSave = new ConsoleSaveFileSplit( initData->saveData->saveName, initData->saveData->data, initData->saveData->fileSize, false, initData->savePlatform ); #else ConsoleSaveFile* pSave = new ConsoleSaveFileOriginal( initData->saveData->saveName, initData->saveData->data, initData->saveData->fileSize, false, initData->savePlatform ); @@ -444,21 +460,21 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring #endif } -// McRegionLevelStorage *storage = new McRegionLevelStorage(new ConsoleSaveFile( L"" ), L"", L"", 0); // original -// McRegionLevelStorage *storage = new McRegionLevelStorage(File(L"."), name, true); // TODO - for (unsigned int i = 0; i < levels.length; i++) + // McRegionLevelStorage *storage = new McRegionLevelStorage(new ConsoleSaveFile( L"" ), L"", L"", 0); // original + // McRegionLevelStorage *storage = new McRegionLevelStorage(File(L"."), name, true); // TODO + for (unsigned int i = 0; i < levels.length; i++) { if( s_bServerHalted || !g_NetworkManager.IsInSession() ) { - return false; + return false; } -// String levelName = name; -// if (i == 1) levelName += "_nether"; + // String levelName = name; + // if (i == 1) levelName += "_nether"; int dimension = 0; if (i == 1) dimension = -1; if (i == 2) dimension = 1; - if (i == 0) + if (i == 0) { levels[i] = new ServerLevel(this, storage, name, dimension, levelSettings); if(app.getLevelGenerationOptions() != NULL) @@ -473,24 +489,31 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring levels[i]->getLevelData()->setHasBeenInCreative(mapOptions->isFromDLC()); } } - else levels[i] = new DerivedServerLevel(this, storage, name, dimension, levelSettings, levels[0]); -// levels[i]->addListener(new ServerLevelListener(this, levels[i])); // 4J - have moved this to the ServerLevel ctor so that it is set up in time for the first chunk to load, which might actually happen there + else levels[i] = new DerivedServerLevel(this, storage, name, dimension, levelSettings, levels[0]); + // levels[i]->addListener(new ServerLevelListener(this, levels[i])); // 4J - have moved this to the ServerLevel ctor so that it is set up in time for the first chunk to load, which might actually happen there // 4J Stu - We set the levels difficulty based on the minecraft options - //levels[i]->difficulty = settings->getBoolean(L"spawn-monsters", true) ? Difficulty::EASY : Difficulty::PEACEFUL; + //levels[i]->difficulty = settings->getBoolean(L"spawn-monsters", true) ? Difficulty::EASY : Difficulty::PEACEFUL; Minecraft *pMinecraft = Minecraft::GetInstance(); -// m_lastSentDifficulty = pMinecraft->options->difficulty; + // m_lastSentDifficulty = pMinecraft->options->difficulty; levels[i]->difficulty = app.GetGameHostOption(eGameHostOption_Difficulty); //pMinecraft->options->difficulty; app.DebugPrintf("MinecraftServer::loadLevel - Difficulty = %d\n",levels[i]->difficulty); #if DEBUG_SERVER_DONT_SPAWN_MOBS - levels[i]->setSpawnSettings(false, false); + levels[i]->setSpawnSettings(false, false); #else levels[i]->setSpawnSettings(settings->getBoolean(L"spawn-monsters", true), animals); #endif levels[i]->getLevelData()->setGameType(gameType); - players->setLevel(levels); - } + + if(app.getLevelGenerationOptions() != NULL) + { + LevelGenerationOptions *mapOptions = app.getLevelGenerationOptions(); + levels[i]->getLevelData()->setHasBeenInCreative(mapOptions->getLevelHasBeenInCreative() ); + } + + players->setLevel(levels); + } if( levels[0]->isNew ) { @@ -548,19 +571,31 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring csf->closeHandle(fe); } - __int64 lastTime = System::currentTimeMillis(); + __int64 lastTime = System::currentTimeMillis(); +#ifdef _LARGE_WORLDS + if(app.GetGameNewWorldSize() > levels[0]->getLevelData()->getXZSizeOld()) + { + if(!app.GetGameNewWorldSizeUseMoat()) // check the moat settings to see if we should be overwriting the edge tiles + { + overwriteBordersForNewWorldSize(levels[0]); + } + // we're always overwriting hell edges + int oldHellSize = levels[0]->getLevelData()->getXZHellSizeOld(); + overwriteHellBordersForNewWorldSize(levels[1], oldHellSize); + } +#endif // 4J Stu - This loop is changed in 1.0.1 to only process the first level (ie the overworld), but I think we still want to do them all int i = 0; - for (int i = 0; i < levels.length ; i++) + for (int i = 0; i < levels.length ; i++) { -// logger.info("Preparing start region for level " + i); - if (i == 0 || settings->getBoolean(L"allow-nether", true)) + // logger.info("Preparing start region for level " + i); + if (i == 0 || settings->getBoolean(L"allow-nether", true)) { - ServerLevel *level = levels[i]; + ServerLevel *level = levels[i]; if(levelChunksNeedConverted) { -// storage->getSaveFile()->convertLevelChunks(level) + // storage->getSaveFile()->convertLevelChunks(level) } #if 0 @@ -588,13 +623,13 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring } #else __int64 lastStorageTickTime = System::currentTimeMillis(); - Pos *spawnPos = level->getSharedSpawnPos(); + Pos *spawnPos = level->getSharedSpawnPos(); int twoRPlusOne = r*2 + 1; int total = twoRPlusOne * twoRPlusOne; - for (int x = -r; x <= r && running; x += 16) + for (int x = -r; x <= r && running; x += 16) { - for (int z = -r; z <= r && running; z += 16) + for (int z = -r; z <= r && running; z += 16) { if( s_bServerHalted || !g_NetworkManager.IsInSession() ) { @@ -603,22 +638,22 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring postProcessTerminate(mcprogress); return false; } -// printf(">>>%d %d %d\n",i,x,z); -// __int64 now = System::currentTimeMillis(); -// if (now < lastTime) lastTime = now; -// if (now > lastTime + 1000) + // printf(">>>%d %d %d\n",i,x,z); + // __int64 now = System::currentTimeMillis(); + // if (now < lastTime) lastTime = now; + // if (now > lastTime + 1000) { - int pos = (x + r) * twoRPlusOne + (z + 1); -// setProgress(L"Preparing spawn area", (pos) * 100 / total); + int pos = (x + r) * twoRPlusOne + (z + 1); + // setProgress(L"Preparing spawn area", (pos) * 100 / total); mcprogress->progressStagePercentage((pos+r) * 100 / total); -// lastTime = now; - } + // lastTime = now; + } static int count = 0; PIXBeginNamedEvent(0,"Creating %d ", (count++)%8); - level->cache->create((spawnPos->x + x) >> 4, (spawnPos->z + z) >> 4, true); // 4J - added parameter to disable postprocessing here + level->cache->create((spawnPos->x + x) >> 4, (spawnPos->z + z) >> 4, true); // 4J - added parameter to disable postprocessing here PIXEndNamedEvent(); -// while (level->updateLights() && running) -// ; + // while (level->updateLights() && running) + // ; if( System::currentTimeMillis() - lastStorageTickTime > 50 ) { CompressedTileStorage::tick(); @@ -626,15 +661,15 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring SparseDataStorage::tick(); lastStorageTickTime = System::currentTimeMillis(); } - } - } + } + } // 4J - removed this as now doing the recheckGaps call when each chunk is post-processed, so can happen on things outside of the spawn area too #if 0 // 4J - added this code to propagate lighting properly in the spawn area before we go sharing it with the local client or across the network - for (int x = -r; x <= r && running; x += 16) + for (int x = -r; x <= r && running; x += 16) { - for (int z = -r; z <= r && running; z += 16) + for (int z = -r; z <= r && running; z += 16) { PIXBeginNamedEvent(0,"Lighting gaps for %d %d",x,z); level->getChunkAt(spawnPos->x + x, spawnPos->z + z)->recheckGaps(true); @@ -645,9 +680,9 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring delete spawnPos; #endif - } - } -// printf("Main thread complete at %dms\n",System::currentTimeMillis() - startTime); + } + } + // printf("Main thread complete at %dms\n",System::currentTimeMillis() - startTime); // Wait for post processing, then lighting threads, to end (post-processing may make more lighting changes) m_postUpdateTerminate = true; @@ -686,12 +721,12 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring app.DebugPrintf("===================================\n"); } -// printf("Post processing complete at %dms\n",System::currentTimeMillis() - startTime); + // printf("Post processing complete at %dms\n",System::currentTimeMillis() - startTime); -// printf("Lighting complete at %dms\n",System::currentTimeMillis() - startTime); + // printf("Lighting complete at %dms\n",System::currentTimeMillis() - startTime); if( s_bServerHalted || !g_NetworkManager.IsInSession() ) return false; - + if( levels[1]->isNew ) { levels[1]->save(true, mcprogress); @@ -710,7 +745,7 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring // 4J Stu - We also want to immediately save the tutorial if ( levels[0]->isNew ) saveGameRules(); - + if( levels[0]->isNew ) { levels[0]->save(true, mcprogress); @@ -725,35 +760,107 @@ bool MinecraftServer::loadLevel(LevelStorageSource *storageSource, const wstring if( s_bServerHalted || !g_NetworkManager.IsInSession() ) return false; -/* -* int r = 24; for (int x = -r; x <= r; x++) { -* setProgress("Preparing spawn area", (x + r) * 100 / (r + r + 1)); for (int z -* = -r; z <= r; z++) { if (!running) return; level.cache.create((level.xSpawn -* >> 4) + x, (level.zSpawn >> 4) + z); while (running && level.updateLights()) -* ; } } -*/ - endProgress(); + /* + * int r = 24; for (int x = -r; x <= r; x++) { + * setProgress("Preparing spawn area", (x + r) * 100 / (r + r + 1)); for (int z + * = -r; z <= r; z++) { if (!running) return; level.cache.create((level.xSpawn + * >> 4) + x, (level.zSpawn >> 4) + z); while (running && level.updateLights()) + * ; } } + */ + endProgress(); return true; } +#ifdef _LARGE_WORLDS +void MinecraftServer::overwriteBordersForNewWorldSize(ServerLevel* level) +{ + // recreate the chunks round the border (2 chunks or 32 blocks deep), deleting any player data from them + app.DebugPrintf("Expanding level size\n"); + int oldSize = level->getLevelData()->getXZSizeOld(); + // top + int minVal = -oldSize/2; + int maxVal = (oldSize/2)-1; + for(int xVal = minVal; xVal <= maxVal; xVal++) + { + int zVal = minVal; + level->cache->overwriteLevelChunkFromSource(xVal, zVal); + level->cache->overwriteLevelChunkFromSource(xVal, zVal+1); + } + // bottom + for(int xVal = minVal; xVal <= maxVal; xVal++) + { + int zVal = maxVal; + level->cache->overwriteLevelChunkFromSource(xVal, zVal); + level->cache->overwriteLevelChunkFromSource(xVal, zVal-1); + } + // left + for(int zVal = minVal; zVal <= maxVal; zVal++) + { + int xVal = minVal; + level->cache->overwriteLevelChunkFromSource(xVal, zVal); + level->cache->overwriteLevelChunkFromSource(xVal+1, zVal); + } + // right + for(int zVal = minVal; zVal <= maxVal; zVal++) + { + int xVal = maxVal; + level->cache->overwriteLevelChunkFromSource(xVal, zVal); + level->cache->overwriteLevelChunkFromSource(xVal-1, zVal); + } +} + +void MinecraftServer::overwriteHellBordersForNewWorldSize(ServerLevel* level, int oldHellSize) +{ + // recreate the chunks round the border (1 chunk or 16 blocks deep), deleting any player data from them + app.DebugPrintf("Expanding level size\n"); + // top + int minVal = -oldHellSize/2; + int maxVal = (oldHellSize/2)-1; + for(int xVal = minVal; xVal <= maxVal; xVal++) + { + int zVal = minVal; + level->cache->overwriteHellLevelChunkFromSource(xVal, zVal, minVal, maxVal); + } + // bottom + for(int xVal = minVal; xVal <= maxVal; xVal++) + { + int zVal = maxVal; + level->cache->overwriteHellLevelChunkFromSource(xVal, zVal, minVal, maxVal); + } + // left + for(int zVal = minVal; zVal <= maxVal; zVal++) + { + int xVal = minVal; + level->cache->overwriteHellLevelChunkFromSource(xVal, zVal, minVal, maxVal); + } + // right + for(int zVal = minVal; zVal <= maxVal; zVal++) + { + int xVal = maxVal; + level->cache->overwriteHellLevelChunkFromSource(xVal, zVal, minVal, maxVal); + } +} + +#endif + void MinecraftServer::setProgress(const wstring& status, int progress) { - progressStatus = status; - this->progress = progress; -// logger.info(status + ": " + progress + "%"); + progressStatus = status; + this->progress = progress; + // logger.info(status + ": " + progress + "%"); } void MinecraftServer::endProgress() { - progressStatus = L""; - this->progress = 0; + progressStatus = L""; + this->progress = 0; } void MinecraftServer::saveAllChunks() { -// logger.info("Saving chunks"); - for (unsigned int i = 0; i < levels.length; i++) + // logger.info("Saving chunks"); + for (unsigned int i = 0; i < levels.length; i++) { // 4J Stu - Due to the way save mounting is handled on XboxOne, we can actually save after the player has signed out. #ifndef _XBOX_ONE @@ -762,7 +869,7 @@ void MinecraftServer::saveAllChunks() // 4J Stu - Save the levels in reverse order so we don't overwrite the level.dat // with the data from the nethers leveldata. // Fix for #7418 - Functional: Gameplay: Saving after sleeping in a bed will place player at nighttime when restarting. - ServerLevel *level = levels[levels.length - 1 - i]; + ServerLevel *level = levels[levels.length - 1 - i]; if( level ) // 4J - added check as level can be NULL if we end up in stopServer really early on due to network failure { level->save(true, Minecraft::GetInstance()->progressRenderer); @@ -774,7 +881,7 @@ void MinecraftServer::saveAllChunks() level->closeLevelStorage(); } } - } + } } // 4J-JEV: Added @@ -863,7 +970,7 @@ bool MinecraftServer::IsSuspending() return m_suspending; } -void MinecraftServer::stopServer() +void MinecraftServer::stopServer(bool didInit) { // 4J-PB - need to halt the rendering of the data, since we're about to remove it @@ -877,9 +984,9 @@ void MinecraftServer::stopServer() connection->stop(); app.DebugPrintf("Stopping server\n"); -// logger.info("Stopping server"); + // logger.info("Stopping server"); // 4J-PB - If the primary player has signed out, then don't attempt to save anything - + // also need to check for a profile switch here - primary player signs out, and another player signs in before dismissing the dash #ifdef _DURANGO // On Durango check if the primary user is signed in OR mid-sign-out @@ -892,8 +999,8 @@ void MinecraftServer::stopServer() // Always save on exit! Except if saves are disabled. if(!saveOnExitAnswered()) m_saveOnExit = true; #endif - // if trial version or saving is disabled, then don't save anything - if(m_saveOnExit && ProfileManager.IsFullVersion() && (!StorageManager.GetSaveDisabled())) + // if trial version or saving is disabled, then don't save anything. Also don't save anything if we didn't actually get through the server initialisation. + if(m_saveOnExit && ProfileManager.IsFullVersion() && (!StorageManager.GetSaveDisabled()) && didInit) { if (players != NULL) { @@ -907,7 +1014,7 @@ void MinecraftServer::stopServer() // ServerLevel *level = levels[i]; // if (level != NULL) // { - saveAllChunks(); + saveAllChunks(); // } //} @@ -1028,6 +1135,11 @@ void MinecraftServer::setFlightAllowed(bool allowFlight) this->allowFlight = allowFlight; } +bool MinecraftServer::isCommandBlockEnabled() +{ + return false; //settings.getBoolean("enable-command-block", false); +} + bool MinecraftServer::isNetherEnabled() { return true; //settings.getBoolean("allow-nether", true); @@ -1038,11 +1150,71 @@ bool MinecraftServer::isHardcore() return false; } +int MinecraftServer::getOperatorUserPermissionLevel() +{ + return Command::LEVEL_OWNERS; //settings.getInt("op-permission-level", Command.LEVEL_OWNERS); +} + CommandDispatcher *MinecraftServer::getCommandDispatcher() { return commandDispatcher; } +Pos *MinecraftServer::getCommandSenderWorldPosition() +{ + return new Pos(0, 0, 0); +} + +Level *MinecraftServer::getCommandSenderWorld() +{ + return levels[0]; +} + +int MinecraftServer::getSpawnProtectionRadius() +{ + return 16; +} + +bool MinecraftServer::isUnderSpawnProtection(Level *level, int x, int y, int z, shared_ptr player) +{ + if (level->dimension->id != 0) return false; + //if (getPlayers()->getOps()->empty()) return false; + if (getPlayers()->isOp(player->getName())) return false; + if (getSpawnProtectionRadius() <= 0) return false; + + Pos *spawnPos = level->getSharedSpawnPos(); + int xd = Mth::abs(x - spawnPos->x); + int zd = Mth::abs(z - spawnPos->z); + int dist = max(xd, zd); + + return dist <= getSpawnProtectionRadius(); +} + +void MinecraftServer::setForceGameType(bool forceGameType) +{ + this->forceGameType = forceGameType; +} + +bool MinecraftServer::getForceGameType() +{ + return forceGameType; +} + +__int64 MinecraftServer::getCurrentTimeMillis() +{ + return System::currentTimeMillis(); +} + +int MinecraftServer::getPlayerIdleTimeout() +{ + return playerIdleTimeout; +} + +void MinecraftServer::setPlayerIdleTimeout(int playerIdleTimeout) +{ + this->playerIdleTimeout = playerIdleTimeout; +} + extern int c0a, c0b, c1a, c1b, c1c, c2a, c2b; void MinecraftServer::run(__int64 seed, void *lpParameter) { @@ -1056,9 +1228,11 @@ void MinecraftServer::run(__int64 seed, void *lpParameter) findSeed = initData->findSeed; m_texturePackId = initData->texturePackId; } -// try { // 4J - removed try/catch/finally - if (initServer(seed, initData, initSettings,findSeed)) + // try { // 4J - removed try/catch/finally + bool didInit = false; + if (initServer(seed, initData, initSettings,findSeed)) { + didInit = true; ServerLevel *levelNormalDimension = levels[0]; // 4J-PB - Set the Stronghold position in the leveldata if there isn't one in there Minecraft *pMinecraft = Minecraft::GetInstance(); @@ -1075,30 +1249,30 @@ void MinecraftServer::run(__int64 seed, void *lpParameter) } } - __int64 lastTime = System::currentTimeMillis(); - __int64 unprocessedTime = 0; - while (running && !s_bServerHalted) + __int64 lastTime = getCurrentTimeMillis(); + __int64 unprocessedTime = 0; + while (running && !s_bServerHalted) { - __int64 now = System::currentTimeMillis(); + __int64 now = getCurrentTimeMillis(); // 4J Stu - When we pause the server, we don't want to count that as time passed // 4J Stu - TU-1 hotifx - Remove this line. We want to make sure that we tick connections at the proper rate when paused //Fix for #13191 - The host of a game can get a message informing them that the connection to the server has been lost //if(m_isServerPaused) lastTime = now; - __int64 passedTime = now - lastTime; - if (passedTime > MS_PER_TICK * 40) + __int64 passedTime = now - lastTime; + if (passedTime > MS_PER_TICK * 40) { -// logger.warning("Can't keep up! Did the system time change, or is the server overloaded?"); - passedTime = MS_PER_TICK * 40; - } - if (passedTime < 0) + // logger.warning("Can't keep up! Did the system time change, or is the server overloaded?"); + passedTime = MS_PER_TICK * 40; + } + if (passedTime < 0) { -// logger.warning("Time ran backwards! Did the system time change?"); - passedTime = 0; - } - unprocessedTime += passedTime; - lastTime = now; + // logger.warning("Time ran backwards! Did the system time change?"); + passedTime = 0; + } + unprocessedTime += passedTime; + lastTime = now; // 4J Added ability to pause the server if( !m_isServerPaused ) @@ -1111,29 +1285,18 @@ void MinecraftServer::run(__int64 seed, void *lpParameter) } else { -// int tickcount = 0; -// __int64 beforeall = System::currentTimeMillis(); + // int tickcount = 0; + // __int64 beforeall = System::currentTimeMillis(); while (unprocessedTime > MS_PER_TICK) { unprocessedTime -= MS_PER_TICK; + chunkPacketManagement_PreTick(); // __int64 before = System::currentTimeMillis(); tick(); // __int64 after = System::currentTimeMillis(); // PIXReportCounter(L"Server time",(float)(after-before)); - // 4J Ensure that the slow queue owner keeps cycling if it's not been used in a while - int time = GetTickCount(); - if( ( s_slowQueuePacketSent ) || ( (time - s_slowQueueLastTime) > ( 2 * MINECRAFT_SERVER_SLOW_QUEUE_DELAY ) ) ) - { -// app.DebugPrintf("Considering cycling: (%d) %d - %d -> %d > %d\n",s_slowQueuePacketSent, time, s_slowQueueLastTime, (time - s_slowQueueLastTime), (2*MINECRAFT_SERVER_SLOW_QUEUE_DELAY)); - MinecraftServer::cycleSlowQueueIndex(); - s_slowQueuePacketSent = false; - s_slowQueueLastTime = time; - } -// else -// { -// app.DebugPrintf("Not considering cycling: %d - %d -> %d > %d\n",time, s_slowQueueLastTime, (time - s_slowQueueLastTime), (2*MINECRAFT_SERVER_SLOW_QUEUE_DELAY)); -// } + chunkPacketManagement_PostTick(); } // __int64 afterall = System::currentTimeMillis(); // PIXReportCounter(L"Server time all",(float)(afterall-beforeall)); @@ -1155,28 +1318,26 @@ void MinecraftServer::run(__int64 seed, void *lpParameter) if(MinecraftServer::setTimeAtEndOfTick) { MinecraftServer::setTimeAtEndOfTick = false; - for (unsigned int i = 0; i < levels.length; i++) + for (unsigned int i = 0; i < levels.length; i++) { -// if (i == 0 || settings->getBoolean(L"allow-nether", true)) // 4J removed - we always have nether + // if (i == 0 || settings->getBoolean(L"allow-nether", true)) // 4J removed - we always have nether { ServerLevel *level = levels[i]; - level->setTime( MinecraftServer::setTime ); - level->setOverrideTimeOfDay( -1 ); + level->setGameTime( MinecraftServer::setTime ); } - } + } } if(MinecraftServer::setTimeOfDayAtEndOfTick) { MinecraftServer::setTimeOfDayAtEndOfTick = false; - for (unsigned int i = 0; i < levels.length; i++) + for (unsigned int i = 0; i < levels.length; i++) { if (i == 0 || settings->getBoolean(L"allow-nether", true)) { ServerLevel *level = levels[i]; - //level->setTime( MinecraftServer::setTime ); - level->setOverrideTimeOfDay( MinecraftServer::setTimeOfDay ); + level->setDayTime( MinecraftServer::setTimeOfDay ); } - } + } } // Process delayed actions @@ -1244,7 +1405,7 @@ void MinecraftServer::run(__int64 seed, void *lpParameter) { players->saveAll(Minecraft::GetInstance()->progressRenderer); } - + players->broadcastAll( shared_ptr( new UpdateProgressPacket(20) ) ); for (unsigned int j = 0; j < levels.length; j++) @@ -1255,7 +1416,7 @@ void MinecraftServer::run(__int64 seed, void *lpParameter) // Fix for #7418 - Functional: Gameplay: Saving after sleeping in a bed will place player at nighttime when restarting. ServerLevel *level = levels[levels.length - 1 - j]; level->save(true, Minecraft::GetInstance()->progressRenderer, (eAction==eXuiServerAction_AutoSaveGame)); - + players->broadcastAll( shared_ptr( new UpdateProgressPacket(33 + (j*33) ) ) ); } if( !s_bServerHalted ) @@ -1269,19 +1430,19 @@ void MinecraftServer::run(__int64 seed, void *lpParameter) case eXuiServerAction_DropItem: // Find the player, and drop the id at their feet { - shared_ptr player = players->players.at(0); - size_t id = (size_t) param; - player->drop( shared_ptr( new ItemInstance(id, 1, 0 ) ) ); + shared_ptr player = players->players.at(0); + size_t id = (size_t) param; + player->drop( shared_ptr( new ItemInstance(id, 1, 0 ) ) ); } break; case eXuiServerAction_SpawnMob: { - shared_ptr player = players->players.at(0); - eINSTANCEOF factory = (eINSTANCEOF)((size_t)param); - shared_ptr mob = dynamic_pointer_cast(EntityIO::newByEnumType(factory,player->level )); - mob->moveTo(player->x+1, player->y, player->z+1, player->level->random->nextFloat() * 360, 0); - mob->setDespawnProtected(); // 4J added, default to being protected against despawning (has to be done after initial position is set) - player->level->addEntity(mob); + shared_ptr player = players->players.at(0); + eINSTANCEOF factory = (eINSTANCEOF)((size_t)param); + shared_ptr mob = dynamic_pointer_cast(EntityIO::newByEnumType(factory,player->level )); + mob->moveTo(player->x+1, player->y, player->z+1, player->level->random->nextFloat() * 360, 0); + mob->setDespawnProtected(); // 4J added, default to being protected against despawning (has to be done after initial position is set) + player->level->addEntity(mob); } break; case eXuiServerAction_PauseServer: @@ -1318,7 +1479,7 @@ void MinecraftServer::run(__int64 seed, void *lpParameter) case eXuiServerAction_ExportSchematic: #ifndef _CONTENT_PACKAGE app.EnterSaveNotificationSection(); - + //players->broadcastAll( shared_ptr( new UpdateProgressPacket(20) ) ); if( !s_bServerHalted ) @@ -1353,13 +1514,13 @@ void MinecraftServer::run(__int64 seed, void *lpParameter) app.DebugPrintf( "DEBUG: Player=%i\n", pos->player ); app.DebugPrintf( "DEBUG: Teleporting to pos=(%f.2, %f.2, %f.2), looking at=(%f.2,%f.2)\n", - pos->m_camX, pos->m_camY, pos->m_camZ, - pos->m_yRot, pos->m_elev - ); + pos->m_camX, pos->m_camY, pos->m_camZ, + pos->m_yRot, pos->m_elev + ); shared_ptr player = players->players.at(pos->player); player->debug_setPosition( pos->m_camX, pos->m_camY, pos->m_camZ, - pos->m_yRot, pos->m_elev ); + pos->m_yRot, pos->m_elev ); // Doesn't work //player->setYHeadRot(pos->m_yRot); @@ -1368,47 +1529,47 @@ void MinecraftServer::run(__int64 seed, void *lpParameter) #endif break; } - + app.SetXuiServerAction(i,eXuiServerAction_Idle); } Sleep(1); - } - } + } + } //else //{ - // while (running) + // while (running) // { - // handleConsoleInputs(); + // handleConsoleInputs(); // Sleep(10); - // } - //} + // } + //} #if 0 +} catch (Throwable t) { + t.printStackTrace(); + logger.log(Level.SEVERE, "Unexpected exception", t); + while (running) { + handleConsoleInputs(); + try { + Thread.sleep(10); + } catch (InterruptedException e1) { + e1.printStackTrace(); + } + } +} finally { + try { + stopServer(); + stopped = true; } catch (Throwable t) { - t.printStackTrace(); - logger.log(Level.SEVERE, "Unexpected exception", t); - while (running) { - handleConsoleInputs(); - try { - Thread.sleep(10); - } catch (InterruptedException e1) { - e1.printStackTrace(); - } - } - } finally { - try { - stopServer(); - stopped = true; - } catch (Throwable t) { - t.printStackTrace(); - } finally { - System::exit(0); - } - } + t.printStackTrace(); + } finally { + System::exit(0); + } +} #endif // 4J Stu - Stop the server when the loops complete, as the finally would do - stopServer(); + stopServer(didInit); stopped = true; } @@ -1427,43 +1588,43 @@ void MinecraftServer::broadcastStopSavingPacket() void MinecraftServer::tick() { - vector toRemove; - for (AUTO_VAR(it, ironTimers.begin()); it != ironTimers.end(); it++ ) + vector toRemove; + for (AUTO_VAR(it, ironTimers.begin()); it != ironTimers.end(); it++ ) { - int t = it->second; - if (t > 0) + int t = it->second; + if (t > 0) { - ironTimers[it->first] = t - 1; - } + ironTimers[it->first] = t - 1; + } else { - toRemove.push_back(it->first); - } - } - for (unsigned int i = 0; i < toRemove.size(); i++) + toRemove.push_back(it->first); + } + } + for (unsigned int i = 0; i < toRemove.size(); i++) { - ironTimers.erase(toRemove[i]); - } + ironTimers.erase(toRemove[i]); + } - AABB::resetPool(); - Vec3::resetPool(); - - 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 +1635,19 @@ void MinecraftServer::tick() level->setSpawnSettings(level->difficulty > 0 && !Minecraft::GetInstance()->isTutorial(), animals); #endif - if (tickCount % 20 == 0) + if (tickCount % 20 == 0) { - players->broadcastAll( shared_ptr( new SetTimePacket(level->getTime() ) ), level->dimension->id); - } -// #ifndef __PS3__ + players->broadcastAll( shared_ptr( new SetTimePacket(level->getGameTime(), level->getDayTime(), level->getGameRules()->getBoolean(GameRules::RULE_DAYLIGHT) ) ), level->dimension->id); + } + // #ifndef __PS3__ static __int64 stc = 0; __int64 st0 = System::currentTimeMillis(); PIXBeginNamedEvent(0,"Level tick %d",i); - ((Level *)level)->tick(); + ((Level *)level)->tick(); __int64 st1 = System::currentTimeMillis(); PIXEndNamedEvent(); PIXBeginNamedEvent(0,"Update lights %d",i); - // 4J - used to be in a while loop, but we don't want the server locking up for a big chunk of time (could end up trying to process 1,000,000 lights...) - // Instead call this once, which will try and process up to 2000 lights per tick -// printf("lights: %d\n",level->getLightsToUpdate()); - while(level->updateLights() ) - ; + __int64 st2 = System::currentTimeMillis(); PIXEndNamedEvent(); PIXBeginNamedEvent(0,"Entity tick %d",i); @@ -1520,32 +1677,32 @@ void MinecraftServer::tick() PIXEndNamedEvent(); __int64 st3 = System::currentTimeMillis(); -// printf(">>>>>>>>>>>>>>>>>>>>>> Tick %d %d %d : %d\n", st1 - st0, st2 - st1, st3 - st2, st0 - stc ); + // printf(">>>>>>>>>>>>>>>>>>>>>> Tick %d %d %d : %d\n", st1 - st0, st2 - st1, st3 - st2, st0 - stc ); stc = st0; -// #endif// __PS3__ - } - } + // #endif// __PS3__ + } + } Entity::tickExtraWandering(); // 4J added PIXBeginNamedEvent(0,"Connection tick"); - connection->tick(); + connection->tick(); PIXEndNamedEvent(); PIXBeginNamedEvent(0,"Players tick"); - players->tick(); + players->tick(); PIXEndNamedEvent(); // 4J - removed #if 0 - for (int i = 0; i < tickables.size(); i++) { - tickables.get(i)-tick(); - } + for (int i = 0; i < tickables.size(); i++) { + tickables.get(i)-tick(); + } #endif -// try { // 4J - removed try/catch - handleConsoleInputs(); -// } catch (Exception e) { -// logger.log(Level.WARNING, "Unexpected exception while parsing console command", e); -// } + // try { // 4J - removed try/catch + handleConsoleInputs(); + // } catch (Exception e) { + // logger.log(Level.WARNING, "Unexpected exception while parsing console command", e); + // } } void MinecraftServer::handleConsoleInput(const wstring& msg, ConsoleInputSource *source) @@ -1555,13 +1712,13 @@ void MinecraftServer::handleConsoleInput(const wstring& msg, ConsoleInputSource void MinecraftServer::handleConsoleInputs() { - while (consoleInput.size() > 0) + while (consoleInput.size() > 0) { AUTO_VAR(it, consoleInput.begin()); - ConsoleInput *input = *it; + ConsoleInput *input = *it; consoleInput.erase(it); -// commands->handleCommand(input); // 4J - removed - TODO - do we want equivalent of console commands? - } + // commands->handleCommand(input); // 4J - removed - TODO - do we want equivalent of console commands? + } } void MinecraftServer::main(__int64 seed, void *lpParameter) @@ -1606,21 +1763,105 @@ wstring MinecraftServer::getConsoleName() ServerLevel *MinecraftServer::getLevel(int dimension) { - if (dimension == -1) return levels[1]; + if (dimension == -1) return levels[1]; else if (dimension == 1) return levels[2]; - else return levels[0]; + else return levels[0]; } // 4J added void MinecraftServer::setLevel(int dimension, ServerLevel *level) { - if (dimension == -1) levels[1] = level; + if (dimension == -1) levels[1] = level; else if (dimension == 1) levels[2] = level; - else levels[0] = level; + else levels[0] = level; } +#if defined _ACK_CHUNK_SEND_THROTTLING +bool MinecraftServer::chunkPacketManagement_CanSendTo(INetworkPlayer *player) +{ + if( s_hasSentEnoughPackets ) return false; + if( player == NULL ) return false; + + for( int i = 0; i < s_sentTo.size(); i++ ) + { + if( s_sentTo[i]->IsSameSystem(player) ) + { + return false; + } + } + +#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) + return ( player->GetOutstandingAckCount() < 3 ); +#else + return ( player->GetOutstandingAckCount() < 2 ); +#endif +} + +void MinecraftServer::chunkPacketManagement_DidSendTo(INetworkPlayer *player) +{ + __int64 currentTime = System::currentTimeMillis(); + + if( ( currentTime - s_tickStartTime ) >= MAX_TICK_TIME_FOR_PACKET_SENDS ) + { + s_hasSentEnoughPackets = true; +// app.DebugPrintf("Sending, setting enough packet flag: %dms\n",currentTime - s_tickStartTime); + } + else + { +// app.DebugPrintf("Sending, more time: %dms\n",currentTime - s_tickStartTime); + } + + player->SentChunkPacket(); + + s_sentTo.push_back(player); +} + +void MinecraftServer::chunkPacketManagement_PreTick() +{ +// app.DebugPrintf("*************************************************************************************************************************************************************************\n"); + s_hasSentEnoughPackets = false; + s_tickStartTime = System::currentTimeMillis(); + s_sentTo.clear(); + + vector< shared_ptr > *players = connection->getPlayers(); + + if( players->size() ) + { + vector< shared_ptr > playersOrig = *players; + players->clear(); + + do + { + int longestTime = 0; + AUTO_VAR(playerConnectionBest,playersOrig.begin()); + for( AUTO_VAR(it, playersOrig.begin()); it != playersOrig.end(); it++) + { + int thisTime = 0; + INetworkPlayer *np = (*it)->getNetworkPlayer(); + if( np ) + { + thisTime = np->GetTimeSinceLastChunkPacket_ms(); + } + + if( thisTime > longestTime ) + { + playerConnectionBest = it; + longestTime = thisTime; + } + } + players->push_back(*playerConnectionBest); + playersOrig.erase(playerConnectionBest); + } while ( playersOrig.size() > 0 ); + } +} + +void MinecraftServer::chunkPacketManagement_PostTick() +{ +} + +#else // 4J Added -bool MinecraftServer::canSendOnSlowQueue(INetworkPlayer *player) +bool MinecraftServer::chunkPacketManagement_CanSendTo(INetworkPlayer *player) { if( player == NULL ) return false; @@ -1634,6 +1875,32 @@ bool MinecraftServer::canSendOnSlowQueue(INetworkPlayer *player) return false; } +void MinecraftServer::chunkPacketManagement_DidSendTo(INetworkPlayer *player) +{ + s_slowQueuePacketSent = true; +} + +void MinecraftServer::chunkPacketManagement_PreTick() +{ +} + +void MinecraftServer::chunkPacketManagement_PostTick() +{ + // 4J Ensure that the slow queue owner keeps cycling if it's not been used in a while + int time = GetTickCount(); + if( ( s_slowQueuePacketSent ) || ( (time - s_slowQueueLastTime) > ( 2 * MINECRAFT_SERVER_SLOW_QUEUE_DELAY ) ) ) + { +// app.DebugPrintf("Considering cycling: (%d) %d - %d -> %d > %d\n",s_slowQueuePacketSent, time, s_slowQueueLastTime, (time - s_slowQueueLastTime), (2*MINECRAFT_SERVER_SLOW_QUEUE_DELAY)); + MinecraftServer::cycleSlowQueueIndex(); + s_slowQueuePacketSent = false; + s_slowQueueLastTime = time; + } +// else +// { +// app.DebugPrintf("Not considering cycling: %d - %d -> %d > %d\n",time, s_slowQueueLastTime, (time - s_slowQueueLastTime), (2*MINECRAFT_SERVER_SLOW_QUEUE_DELAY)); +// } +} + void MinecraftServer::cycleSlowQueueIndex() { if( !g_NetworkManager.IsInSession() ) return; @@ -1666,6 +1933,7 @@ void MinecraftServer::cycleSlowQueueIndex() ); // app.DebugPrintf("Cycled slow queue index to %d\n", s_slowQueuePlayerIndex); } +#endif // 4J added - sets up a vector of flags to indicate which entities (with small Ids) have been removed from the level, but are still haven't constructed a network packet // to tell a remote client about it. These small Ids shouldn't be re-used. Most of the time this method shouldn't actually do anything, in which case it will return false @@ -1682,4 +1950,4 @@ bool MinecraftServer::flagEntitiesToBeRemoved(unsigned int *flags) } } return removedFound; -} \ No newline at end of file +} diff --git a/Minecraft.Client/MinecraftServer.h b/Minecraft.Client/MinecraftServer.h index e61001a3..5f33fa85 100644 --- a/Minecraft.Client/MinecraftServer.h +++ b/Minecraft.Client/MinecraftServer.h @@ -20,6 +20,10 @@ class CommandDispatcher; #define MINECRAFT_SERVER_SLOW_QUEUE_DELAY 250 +#if defined _XBOX_ONE || defined _XBOX || defined __ORBIS__ || defined __PS3__ || defined __PSVITA__ +#define _ACK_CHUNK_SEND_THROTTLING +#endif + typedef struct _LoadSaveDataThreadParam { LPVOID data; @@ -107,6 +111,8 @@ public: bool allowFlight; wstring motd; int maxBuildHeight; + int playerIdleTimeout; + bool forceGameType; private: // 4J Added @@ -132,8 +138,12 @@ private: void endProgress(); void saveAllChunks(); void saveGameRules(); - void stopServer(); + void stopServer(bool didInit); +#ifdef _LARGE_WORLDS + void overwriteBordersForNewWorldSize(ServerLevel* level); + void overwriteHellBordersForNewWorldSize(ServerLevel* level, int oldHellSize); +#endif public: void setMaxBuildHeight(int maxBuildHeight); int getMaxBuildHeight(); @@ -148,9 +158,20 @@ public: void setPvpAllowed(bool pvp); bool isFlightAllowed(); void setFlightAllowed(bool allowFlight); + bool isCommandBlockEnabled(); bool isNetherEnabled(); bool isHardcore(); + int getOperatorUserPermissionLevel(); CommandDispatcher *getCommandDispatcher(); + Pos *getCommandSenderWorldPosition(); + Level *getCommandSenderWorld(); + int getSpawnProtectionRadius(); + bool isUnderSpawnProtection(Level *level, int x, int y, int z, shared_ptr player); + void setForceGameType(bool forceGameType); + bool getForceGameType(); + static __int64 getCurrentTimeMillis(); + int getPlayerIdleTimeout(); + void setPlayerIdleTimeout(int playerIdleTimeout); public: void halt(); @@ -220,10 +241,16 @@ private: bool m_isServerPaused; // 4J Added - A static that stores the QNet index of the player that is next allowed to send a packet in the slow queue +#ifdef _ACK_CHUNK_SEND_THROTTLING + static bool s_hasSentEnoughPackets; + static __int64 s_tickStartTime; + static vector s_sentTo; + static const int MAX_TICK_TIME_FOR_PACKET_SENDS = 35; +#else static int s_slowQueuePlayerIndex; static int s_slowQueueLastTime; -public: static bool s_slowQueuePacketSent; +#endif bool IsServerPaused() { return m_isServerPaused; } @@ -233,9 +260,14 @@ private: bool m_suspending; public: - //static int getSlowQueueIndex() { return s_slowQueuePlayerIndex; } - static bool canSendOnSlowQueue(INetworkPlayer *player); + static bool chunkPacketManagement_CanSendTo(INetworkPlayer *player); + static void chunkPacketManagement_DidSendTo(INetworkPlayer *player); +#ifndef _ACK_CHUNK_SEND_THROTTLING static void cycleSlowQueueIndex(); +#endif + + void chunkPacketManagement_PreTick(); + void chunkPacketManagement_PostTick(); void setSaveOnExit(bool save) { m_saveOnExit = save; s_bSaveOnExitAnswered = true; } void Suspend(); diff --git a/Minecraft.Client/MobRenderer.cpp b/Minecraft.Client/MobRenderer.cpp index 8874ab9c..ee512530 100644 --- a/Minecraft.Client/MobRenderer.cpp +++ b/Minecraft.Client/MobRenderer.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "MobRenderer.h" +#include "LivingEntityRenderer.h" #include "MultiPlayerLocalPlayer.h" #include "..\Minecraft.World\net.minecraft.world.entity.h" #include "..\Minecraft.World\net.minecraft.world.entity.player.h" @@ -8,508 +9,119 @@ #include "..\Minecraft.World\Mth.h" #include "entityRenderDispatcher.h" -MobRenderer::MobRenderer(Model *model, float shadow) : EntityRenderer() +MobRenderer::MobRenderer(Model *model, float shadow) : LivingEntityRenderer(model, shadow) { - this->model = model; - this->shadowRadius = shadow; - - this->armor = NULL; -} - -void MobRenderer::setArmor(Model *armor) -{ - 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..cbf8a7ab 100644 --- a/Minecraft.Client/MultiPlayerGameMode.cpp +++ b/Minecraft.Client/MultiPlayerGameMode.cpp @@ -19,8 +19,8 @@ MultiPlayerGameMode::MultiPlayerGameMode(Minecraft *minecraft, ClientConnection xDestroyBlock = -1; yDestroyBlock = -1; zDestroyBlock = -1; + destroyingItem = nullptr; destroyProgress = 0; - oDestroyProgress = 0; destroyTicks = 0; destroyDelay = 0; isDestroying = false; @@ -66,10 +66,19 @@ bool MultiPlayerGameMode::canHurtPlayer() bool MultiPlayerGameMode::destroyBlock(int x, int y, int z, int face) { - if (localPlayerMode->isReadOnly()) + if (localPlayerMode->isAdventureRestricted()) { + if (!minecraft->player->mayDestroyBlockAt(x, y, z)) { + return false; + } + } + + if (localPlayerMode->isCreative()) { - return false; - } + if (minecraft->player->getCarriedItem() != NULL && dynamic_cast(minecraft->player->getCarriedItem()->getItem()) != NULL) + { + return false; + } + } Level *level = minecraft->level; Tile *oldTile = Tile::tiles[level->getTile(x, y, z)]; @@ -79,11 +88,12 @@ bool MultiPlayerGameMode::destroyBlock(int x, int y, int z, int face) level->levelEvent(LevelEvent::PARTICLES_DESTROY_BLOCK, x, y, z, oldTile->id + (level->getData(x, y, z) << Tile::TILE_NUM_SHIFT)); int data = level->getData(x, y, z); - bool changed = level->setTile(x, y, z, 0); + bool changed = level->removeTile(x, y, z); if (changed) { oldTile->destroy(level, x, y, z, data); } + yDestroyBlock = -1; if (!localPlayerMode->isCreative()) { @@ -104,10 +114,14 @@ bool MultiPlayerGameMode::destroyBlock(int x, int y, int z, int face) void MultiPlayerGameMode::startDestroyBlock(int x, int y, int z, int face) { if(!minecraft->player->isAllowedToMine()) return; - if (localPlayerMode->isReadOnly()) + + if (localPlayerMode->isAdventureRestricted()) { - return; - } + if (!minecraft->player->mayDestroyBlockAt(x, y, z)) + { + return; + } + } if (localPlayerMode->isCreative()) { @@ -115,14 +129,18 @@ void MultiPlayerGameMode::startDestroyBlock(int x, int y, int z, int face) creativeDestroyBlock(minecraft, this, x, y, z, face); destroyDelay = 5; } - else if (!isDestroying || x != xDestroyBlock || y != yDestroyBlock || z != zDestroyBlock) + else if (!isDestroying || !sameDestroyTarget(x, y, z)) { + if (isDestroying) + { + connection->send(shared_ptr(new PlayerActionPacket(PlayerActionPacket::ABORT_DESTROY_BLOCK, xDestroyBlock, yDestroyBlock, zDestroyBlock, face))); + } connection->send( shared_ptr( new PlayerActionPacket(PlayerActionPacket::START_DESTROY_BLOCK, x, y, z, face) ) ); int t = minecraft->level->getTile(x, y, z); if (t > 0 && destroyProgress == 0) Tile::tiles[t]->attack(minecraft->level, x, y, z, minecraft->player); if (t > 0 && - (Tile::tiles[t]->getDestroyProgress(minecraft->player, minecraft->player->level, x, y, z) >= 1 || - (app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<getDestroyProgress(minecraft->player, minecraft->player->level, x, y, z) >= 1 + // ||(app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<player->getCarriedItem(); + destroyProgress = 0; destroyTicks = 0; minecraft->level->destroyTileProgress(minecraft->player->entityId, xDestroyBlock, yDestroyBlock, zDestroyBlock, (int)(destroyProgress * 10) - 1); } @@ -175,7 +193,7 @@ void MultiPlayerGameMode::continueDestroyBlock(int x, int y, int z, int face) return; } - if (x == xDestroyBlock && y == yDestroyBlock && z == zDestroyBlock) + if (sameDestroyTarget(x, y, z)) { int t = minecraft->level->getTile(x, y, z); if (t == 0) @@ -205,7 +223,6 @@ void MultiPlayerGameMode::continueDestroyBlock(int x, int y, int z, int face) connection->send( shared_ptr( new PlayerActionPacket(PlayerActionPacket::STOP_DESTROY_BLOCK, x, y, z, face) ) ); destroyBlock(x, y, z, face); destroyProgress = 0; - oDestroyProgress = 0; destroyTicks = 0; destroyDelay = 5; } @@ -231,10 +248,23 @@ float MultiPlayerGameMode::getPickRange() void MultiPlayerGameMode::tick() { ensureHasSentCarriedItem(); - oDestroyProgress = destroyProgress; //minecraft->soundEngine->playMusicTick(); } +bool MultiPlayerGameMode::sameDestroyTarget(int x, int y, int z) +{ + shared_ptr selected = minecraft->player->getCarriedItem(); + bool sameItems = destroyingItem == NULL && selected == NULL; + if (destroyingItem != NULL && selected != NULL) + { + sameItems = + selected->id == destroyingItem->id && + ItemInstance::tagMatches(selected, destroyingItem) && + (selected->isDamageableItem() || selected->getAuxValue() == destroyingItem->getAuxValue()); + } + return x == xDestroyBlock && y == yDestroyBlock && z == zDestroyBlock && sameItems; +} + void MultiPlayerGameMode::ensureHasSentCarriedItem() { int newItem = minecraft->player->inventory->selected; @@ -258,34 +288,37 @@ bool MultiPlayerGameMode::useItemOn(shared_ptr player, Level *level, sha float clickY = (float) hit->y - y; float clickZ = (float) hit->z - z; bool didSomething = false; - int t = level->getTile(x, y, z); - - if (t > 0 && player->isAllowedToUse(Tile::tiles[t])) + + if (!player->isSneaking() || player->getCarriedItem() == NULL) { - if(bTestUseOnly) + int t = level->getTile(x, y, z); + if (t > 0 && player->isAllowedToUse(Tile::tiles[t])) { - switch(t) + if(bTestUseOnly) { - case Tile::recordPlayer_Id: - case Tile::bed_Id: // special case for a bed - if (Tile::tiles[t]->TestUse(level, x, y, z, player )) + 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 +354,7 @@ bool MultiPlayerGameMode::useItemOn(shared_ptr player, Level *level, sha } else { + int t = level->getTile(x, y, z); // 4J - Bit of a hack, however seems preferable to any larger changes which would have more chance of causing unwanted side effects. // If we aren't going to be actually performing the use method locally, then call this method with its "soundOnly" parameter set to true. // This is an addition from the java version, and as its name suggests, doesn't actually perform the use locally but just makes any sounds that @@ -361,7 +395,7 @@ bool MultiPlayerGameMode::useItem(shared_ptr player, Level *level, share // 4J-PB added for tooltips to test use only if(bTestUseOnly) { - result = item->TestUse(level, player); + result = item->TestUse(item, level, player); } else { @@ -444,7 +478,7 @@ void MultiPlayerGameMode::releaseUsingItem(shared_ptr player) bool MultiPlayerGameMode::hasExperience() { - return true; + return localPlayerMode->isSurvival(); } bool MultiPlayerGameMode::hasMissTime() @@ -462,6 +496,13 @@ bool MultiPlayerGameMode::hasFarPickRange() return localPlayerMode->isCreative(); } +// Returns true when the inventory is opened from the server-side. Currently +// only happens when the player is riding a horse. +bool MultiPlayerGameMode::isServerControlledInventory() +{ + return minecraft->player->isRiding() && minecraft->player->riding->instanceof(eTYPE_HORSE); +} + bool MultiPlayerGameMode::handleCraftItem(int recipe, shared_ptr player) { short changeUid = player->containerMenu->backup(player->inventory); diff --git a/Minecraft.Client/MultiPlayerGameMode.h b/Minecraft.Client/MultiPlayerGameMode.h index c84410fa..76aa8fc8 100644 --- a/Minecraft.Client/MultiPlayerGameMode.h +++ b/Minecraft.Client/MultiPlayerGameMode.h @@ -10,8 +10,8 @@ private: int xDestroyBlock; int yDestroyBlock; int zDestroyBlock; + shared_ptr destroyingItem; float destroyProgress; - float oDestroyProgress; int destroyTicks; // 4J was float but doesn't seem to need to be int destroyDelay; bool isDestroying; @@ -39,6 +39,7 @@ private: int carriedItem; private: + bool sameDestroyTarget(int x, int y, int z); void ensureHasSentCarriedItem(); public: virtual bool useItemOn(shared_ptr player, Level *level, shared_ptr item, int x, int y, int z, int face, Vec3 *hit, bool bTestUseOnly=false, bool *pbUsedItem=NULL); @@ -55,6 +56,7 @@ public: virtual bool hasMissTime(); virtual bool hasInfiniteItems(); virtual bool hasFarPickRange(); + virtual bool isServerControlledInventory(); // 4J Stu - Added so we can send packets for this in the network game virtual bool handleCraftItem(int recipe, shared_ptr player); diff --git a/Minecraft.Client/MultiPlayerLevel.cpp b/Minecraft.Client/MultiPlayerLevel.cpp index 24b12bcd..5c27e450 100644 --- a/Minecraft.Client/MultiPlayerLevel.cpp +++ b/Minecraft.Client/MultiPlayerLevel.cpp @@ -9,18 +9,20 @@ #include "MinecraftServer.h" #include "ServerLevel.h" #include "Minecraft.h" +#include "FireworksParticles.h" #include "..\Minecraft.World\PrimedTnt.h" #include "..\Minecraft.World\Tile.h" #include "..\Minecraft.World\TileEntity.h" +#include "..\Minecraft.World\JavaMath.h" MultiPlayerLevel::ResetInfo::ResetInfo(int x, int y, int z, int tile, int data) { - this->x = x; - this->y = y; - this->z = z; - ticks = TICKS_BEFORE_RESET; - this->tile = tile; - this->data = data; + this->x = x; + this->y = y; + this->z = z; + ticks = TICKS_BEFORE_RESET; + this->tile = tile; + this->data = data; } MultiPlayerLevel::MultiPlayerLevel(ClientConnection *connection, LevelSettings *levelSettings, int dimension, int difficulty) @@ -41,7 +43,7 @@ MultiPlayerLevel::MultiPlayerLevel(ClientConnection *connection, LevelSettings * levelData->setInitialized(true); } - if(connection !=NULL) + if(connection !=NULL) { this->connections.push_back( connection ); } @@ -49,12 +51,12 @@ MultiPlayerLevel::MultiPlayerLevel(ClientConnection *connection, LevelSettings * // Fix for #62566 - TU7: Content: Gameplay: Compass needle stops pointing towards the original spawn point, once the player has entered the Nether. // 4J Stu - We should never be setting a specific spawn position for a multiplayer, this should only be set by receiving a packet from the server // (which happens when a player logs in) - //setSpawnPos(new Pos(8, 64, 8)); + //setSpawnPos(new Pos(8, 64, 8)); // The base ctor already has made some storage, so need to delete that if( this->savedDataStorage ) delete savedDataStorage; if(connection !=NULL) { - this->savedDataStorage = connection->savedDataStorage; + savedDataStorage = connection->savedDataStorage; } unshareCheckX = 0; unshareCheckZ = 0; @@ -91,27 +93,38 @@ void MultiPlayerLevel::shareChunkAt(int x, int z) void MultiPlayerLevel::tick() { PIXBeginNamedEvent(0,"Sky color changing"); - setTime(getTime() + 1); - /* 4J - change brought forward from 1.8.2 - int newDark = this->getSkyDarken(1); - if (newDark != skyDarken) + setGameTime(getGameTime() + 1); + if (getGameRules()->getBoolean(GameRules::RULE_DAYLIGHT)) { - skyDarken = newDark; - for (unsigned int i = 0; i < listeners.size(); i++) + // 4J: Debug setting added to keep it at day time +#ifndef _FINAL_BUILD + bool freezeTime = app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<skyColorChanged(); - } - }*/ + setDayTime(getDayTime() + 1); + } + } + /* 4J - change brought forward from 1.8.2 + int newDark = this->getSkyDarken(1); + if (newDark != skyDarken) + { + skyDarken = newDark; + for (unsigned int i = 0; i < listeners.size(); i++) + { + listeners[i]->skyColorChanged(); + } + }*/ PIXEndNamedEvent(); PIXBeginNamedEvent(0,"Entity re-entry"); EnterCriticalSection(&m_entitiesCS); - for (int i = 0; i < 10 && !reEntries.empty(); i++) + for (int i = 0; i < 10 && !reEntries.empty(); i++) { shared_ptr e = *(reEntries.begin()); - if (find(entities.begin(), entities.end(), e) == entities.end() ) addEntity(e); - } + if (find(entities.begin(), entities.end(), e) == entities.end() ) addEntity(e); + } LeaveCriticalSection(&m_entitiesCS); PIXEndNamedEvent(); @@ -127,21 +140,21 @@ void MultiPlayerLevel::tick() PIXBeginNamedEvent(0,"Updating resets"); unsigned int lastIndexToRemove = 0; bool eraseElements = false; - for (unsigned int i = 0; i < updatesToReset.size(); i++) + for (unsigned int i = 0; i < updatesToReset.size(); i++) { - ResetInfo& r = updatesToReset[i]; - if (--r.ticks == 0) + ResetInfo& r = updatesToReset[i]; + if (--r.ticks == 0) { - Level::setTileAndDataNoUpdate(r.x, r.y, r.z, r.tile, r.data); - Level::sendTileUpdated(r.x, r.y, r.z); - + Level::setTileAndData(r.x, r.y, r.z, r.tile, r.data, Tile::UPDATE_ALL); + Level::sendTileUpdated(r.x, r.y, r.z); + //updatesToReset.erase(updatesToReset.begin()+i); eraseElements = true; lastIndexToRemove = 0; i--; - } - } + } + } // 4J Stu - As elements in the updatesToReset vector are inserted with a fixed initial lifetime, the elements at the front should always be the oldest // Therefore we can always remove from the first element if(eraseElements) @@ -156,7 +169,7 @@ void MultiPlayerLevel::tick() // 4J - added this section. Each tick we'll check a different block, and force it to share data if it has been // more than 2 minutes since we last wanted to unshare it. This shouldn't really ever happen, and is added // here as a safe guard against accumulated memory leaks should a lot of chunks become unshared over time. - + int ls = dimension->getXZSize(); if( g_NetworkManager.IsHost() ) { @@ -232,16 +245,16 @@ void MultiPlayerLevel::tick() totalSLl += lc->getSkyLightPlanesLower(); } } - if( totalChunks ) - { - MEMORYSTATUS memStat; - GlobalMemoryStatus(&memStat); + if( totalChunks ) + { + MEMORYSTATUS memStat; + GlobalMemoryStatus(&memStat); - unsigned int totalBL = totalBLu + totalBLl; - unsigned int totalSL = totalSLu + totalSLl; - printf("%d: %d chunks, %d BL (%d + %d), %d SL (%d + %d ) (out of %d) - total %d %% (%dMB mem free)\n", - dimension->id, totalChunks, totalBL, totalBLu, totalBLl, totalSL, totalSLu, totalSLl, totalChunks * 256, ( 100 * (totalBL + totalSL) ) / ( totalChunks * 256 * 2),memStat.dwAvailPhys/(1024*1024) ); - } + unsigned int totalBL = totalBLu + totalBLl; + unsigned int totalSL = totalSLu + totalSLl; + printf("%d: %d chunks, %d BL (%d + %d), %d SL (%d + %d ) (out of %d) - total %d %% (%dMB mem free)\n", + dimension->id, totalChunks, totalBL, totalBLu, totalBLl, totalSL, totalSLu, totalSLl, totalChunks * 256, ( 100 * (totalBL + totalSL) ) / ( totalChunks * 256 * 2),memStat.dwAvailPhys/(1024*1024) ); + } } updateTick++; @@ -265,14 +278,14 @@ void MultiPlayerLevel::tick() totalData += lc->getDataPlanes(); } } - if( totalChunks ) - { - MEMORYSTATUS memStat; - GlobalMemoryStatus(&memStat); + if( totalChunks ) + { + MEMORYSTATUS memStat; + GlobalMemoryStatus(&memStat); - printf("%d: %d chunks, %d data (out of %d) - total %d %% (%dMB mem free)\n", - dimension->id, totalChunks, totalData, totalChunks * 128, ( 100 * totalData)/ ( totalChunks * 128),memStat.dwAvailPhys/(1024*1024) ); - } + printf("%d: %d chunks, %d data (out of %d) - total %d %% (%dMB mem free)\n", + dimension->id, totalChunks, totalData, totalChunks * 128, ( 100 * totalData)/ ( totalChunks * 128),memStat.dwAvailPhys/(1024*1024) ); + } } updateTick++; @@ -308,42 +321,42 @@ void MultiPlayerLevel::tick() total += thisSize; } } - printf("\n*****************************************************************************************************************************************\n"); - if( totalChunks ) - { - printf("%d (0) %d (1) %d (2) %d (4) %d (8)\n",total0/totalChunks,total1/totalChunks,total2/totalChunks,total4/totalChunks,total8/totalChunks); - MEMORYSTATUS memStat; - GlobalMemoryStatus(&memStat); + printf("\n*****************************************************************************************************************************************\n"); + if( totalChunks ) + { + printf("%d (0) %d (1) %d (2) %d (4) %d (8)\n",total0/totalChunks,total1/totalChunks,total2/totalChunks,total4/totalChunks,total8/totalChunks); + MEMORYSTATUS memStat; + GlobalMemoryStatus(&memStat); - printf("%d: %d chunks, %d KB (out of %dKB) : %d %% (%dMB mem free)\n", - dimension->id, totalChunks, total/1024, totalChunks * 32, ( ( total / 1024 ) * 100 ) / ( totalChunks * 32),memStat.dwAvailPhys/(1024*1024) ); - } + printf("%d: %d chunks, %d KB (out of %dKB) : %d %% (%dMB mem free)\n", + dimension->id, totalChunks, total/1024, totalChunks * 32, ( ( total / 1024 ) * 100 ) / ( totalChunks * 32),memStat.dwAvailPhys/(1024*1024) ); + } } updateTick++; #endif - // super.tick(); + // super.tick(); } void MultiPlayerLevel::clearResetRegion(int x0, int y0, int z0, int x1, int y1, int z1) { - for (unsigned int i = 0; i < updatesToReset.size(); i++) + for (unsigned int i = 0; i < updatesToReset.size(); i++) { - ResetInfo& r = updatesToReset[i]; - if (r.x >= x0 && r.y >= y0 && r.z >= z0 && r.x <= x1 && r.y <= y1 && r.z <= z1) + ResetInfo& r = updatesToReset[i]; + if (r.x >= x0 && r.y >= y0 && r.z >= z0 && r.x <= x1 && r.y <= y1 && r.z <= z1) { - updatesToReset.erase(updatesToReset.begin()+i); + updatesToReset.erase(updatesToReset.begin()+i); i--; - } - } + } + } } ChunkSource *MultiPlayerLevel::createChunkSource() { - chunkCache = new MultiPlayerChunkCache(this); + chunkCache = new MultiPlayerChunkCache(this); - return chunkCache; + return chunkCache; } void MultiPlayerLevel::validateSpawn() @@ -378,7 +391,7 @@ void MultiPlayerLevel::tickTiles() int xo = cp.x * 16; int zo = cp.z * 16; - LevelChunk *lc = this->getChunk(cp.x, cp.z); + LevelChunk *lc = getChunk(cp.x, cp.z); tickClientSideTiles(xo, zo, lc); } @@ -388,32 +401,32 @@ void MultiPlayerLevel::tickTiles() void MultiPlayerLevel::setChunkVisible(int x, int z, bool visible) { - if (visible) + if (visible) { chunkCache->create(x, z); } - else + else { chunkCache->drop(x, z); } - if (!visible) + if (!visible) { - this->setTilesDirty(x * 16, 0, z * 16, x * 16 + 15, Level::maxBuildHeight, z * 16 + 15); - } + setTilesDirty(x * 16, 0, z * 16, x * 16 + 15, Level::maxBuildHeight, z * 16 + 15); + } } bool MultiPlayerLevel::addEntity(shared_ptr e) { - bool ok = Level::addEntity(e); - forced.insert(e); + bool ok = Level::addEntity(e); + forced.insert(e); - if (!ok) + if (!ok) { - reEntries.insert(e); - } + reEntries.insert(e); + } - return ok; + return ok; } void MultiPlayerLevel::removeEntity(shared_ptr e) @@ -421,50 +434,50 @@ void MultiPlayerLevel::removeEntity(shared_ptr e) // 4J Stu - Add this remove from the reEntries collection to stop us continually removing and re-adding things, // in particular the MultiPlayerLocalPlayer when they die AUTO_VAR(it, reEntries.find(e)); - if (it!=reEntries.end()) + if (it!=reEntries.end()) { - reEntries.erase(it); - } + reEntries.erase(it); + } - Level::removeEntity(e); - forced.erase(e); + Level::removeEntity(e); + forced.erase(e); } void MultiPlayerLevel::entityAdded(shared_ptr e) { - Level::entityAdded(e); + Level::entityAdded(e); AUTO_VAR(it, reEntries.find(e)); - if (it!=reEntries.end()) + if (it!=reEntries.end()) { - reEntries.erase(it); - } + reEntries.erase(it); + } } void MultiPlayerLevel::entityRemoved(shared_ptr e) { - Level::entityRemoved(e); + Level::entityRemoved(e); AUTO_VAR(it, forced.find(e)); - if (it!=forced.end()) + if (it!=forced.end()) { - reEntries.insert(e); - } + reEntries.insert(e); + } } void MultiPlayerLevel::putEntity(int id, shared_ptr e) { - shared_ptr old = getEntity(id); - if (old != NULL) + shared_ptr old = getEntity(id); + if (old != NULL) { - removeEntity(old); - } + removeEntity(old); + } - forced.insert(e); - e->entityId = id; - if (!addEntity(e)) + forced.insert(e); + e->entityId = id; + if (!addEntity(e)) { - this->reEntries.insert(e); - } - entitiesById[id] = e; + reEntries.insert(e); + } + entitiesById[id] = e; } shared_ptr MultiPlayerLevel::getEntity(int id) @@ -488,7 +501,7 @@ shared_ptr MultiPlayerLevel::removeEntity(int id) else { } - return e; + return e; } // 4J Added to remove the entities from the forced list @@ -510,29 +523,40 @@ void MultiPlayerLevel::removeEntities(vector > *list) Level::removeEntities(list); } -bool MultiPlayerLevel::setDataNoUpdate(int x, int y, int z, int data) -{ - 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... + + + Sí + + + 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... - - - Sí - - - 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... + + + Sì + + + 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... - - - Sì - - - No - - - Normale - - - Superpiatto - - - Se attivato, il gioco sarà un gioco online. - - - Se attivato, i giocatori potranno unirsi solo su invito. - - - Se attivato, gli amici delle persone 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. + + Sí - - 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... - - - Sí - - - 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. + + På - - 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 ... - - - På - - - 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ã - - - 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ã + + + 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ã - - 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 ... + + + PÃ¥ + + + 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 ... - - - PÃ¥ - - - 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 - - - AÄŸ - - - 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 + + + Aç + + + 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 - - - Aç - - - 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 + + + AÄŸ + + + 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..e9b37fc6 100644 --- a/Minecraft.Client/PendingConnection.cpp +++ b/Minecraft.Client/PendingConnection.cpp @@ -24,14 +24,14 @@ PendingConnection::PendingConnection(MinecraftServer *server, Socket *socket, co { // 4J - added initialisers done = false; - _tick = 0; - name = L""; - acceptedLogin = nullptr; + _tick = 0; + name = L""; + acceptedLogin = nullptr; loginKey = L""; - this->server = server; - connection = new Connection(socket, id, this); - connection->fakeLag = FAKE_LAG; + this->server = server; + connection = new Connection(socket, id, this); + connection->fakeLag = FAKE_LAG; } PendingConnection::~PendingConnection() @@ -41,50 +41,50 @@ PendingConnection::~PendingConnection() void PendingConnection::tick() { - if (acceptedLogin != NULL) + if (acceptedLogin != NULL) { - this->handleAcceptedLogin(acceptedLogin); - acceptedLogin = nullptr; - } - if (_tick++ == MAX_TICKS_BEFORE_LOGIN) + this->handleAcceptedLogin(acceptedLogin); + acceptedLogin = nullptr; + } + if (_tick++ == MAX_TICKS_BEFORE_LOGIN) { - disconnect(DisconnectPacket::eDisconnect_LoginTooLong); - } + disconnect(DisconnectPacket::eDisconnect_LoginTooLong); + } else { - connection->tick(); - } + connection->tick(); + } } void PendingConnection::disconnect(DisconnectPacket::eDisconnectReason reason) { - // try { // 4J - removed try/catch -// logger.info("Disconnecting " + getName() + ": " + reason); - app.DebugPrintf("Pending connection disconnect: %d\n", reason ); - connection->send( shared_ptr( new DisconnectPacket(reason) ) ); - connection->sendAndQuit(); - done = true; -// } catch (Exception e) { -// e.printStackTrace(); -// } + // try { // 4J - removed try/catch + // logger.info("Disconnecting " + getName() + ": " + reason); + app.DebugPrintf("Pending connection disconnect: %d\n", reason ); + connection->send( shared_ptr( new DisconnectPacket(reason) ) ); + connection->sendAndQuit(); + done = true; + // } catch (Exception e) { + // e.printStackTrace(); + // } } void PendingConnection::handlePreLogin(shared_ptr packet) { - if (packet->m_netcodeVersion != MINECRAFT_NET_VERSION) + if (packet->m_netcodeVersion != MINECRAFT_NET_VERSION) { app.DebugPrintf("Netcode version is %d not equal to %d\n", packet->m_netcodeVersion, MINECRAFT_NET_VERSION); - if (packet->m_netcodeVersion > MINECRAFT_NET_VERSION) + if (packet->m_netcodeVersion > MINECRAFT_NET_VERSION) { - disconnect(DisconnectPacket::eDisconnect_OutdatedServer); - } + disconnect(DisconnectPacket::eDisconnect_OutdatedServer); + } else { - disconnect(DisconnectPacket::eDisconnect_OutdatedClient); - } - return; - } -// printf("Server: handlePreLogin\n"); + disconnect(DisconnectPacket::eDisconnect_OutdatedClient); + } + return; + } + // printf("Server: handlePreLogin\n"); name = packet->loginKey; // 4J Stu - Change from the login packet as we know better on client end during the pre-login packet sendPreLoginResponse(); } @@ -106,7 +106,7 @@ void PendingConnection::sendPreLoginResponse() shared_ptr player = *it; // If the offline Xuid is invalid but the online one is not then that's guest which we should ignore // If the online Xuid is invalid but the offline one is not then we are definitely an offline game so dont care about UGC - + // PADDY - this is failing when a local player with chat restrictions joins an online game if( player != NULL && player->connection->m_offlineXUID != INVALID_XUID && player->connection->m_onlineXUID != INVALID_XUID ) @@ -125,37 +125,37 @@ void PendingConnection::sendPreLoginResponse() } #if 0 - if (false)// server->onlineMode) // 4J - removed + if (false)// server->onlineMode) // 4J - removed { - loginKey = L"TOIMPLEMENT"; // 4J - todo Long.toHexString(random.nextLong()); - connection->send( shared_ptr( new PreLoginPacket(loginKey, ugcXuids, ugcXuidCount, ugcFriendsOnlyBits, server->m_ugcPlayersVersion, szUniqueMapName,app.GetGameHostOption(eGameHostOption_All),hostIndex) ) ); - } + loginKey = L"TOIMPLEMENT"; // 4J - todo Long.toHexString(random.nextLong()); + connection->send( shared_ptr( new PreLoginPacket(loginKey, ugcXuids, ugcXuidCount, ugcFriendsOnlyBits, server->m_ugcPlayersVersion, szUniqueMapName,app.GetGameHostOption(eGameHostOption_All),hostIndex) ) ); + } else #endif { - connection->send( shared_ptr( new PreLoginPacket(L"-", ugcXuids, ugcXuidCount, ugcFriendsOnlyBits, server->m_ugcPlayersVersion,szUniqueMapName,app.GetGameHostOption(eGameHostOption_All),hostIndex, server->m_texturePackId) ) ); - } + connection->send( shared_ptr( new PreLoginPacket(L"-", ugcXuids, ugcXuidCount, ugcFriendsOnlyBits, server->m_ugcPlayersVersion,szUniqueMapName,app.GetGameHostOption(eGameHostOption_All),hostIndex, server->m_texturePackId) ) ); + } } void PendingConnection::handleLogin(shared_ptr packet) { -// printf("Server: handleLogin\n"); - //name = packet->userName; - if (packet->clientVersion != SharedConstants::NETWORK_PROTOCOL_VERSION) + // printf("Server: handleLogin\n"); + //name = packet->userName; + if (packet->clientVersion != SharedConstants::NETWORK_PROTOCOL_VERSION) { app.DebugPrintf("Client version is %d not equal to %d\n", packet->clientVersion, SharedConstants::NETWORK_PROTOCOL_VERSION); - if (packet->clientVersion > SharedConstants::NETWORK_PROTOCOL_VERSION) + if (packet->clientVersion > SharedConstants::NETWORK_PROTOCOL_VERSION) { - disconnect(DisconnectPacket::eDisconnect_OutdatedServer); - } + disconnect(DisconnectPacket::eDisconnect_OutdatedServer); + } else { - disconnect(DisconnectPacket::eDisconnect_OutdatedClient); - } - return; - } + disconnect(DisconnectPacket::eDisconnect_OutdatedClient); + } + return; + } - //if (true)// 4J removed !server->onlineMode) + //if (true)// 4J removed !server->onlineMode) bool sentDisconnect = false; if( sentDisconnect ) @@ -168,33 +168,33 @@ void PendingConnection::handleLogin(shared_ptr packet) } else { - handleAcceptedLogin(packet); - } + handleAcceptedLogin(packet); + } //else { //4J - removed #if 0 - new Thread() { - public void run() { - try { - String key = loginKey; - URL url = new URL("http://www.minecraft.net/game/checkserver.jsp?user=" + URLEncoder.encode(packet.userName, "UTF-8") + "&serverId=" + URLEncoder.encode(key, "UTF-8")); - BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream())); - String msg = br.readLine(); - br.close(); - if (msg.equals("YES")) { - acceptedLogin = packet; - } else { - disconnect("Failed to verify username!"); - } - } catch (Exception e) { - disconnect("Failed to verify username! [internal error " + e + "]"); - e.printStackTrace(); - } - } - }.start(); + new Thread() { + public void run() { + try { + String key = loginKey; + URL url = new URL("http://www.minecraft.net/game/checkserver.jsp?user=" + URLEncoder.encode(packet.userName, "UTF-8") + "&serverId=" + URLEncoder.encode(key, "UTF-8")); + BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream())); + String msg = br.readLine(); + br.close(); + if (msg.equals("YES")) { + acceptedLogin = packet; + } else { + disconnect("Failed to verify username!"); + } + } catch (Exception e) { + disconnect("Failed to verify username! [internal error " + e + "]"); + e.printStackTrace(); + } + } + }.start(); #endif - } + } } @@ -211,20 +211,20 @@ void PendingConnection::handleAcceptedLogin(shared_ptr packet) PlayerUID playerXuid = packet->m_offlineXuid; if(playerXuid == INVALID_XUID) playerXuid = packet->m_onlineXuid; - shared_ptr playerEntity = server->getPlayers()->getPlayerForLogin(this, name, playerXuid,packet->m_onlineXuid); - if (playerEntity != NULL) + shared_ptr playerEntity = server->getPlayers()->getPlayerForLogin(this, name, playerXuid,packet->m_onlineXuid); + if (playerEntity != NULL) { - server->getPlayers()->placeNewPlayer(connection, playerEntity, packet); + server->getPlayers()->placeNewPlayer(connection, playerEntity, packet); connection = NULL; // We've moved responsibility for this over to the new PlayerConnection, NULL so we don't delete our reference to it here in our dtor - } - done = true; + } + done = true; } void PendingConnection::onDisconnect(DisconnectPacket::eDisconnectReason reason, void *reasonObjects) { -// logger.info(getName() + " lost connection"); - done = true; + // logger.info(getName() + " lost connection"); + done = true; } void PendingConnection::handleGetInfo(shared_ptr packet) @@ -259,11 +259,16 @@ void PendingConnection::send(shared_ptr packet) wstring PendingConnection::getName() { return L"Unimplemented"; -// if (name != null) return name + " [" + connection.getRemoteAddress().toString() + "]"; -// return connection.getRemoteAddress().toString(); + // if (name != null) return name + " [" + connection.getRemoteAddress().toString() + "]"; + // return connection.getRemoteAddress().toString(); } bool PendingConnection::isServerPacketListener() { return true; +} + +bool PendingConnection::isDisconnected() +{ + return done; } \ No newline at end of file diff --git a/Minecraft.Client/PendingConnection.h b/Minecraft.Client/PendingConnection.h index 02d706f9..e8a493b0 100644 --- a/Minecraft.Client/PendingConnection.h +++ b/Minecraft.Client/PendingConnection.h @@ -11,10 +11,10 @@ class PendingConnection : public PacketListener { private: static const int FAKE_LAG = 0; - static const int MAX_TICKS_BEFORE_LOGIN = 20 * 30; + static const int MAX_TICKS_BEFORE_LOGIN = 20 * 30; -// public static Logger logger = Logger.getLogger("Minecraft"); - static Random *random; + // public static Logger logger = Logger.getLogger("Minecraft"); + static Random *random; public: Connection *connection; @@ -22,26 +22,27 @@ public: bool done; private: MinecraftServer *server; - int _tick; - wstring name; - shared_ptr acceptedLogin; - wstring loginKey; + int _tick; + wstring name; + shared_ptr acceptedLogin; + wstring loginKey; public: - PendingConnection(MinecraftServer *server, Socket *socket, const wstring& id); + PendingConnection(MinecraftServer *server, Socket *socket, const wstring& id); ~PendingConnection(); - void tick(); - void disconnect(DisconnectPacket::eDisconnectReason reason); - virtual void handlePreLogin(shared_ptr packet); - virtual void handleLogin(shared_ptr packet); - virtual void handleAcceptedLogin(shared_ptr packet); - virtual void onDisconnect(DisconnectPacket::eDisconnectReason reason, void *reasonObjects); + void tick(); + void disconnect(DisconnectPacket::eDisconnectReason reason); + virtual void handlePreLogin(shared_ptr packet); + virtual void handleLogin(shared_ptr packet); + virtual void handleAcceptedLogin(shared_ptr packet); + virtual void onDisconnect(DisconnectPacket::eDisconnectReason reason, void *reasonObjects); virtual void handleGetInfo(shared_ptr packet); virtual void handleKeepAlive(shared_ptr packet); - virtual void onUnhandledPacket(shared_ptr packet); - void send(shared_ptr packet); - wstring getName(); - virtual bool isServerPacketListener(); + virtual void onUnhandledPacket(shared_ptr packet); + void send(shared_ptr packet); + wstring getName(); + virtual bool isServerPacketListener(); + virtual bool isDisconnected(); private: void sendPreLoginResponse(); diff --git a/Minecraft.Client/PigRenderer.cpp b/Minecraft.Client/PigRenderer.cpp index eb78cd20..7425889d 100644 --- a/Minecraft.Client/PigRenderer.cpp +++ b/Minecraft.Client/PigRenderer.cpp @@ -2,23 +2,37 @@ #include "PigRenderer.h" #include "..\Minecraft.World\net.minecraft.world.entity.animal.h" +ResourceLocation PigRenderer::PIG_LOCATION = ResourceLocation(TN_MOB_PIG); +ResourceLocation PigRenderer::SADDLE_LOCATION = ResourceLocation(TN_MOB_SADDLE); + PigRenderer::PigRenderer(Model *model, Model *armor, float shadow) : MobRenderer(model,shadow) { setArmor(armor); } -int PigRenderer::prepareArmor(shared_ptr _pig, int layer, float a) +int PigRenderer::prepareArmor(shared_ptr _pig, int layer, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr pig = dynamic_pointer_cast(_pig); - MemSect(31); - bindTexture(TN_MOB_SADDLE); // 4J was L"/mob/saddle.png" - MemSect(0); - return (layer == 0 && pig->hasSaddle()) ? 1 : -1; + if (layer == 0 && pig->hasSaddle()) + { + MemSect(31); + bindTexture(&SADDLE_LOCATION); + MemSect(0); + + return 1; + } + + return -1; } void PigRenderer::render(shared_ptr mob, double x, double y, double z, float rot, float a) { MobRenderer::render(mob, x, y, z, rot, a); -} \ No newline at end of file +} + +ResourceLocation *PigRenderer::getTextureLocation(shared_ptr mob) +{ + return &PIG_LOCATION; +} \ No newline at end of file diff --git a/Minecraft.Client/PigRenderer.h b/Minecraft.Client/PigRenderer.h index e674b508..b089b6bd 100644 --- a/Minecraft.Client/PigRenderer.h +++ b/Minecraft.Client/PigRenderer.h @@ -3,11 +3,17 @@ class PigRenderer : public MobRenderer { +private: + static ResourceLocation PIG_LOCATION; + static ResourceLocation SADDLE_LOCATION; + public: PigRenderer(Model *model, Model *armor, float shadow); + protected: - virtual int prepareArmor(shared_ptr _pig, int layer, float a); + virtual int prepareArmor(shared_ptr _pig, int layer, float a); public: virtual void render(shared_ptr mob, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr mob); }; \ No newline at end of file diff --git a/Minecraft.Client/PistonPieceRenderer.cpp b/Minecraft.Client/PistonPieceRenderer.cpp index 1ce084cf..c51d2e0f 100644 --- a/Minecraft.Client/PistonPieceRenderer.cpp +++ b/Minecraft.Client/PistonPieceRenderer.cpp @@ -1,12 +1,15 @@ #include "stdafx.h" #include "PistonPieceRenderer.h" -#include "Tesselator.h" #include "Lighting.h" +#include "Tesselator.h" +#include "TextureAtlas.h" #include "TileRenderer.h" #include "..\Minecraft.World\net.minecraft.world.level.h" #include "..\Minecraft.World\PistonPieceEntity.h" #include "..\Minecraft.World\net.minecraft.world.level.tile.h" +ResourceLocation PistonPieceRenderer::SIGN_LOCATION = ResourceLocation(TN_ITEM_SIGN); + PistonPieceRenderer::PistonPieceRenderer() { tileRenderer = NULL; @@ -21,7 +24,7 @@ void PistonPieceRenderer::render(shared_ptr _entity, double x, doubl if (tile != NULL && entity->getProgress(a) <= 1) // 4J - changed condition from < to <= as our chunk update is async to main thread and so we can have to render these with progress of 1 { Tesselator *t = Tesselator::getInstance(); - bindTexture(TN_TERRAIN); + bindTexture(&TextureAtlas::LOCATION_BLOCKS); Lighting::turnOff(); glColor4f(1, 1, 1, 1); // 4J added - this wouldn't be needed in real opengl as the block render has vertex colours and so this isn't use, but our pretend gl always modulates with this diff --git a/Minecraft.Client/PistonPieceRenderer.h b/Minecraft.Client/PistonPieceRenderer.h index 830ddd43..9e4e229b 100644 --- a/Minecraft.Client/PistonPieceRenderer.h +++ b/Minecraft.Client/PistonPieceRenderer.h @@ -1,10 +1,12 @@ #include "TileEntityRenderer.h" + class PistonPieceEntity; class TileRenderer; class PistonPieceRenderer : public TileEntityRenderer { private: + static ResourceLocation SIGN_LOCATION; TileRenderer *tileRenderer; public: diff --git a/Minecraft.Client/PlayerChunkMap.cpp b/Minecraft.Client/PlayerChunkMap.cpp index aedd5a9d..acf6edc3 100644 --- a/Minecraft.Client/PlayerChunkMap.cpp +++ b/Minecraft.Client/PlayerChunkMap.cpp @@ -7,6 +7,7 @@ #include "MinecraftServer.h" #include "..\Minecraft.World\net.minecraft.network.packet.h" #include "..\Minecraft.World\net.minecraft.world.level.h" +#include "..\Minecraft.World\net.minecraft.world.level.chunk.h" #include "..\Minecraft.World\net.minecraft.world.level.tile.h" #include "..\Minecraft.World\ArrayWithLength.h" #include "..\Minecraft.World\System.h" @@ -23,12 +24,9 @@ PlayerChunkMap::PlayerChunk::PlayerChunk(int x, int z, PlayerChunkMap *pcm) : po parent = pcm; // 4J added ticksToNextRegionUpdate = 0; // 4J added prioritised = false; // 4J added + firstInhabitedTime = 0; parent->getLevel()->cache->create(x, z); - // 4J - added make sure our lights are up to date as soon as we make it. This is of particular concern for local clients, who have their data - // shared as soon as the chunkvisibilitypacket is sent, and so could potentially create render data for this chunk before it has been properly lit. - while( parent->getLevel()->updateLights() ) - ; } PlayerChunkMap::PlayerChunk::~PlayerChunk() @@ -68,6 +66,11 @@ void PlayerChunkMap::PlayerChunk::add(shared_ptr player, bool send // 4J Added the sendPacket check. See PlayerChunkMap::add for the usage if( sendPacket ) player->connection->send( shared_ptr( new ChunkVisibilityPacket(pos.x, pos.z, true) ) ); + if (players.empty()) + { + firstInhabitedTime = parent->level->getGameTime(); + } + players.push_back(player); player->chunksToSend.push_back(pos); @@ -93,6 +96,12 @@ void PlayerChunkMap::PlayerChunk::remove(shared_ptr player) players.erase(it); if (players.size() == 0) { + { + LevelChunk *chunk = parent->level->getChunk(pos.x, pos.z); + updateInhabitedTime(chunk); + AUTO_VAR(it, find(parent->knownChunks.begin(), parent->knownChunks.end(),this)); + if(it != parent->knownChunks.end()) parent->knownChunks.erase(it); + } __int64 id = (pos.x + 0x7fffffffLL) | ((pos.z + 0x7fffffffLL) << 32); AUTO_VAR(it, parent->chunks.find(id)); if( it != parent->chunks.end() ) @@ -144,6 +153,18 @@ void PlayerChunkMap::PlayerChunk::remove(shared_ptr player) delete toDelete; } +void PlayerChunkMap::PlayerChunk::updateInhabitedTime() +{ + updateInhabitedTime(parent->level->getChunk(pos.x, pos.z)); +} + +void PlayerChunkMap::PlayerChunk::updateInhabitedTime(LevelChunk *chunk) +{ + chunk->inhabitedTime += parent->level->getGameTime() - firstInhabitedTime; + + firstInhabitedTime = parent->level->getGameTime(); +} + void PlayerChunkMap::PlayerChunk::tileChanged(int x, int y, int z) { if (changes == 0) @@ -380,6 +401,7 @@ PlayerChunkMap::PlayerChunkMap(ServerLevel *level, int dimension, int radius) this->radius = radius; this->level = level; this->dimension = dimension; + lastInhabitedUpdate = 0; } PlayerChunkMap::~PlayerChunkMap() @@ -397,6 +419,23 @@ ServerLevel *PlayerChunkMap::getLevel() void PlayerChunkMap::tick() { + __int64 time = level->getGameTime(); + + if (time - lastInhabitedUpdate > Level::TICKS_PER_DAY / 3) + { + lastInhabitedUpdate = time; + + for (int i = 0; i < knownChunks.size(); i++) + { + PlayerChunk *chunk = knownChunks.at(i); + + // 4J Stu - Going to let our changeChunks handler below deal with this + //chunk.broadcastChanges(); + + chunk->updateInhabitedTime(); + } + } + // 4J - some changes here so that we only send one region update per tick. The chunks themselves also // limit their resend rate to once every MIN_TICKS_BETWEEN_REGION_UPDATE ticks bool regionUpdateSent = false; @@ -451,6 +490,7 @@ PlayerChunkMap::PlayerChunk *PlayerChunkMap::getChunk(int x, int z, bool create) { chunk = new PlayerChunk(x, z, this); chunks[id] = chunk; + knownChunks.push_back(chunk); } return chunk; @@ -528,7 +568,6 @@ void PlayerChunkMap::tickAddRequests(shared_ptr player) { getChunk(itNearest->x, itNearest->z, true)->add(itNearest->player); addRequests.erase(itNearest); - return; } } } @@ -605,6 +644,12 @@ void PlayerChunkMap::add(shared_ptr player) minX = maxX = xc; minZ = maxZ = zc; + // 4J - added so that we don't fully create/send every chunk at this stage. Particularly since moving on to large worlds, where + // we can be adding 1024 chunks here of which a large % might need to be fully created, this can take a long time. Instead use + // the getChunkAndAddPlayer for anything but the central region of chunks, which adds them to a queue of chunks which are added + // one per tick per player. + const int maxLegSizeToAddNow = 14; + // All but the last leg for (int legSize = 1; legSize <= size * 2; legSize++) { @@ -620,12 +665,21 @@ void PlayerChunkMap::add(shared_ptr player) int targetX, targetZ; targetX = xc + dx; targetZ = zc + dz; - if( targetX > maxX ) maxX = targetX; - if( targetX < minX ) minX = targetX; - if( targetZ > maxZ ) maxZ = targetZ; - if( targetZ < minZ ) minZ = targetZ; - getChunk(targetX, targetZ, true)->add(player, false); + if( ( legSize < maxLegSizeToAddNow ) || + ( ( legSize == maxLegSizeToAddNow ) && ( ( leg == 0 ) || ( k < ( legSize - 1 ) ) ) ) ) + { + if( targetX > maxX ) maxX = targetX; + if( targetX < minX ) minX = targetX; + if( targetZ > maxZ ) maxZ = targetZ; + if( targetZ < minZ ) minZ = targetZ; + + getChunk(targetX, targetZ, true)->add(player, false); + } + else + { + getChunkAndAddPlayer(targetX, targetZ, player); + } } } } @@ -640,12 +694,19 @@ void PlayerChunkMap::add(shared_ptr player) int targetX, targetZ; targetX = xc + dx; targetZ = zc + dz; - if( targetX > maxX ) maxX = targetX; - if( targetX < minX ) minX = targetX; - if( targetZ > maxZ ) maxZ = targetZ; - if( targetZ < minZ ) minZ = targetZ; + if( ( size * 2 ) <= maxLegSizeToAddNow ) + { + if( targetX > maxX ) maxX = targetX; + if( targetX < minX ) minX = targetX; + if( targetZ > maxZ ) maxZ = targetZ; + if( targetZ < minZ ) minZ = targetZ; - getChunk(targetX, targetZ, true)->add(player, false); + getChunk(targetX, targetZ, true)->add(player, false); + } + else + { + getChunkAndAddPlayer(targetX, targetZ, player); + } } // CraftBukkit end diff --git a/Minecraft.Client/PlayerChunkMap.h b/Minecraft.Client/PlayerChunkMap.h index 61324272..9d1ab1b5 100644 --- a/Minecraft.Client/PlayerChunkMap.h +++ b/Minecraft.Client/PlayerChunkMap.h @@ -45,6 +45,7 @@ public: int zChangeMin, zChangeMax; int ticksToNextRegionUpdate; // 4J added bool prioritised; // 4J added + __int64 firstInhabitedTime; public: PlayerChunk(int x, int z, PlayerChunkMap *pcm); @@ -53,6 +54,12 @@ public: // 4J Added sendPacket param so we can aggregate the initial send into one much smaller packet void add(shared_ptr player, bool sendPacket = true); void remove(shared_ptr player); + void updateInhabitedTime(); + + private: + void updateInhabitedTime(LevelChunk *chunk); + + public: void tileChanged(int x, int y, int z); void prioritiseTileChanges(); // 4J added void broadcast(shared_ptr packet); @@ -68,12 +75,14 @@ public: private: unordered_map<__int64,PlayerChunk *,LongKeyHash,LongKeyEq> chunks; // 4J - was LongHashMap vector changedChunks; + vector knownChunks; vector addRequests; // 4J added void tickAddRequests(shared_ptr player); // 4J added ServerLevel *level; int radius; int dimension; + __int64 lastInhabitedUpdate; public: PlayerChunkMap(ServerLevel *level, int dimension, int radius); diff --git a/Minecraft.Client/PlayerConnection.cpp b/Minecraft.Client/PlayerConnection.cpp index f0e538a8..4928f65b 100644 --- a/Minecraft.Client/PlayerConnection.cpp +++ b/Minecraft.Client/PlayerConnection.cpp @@ -15,6 +15,7 @@ #include "..\Minecraft.World\net.minecraft.world.inventory.h" #include "..\Minecraft.World\net.minecraft.world.level.tile.entity.h" #include "..\Minecraft.World\net.minecraft.world.level.saveddata.h" +#include "..\Minecraft.World\net.minecraft.world.entity.animal.h" #include "..\Minecraft.World\net.minecraft.network.h" #include "..\Minecraft.World\net.minecraft.world.food.h" #include "..\Minecraft.World\AABB.h" @@ -53,7 +54,7 @@ PlayerConnection::PlayerConnection(MinecraftServer *server, Connection *connecti this->connection = connection; connection->setListener(this); this->player = player; -// player->connection = this; // 4J - moved out as we can't assign in a ctor + // player->connection = this; // 4J - moved out as we can't assign in a ctor InitializeCriticalSection(&done_cs); m_bCloseOnTick = false; @@ -95,10 +96,7 @@ void PlayerConnection::tick() lastKeepAliveId = random.nextInt(); send( shared_ptr( new KeepAlivePacket(lastKeepAliveId) ) ); } -// if (!didTick) { -// player->doTick(false); -// } - + if (chatSpamTickCount > 0) { chatSpamTickCount--; @@ -135,7 +133,7 @@ void PlayerConnection::disconnect(DisconnectPacket::eDisconnectReason reason) { server->getPlayers()->broadcastAll( shared_ptr( new ChatPacket(player->name, ChatPacket::e_ChatPlayerLeftGame) ) ); } - + server->getPlayers()->remove(player); done = true; LeaveCriticalSection(&done_cs); @@ -143,7 +141,7 @@ void PlayerConnection::disconnect(DisconnectPacket::eDisconnectReason reason) void PlayerConnection::handlePlayerInput(shared_ptr packet) { - player->setPlayerInput(packet->getXa(), packet->getYa(), packet->isJumping(), packet->isSneaking(), packet->getXRot(), packet->getYRot()); + player->setPlayerInput(packet->getXxa(), packet->getYya(), packet->isJumping(), packet->isSneaking()); } void PlayerConnection::handleMovePlayer(shared_ptr packet) @@ -175,44 +173,28 @@ void PlayerConnection::handleMovePlayer(shared_ptr packet) double xt = player->x; double yt = player->y; double zt = player->z; - double xxa = 0; - double zza = 0; + if (packet->hasRot) { yRotT = packet->yRot; xRotT = packet->xRot; } - if (packet->hasPos && packet->y == -999 && packet->yView == -999) - { - // CraftBukkit start - if (abs(packet->x) > 1 || abs(packet->z) > 1) - { - //System.err.println(player.name + " was caught trying to crash the server with an invalid position."); -#ifndef _CONTENT_PACKAGE - wprintf(L"%ls was caught trying to crash the server with an invalid position.", player->name.c_str()); -#endif - disconnect(DisconnectPacket::eDisconnect_IllegalPosition);//"Nope!"); - return; - } - // CraftBukkit end - xxa = packet->x; - zza = packet->z; - } - player->onGround = packet->onGround; - player->doTick(false); - player->move(xxa, 0, zza); + player->doTick(false); + player->ySlideOffset = 0; player->absMoveTo(xt, yt, zt, yRotT, xRotT); - player->xd = xxa; - player->zd = zza; - if (player->riding != NULL) level->forceTick(player->riding, true); if (player->riding != NULL) player->riding->positionRider(); server->getPlayers()->move(player); - xLastOk = player->x; - yLastOk = player->y; - zLastOk = player->z; + + // player may have been kicked off the mount during the tick, so + // only copy valid coordinates if the player still is "synched" + if (synched) { + xLastOk = player->x; + yLastOk = player->y; + zLastOk = player->z; + } ((Level *)level)->tick(player); return; @@ -253,7 +235,7 @@ void PlayerConnection::handleMovePlayer(shared_ptr packet) if (!player->isSleeping() && (yd > 1.65 || yd < 0.1)) { disconnect(DisconnectPacket::eDisconnect_IllegalStance); -// logger.warning(player->name + " had an illegal stance: " + yd); + // logger.warning(player->name + " had an illegal stance: " + yd); return; } if (abs(packet->x) > 32000000 || abs(packet->z) > 32000000) @@ -290,11 +272,11 @@ void PlayerConnection::handleMovePlayer(shared_ptr packet) // 4J-PB - removing this one for now /*if (dist > 100.0f) { -// logger.warning(player->name + " moved too quickly!"); - disconnect(DisconnectPacket::eDisconnect_MovedTooQuickly); -// System.out.println("Moved too quickly at " + xt + ", " + yt + ", " + zt); -// teleport(player->x, player->y, player->z, player->yRot, player->xRot); - return; + // logger.warning(player->name + " moved too quickly!"); + disconnect(DisconnectPacket::eDisconnect_MovedTooQuickly); + // System.out.println("Moved too quickly at " + xt + ", " + yt + ", " + zt); + // teleport(player->x, player->y, player->z, player->yRot, player->xRot); + return; } */ @@ -335,9 +317,9 @@ void PlayerConnection::handleMovePlayer(shared_ptr packet) if (dist > 0.25 * 0.25 && !player->isSleeping() && !player->gameMode->isCreative() && !player->isAllowedToFly()) { fail = true; -// logger.warning(player->name + " moved wrongly!"); -// System.out.println("Got position " + xt + ", " + yt + ", " + zt); -// System.out.println("Expected " + player->x + ", " + player->y + ", " + player->z); + // logger.warning(player->name + " moved wrongly!"); + // System.out.println("Got position " + xt + ", " + yt + ", " + zt); + // System.out.println("Expected " + player->x + ", " + player->y + ", " + player->z); #ifndef _CONTENT_PACKAGE wprintf(L"%ls moved wrongly!\n",player->name.c_str()); app.DebugPrintf("Got position %f, %f, %f\n", xt,yt,zt); @@ -361,7 +343,7 @@ void PlayerConnection::handleMovePlayer(shared_ptr packet) aboveGroundTickCount++; if (aboveGroundTickCount > 80) { -// logger.warning(player->name + " was kicked for floating too long!"); + // logger.warning(player->name + " was kicked for floating too long!"); #ifndef _CONTENT_PACKAGE wprintf(L"%ls was kicked for floating too long!\n", player->name.c_str()); #endif @@ -379,7 +361,10 @@ void PlayerConnection::handleMovePlayer(shared_ptr packet) server->getPlayers()->move(player); player->doCheckFallDamage(player->y - startY, packet->onGround); } - + else if ((tickCount % SharedConstants::TICKS_PER_SECOND) == 0) + { + teleport(xLastOk, yLastOk, zLastOk, player->yRot, player->xRot); + } } void PlayerConnection::teleport(double x, double y, double z, float yRot, float xRot, bool sendPacket /*= true*/) @@ -397,10 +382,16 @@ void PlayerConnection::teleport(double x, double y, double z, float yRot, float void PlayerConnection::handlePlayerAction(shared_ptr packet) { ServerLevel *level = server->getLevel(player->dimension); + player->resetLastActionTime(); if (packet->action == PlayerActionPacket::DROP_ITEM) { - player->drop(); + player->drop(false); + return; + } + else if (packet->action == PlayerActionPacket::DROP_ALL_ITEMS) + { + player->drop(true); return; } else if (packet->action == PlayerActionPacket::RELEASE_USE_ITEM) @@ -408,10 +399,10 @@ void PlayerConnection::handlePlayerAction(shared_ptr packet) player->releaseUsingItem(); return; } - // 4J Stu - We don't have ops, so just use the levels setting - bool canEditSpawn = level->canEditSpawn; // = level->dimension->id != 0 || server->players->isOp(player->name); + bool shouldVerifyLocation = false; if (packet->action == PlayerActionPacket::START_DESTROY_BLOCK) shouldVerifyLocation = true; + if (packet->action == PlayerActionPacket::ABORT_DESTROY_BLOCK) shouldVerifyLocation = true; if (packet->action == PlayerActionPacket::STOP_DESTROY_BLOCK) shouldVerifyLocation = true; int x = packet->x; @@ -434,14 +425,10 @@ void PlayerConnection::handlePlayerAction(shared_ptr packet) return; } } - Pos *spawnPos = level->getSharedSpawnPos(); - int xd = (int) Mth::abs((float)(x - spawnPos->x)); - int zd = (int) Mth::abs((float)(z - spawnPos->z)); - delete spawnPos; - if (xd > zd) zd = xd; + if (packet->action == PlayerActionPacket::START_DESTROY_BLOCK) { - if (zd > 16 || canEditSpawn) player->gameMode->startDestroyBlock(x, y, z, packet->face); + if (true) player->gameMode->startDestroyBlock(x, y, z, packet->face); // 4J - condition was !server->isUnderSpawnProtection(level, x, y, z, player) (from Java 1.6.4) but putting back to old behaviour else player->connection->send( shared_ptr( new TileUpdatePacket(x, y, z, level) ) ); } @@ -456,21 +443,6 @@ void PlayerConnection::handlePlayerAction(shared_ptr packet) player->gameMode->abortDestroyBlock(x, y, z); if (level->getTile(x, y, z) != 0) player->connection->send(shared_ptr( new TileUpdatePacket(x, y, z, level))); } - else if (packet->action == PlayerActionPacket::GET_UPDATED_BLOCK) - { - double xDist = player->x - (x + 0.5); - double yDist = player->y - (y + 0.5); - double zDist = player->z - (z + 0.5); - double dist = xDist * xDist + yDist * yDist + zDist * zDist; - if (dist < 16 * 16) - { - player->connection->send( shared_ptr( new TileUpdatePacket(x, y, z, level) ) ); - } - } - - // 4J Stu - Don't change the levels state - //level->canEditSpawn = false; - } void PlayerConnection::handleUseItem(shared_ptr packet) @@ -482,7 +454,8 @@ void PlayerConnection::handleUseItem(shared_ptr packet) int y = packet->getY(); int z = packet->getZ(); int face = packet->getFace(); - + player->resetLastActionTime(); + // 4J Stu - We don't have ops, so just use the levels setting bool canEditSpawn = level->canEditSpawn; // = level->dimension->id != 0 || server->players->isOp(player->name); if (packet->getFace() == 255) @@ -492,14 +465,9 @@ void PlayerConnection::handleUseItem(shared_ptr packet) } else if ((packet->getY() < server->getMaxBuildHeight() - 1) || (packet->getFace() != Facing::UP && packet->getY() < server->getMaxBuildHeight())) { - Pos *spawnPos = level->getSharedSpawnPos(); - int xd = (int) Mth::abs((float)(x - spawnPos->x)); - int zd = (int) Mth::abs((float)(z - spawnPos->z)); - delete spawnPos; - if (xd > zd) zd = xd; if (synched && player->distanceToSqr(x + 0.5, y + 0.5, z + 0.5) < 8 * 8) { - if (zd > 16 || canEditSpawn) + if (true) // 4J - condition was !server->isUnderSpawnProtection(level, x, y, z, player) (from java 1.6.4) but putting back to old behaviour { player->gameMode->useItemOn(player, level, item, x, y, z, face, packet->getClickX(), packet->getClickY(), packet->getClickZ()); } @@ -524,7 +492,7 @@ void PlayerConnection::handleUseItem(shared_ptr packet) if (face == 3) z++; if (face == 4) x--; if (face == 5) x++; - + // 4J - Fixes an issue where pistons briefly disappear when retracting. The pistons themselves shouldn't have their change from being pistonBase_Id to pistonMovingPiece_Id // directly sent to the client, as this will happen on the client as a result of it actioning (via a tile event) the retraction of the piston locally. However, by putting a switch // beside a piston and then performing an action on the side of it facing a piston, the following line of code will send a TileUpdatePacket containing the change to pistonMovingPiece_Id @@ -538,6 +506,12 @@ void PlayerConnection::handleUseItem(shared_ptr packet) } item = player->inventory->getSelected(); + + bool forceClientUpdate = false; + if(item != NULL && packet->getItem() == NULL) + { + forceClientUpdate = true; + } if (item != NULL && item->count == 0) { player->inventory->items[player->inventory->selected] = nullptr; @@ -552,22 +526,18 @@ void PlayerConnection::handleUseItem(shared_ptr packet) player->containerMenu->broadcastChanges(); player->ignoreSlotUpdateHack = false; - if (!ItemInstance::matches(player->inventory->getSelected(), packet->getItem())) + if (forceClientUpdate || !ItemInstance::matches(player->inventory->getSelected(), packet->getItem())) { send( shared_ptr( new ContainerSetSlotPacket(player->containerMenu->containerId, s->index, player->inventory->getSelected()) ) ); } } - - // 4J Stu - Don't change the levels state - //level->canEditSpawn = false; - } void PlayerConnection::onDisconnect(DisconnectPacket::eDisconnectReason reason, void *reasonObjects) { EnterCriticalSection(&done_cs); if( done ) return; -// logger.info(player.name + " lost connection: " + reason); + // logger.info(player.name + " lost connection: " + reason); // 4J-PB - removed, since it needs to be localised in the language the client is in //server->players->broadcastAll( shared_ptr( new ChatPacket(L"§e" + player->name + L" left the game.") ) ); if(getWasKicked()) @@ -585,7 +555,7 @@ void PlayerConnection::onDisconnect(DisconnectPacket::eDisconnectReason reason, void PlayerConnection::onUnhandledPacket(shared_ptr packet) { -// logger.warning(getClass() + " wasn't prepared to deal with a " + packet.getClass()); + // logger.warning(getClass() + " wasn't prepared to deal with a " + packet.getClass()); disconnect(DisconnectPacket::eDisconnect_UnexpectedPacket); } @@ -628,10 +598,11 @@ void PlayerConnection::handleSetCarriedItem(shared_ptr pac { if (packet->slot < 0 || packet->slot >= Inventory::getSelectionSize()) { -// logger.warning(player.name + " tried to set an invalid carried item"); + // logger.warning(player.name + " tried to set an invalid carried item"); return; } player->inventory->selected = packet->slot; + player->resetLastActionTime(); } void PlayerConnection::handleChat(shared_ptr packet) @@ -680,6 +651,7 @@ void PlayerConnection::handleCommand(const wstring& message) void PlayerConnection::handleAnimate(shared_ptr packet) { + player->resetLastActionTime(); if (packet->action == AnimatePacket::SWING) { player->swing(); @@ -688,6 +660,7 @@ void PlayerConnection::handleAnimate(shared_ptr packet) void PlayerConnection::handlePlayerCommand(shared_ptr packet) { + player->resetLastActionTime(); if (packet->action == PlayerCommandPacket::START_SNEAKING) { player->setSneaking(true); @@ -709,6 +682,22 @@ void PlayerConnection::handlePlayerCommand(shared_ptr packe player->stopSleepInBed(false, true, true); synched = false; } + else if (packet->action == PlayerCommandPacket::RIDING_JUMP) + { + // currently only supported by horses... + if ( (player->riding != NULL) && player->riding->GetType() == eTYPE_HORSE) + { + dynamic_pointer_cast(player->riding)->onPlayerJump(packet->data); + } + } + else if (packet->action == PlayerCommandPacket::OPEN_INVENTORY) + { + // also only supported by horses... + if ( (player->riding != NULL) && player->riding->instanceof(eTYPE_HORSE) ) + { + dynamic_pointer_cast(player->riding)->openInventory(player); + } + } else if (packet->action == PlayerCommandPacket::START_IDLEANIM) { player->setIsIdle(true); @@ -717,7 +706,6 @@ void PlayerConnection::handlePlayerCommand(shared_ptr packe { player->setIsIdle(false); } - } void PlayerConnection::setShowOnMaps(bool bVal) @@ -751,13 +739,14 @@ void PlayerConnection::warn(const wstring& string) wstring PlayerConnection::getConsoleName() { - return player->name; + return player->getName(); } void PlayerConnection::handleInteract(shared_ptr packet) { ServerLevel *level = server->getLevel(player->dimension); shared_ptr target = level->getEntity(packet->target); + player->resetLastActionTime(); // Fix for #8218 - Gameplay: Attacking zombies from a different level often results in no hits being registered // 4J Stu - If the client says that we hit something, then agree with it. The canSee can fail here as it checks @@ -774,14 +763,20 @@ void PlayerConnection::handleInteract(shared_ptr packet) //if (player->distanceToSqr(target) < maxDist) //{ - if (packet->action == InteractPacket::INTERACT) + 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..9fbef2a2 100644 --- a/Minecraft.Client/PlayerList.cpp +++ b/Minecraft.Client/PlayerList.cpp @@ -24,6 +24,7 @@ #include "..\Minecraft.World\net.minecraft.world.level.storage.h" #include "..\Minecraft.World\net.minecraft.world.level.saveddata.h" #include "..\Minecraft.World\JavaMath.h" +#include "..\Minecraft.World\EntityIO.h" #ifdef _XBOX #include "Xbox\Network\NetworkPlayerXbox.h" #elif defined(__PS3__) || defined(__ORBIS__) @@ -36,7 +37,7 @@ PlayerList::PlayerList(MinecraftServer *server) { playerIo = NULL; - this->server = server; + this->server = server; sendAllPlayerInfoIn = 0; overrideGameMode = NULL; @@ -50,11 +51,11 @@ PlayerList::PlayerList(MinecraftServer *server) viewDistance = 10; #endif - //int viewDistance = server->settings->getInt(L"view-distance", 10); + //int viewDistance = server->settings->getInt(L"view-distance", 10); + + maxPlayers = server->settings->getInt(L"max-players", 20); + doWhiteList = false; - maxPlayers = server->settings->getInt(L"max-players", 20); - doWhiteList = false; - InitializeCriticalSection(&m_kickPlayersCS); InitializeCriticalSection(&m_closePlayersCS); } @@ -74,190 +75,236 @@ PlayerList::~PlayerList() void PlayerList::placeNewPlayer(Connection *connection, shared_ptr player, shared_ptr packet) { - bool newPlayer = load(player); - player->setLevel(server->getLevel(player->dimension)); - player->gameMode->setLevel((ServerLevel *) player->level); + CompoundTag *playerTag = load(player); - // Make sure these privileges are always turned off for the host player - INetworkPlayer *networkPlayer = connection->getSocket()->getPlayer(); - if(networkPlayer != NULL && networkPlayer->IsHost()) - { - player->enableAllPlayerPrivileges(true); - player->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_HOST,1); - } + bool newPlayer = playerTag == NULL; + + player->setLevel(server->getLevel(player->dimension)); + player->gameMode->setLevel((ServerLevel *)player->level); + + // Make sure these privileges are always turned off for the host player + INetworkPlayer *networkPlayer = connection->getSocket()->getPlayer(); + if(networkPlayer != NULL && networkPlayer->IsHost()) + { + player->enableAllPlayerPrivileges(true); + player->setPlayerGamePrivilege(Player::ePlayerGamePrivilege_HOST,1); + } #if defined(__PS3__) || defined(__ORBIS__) - // PS3 networking library doesn't automatically assign PlayerUIDs to the network players for anything remote, so need to tell it what to set from the data in this packet now - if( !g_NetworkManager.IsLocalGame() ) + // PS3 networking library doesn't automatically assign PlayerUIDs to the network players for anything remote, so need to tell it what to set from the data in this packet now + if( !g_NetworkManager.IsLocalGame() ) + { + if( networkPlayer != NULL ) { - if( networkPlayer != NULL ) - { - ((NetworkPlayerSony *)networkPlayer)->SetUID( packet->m_onlineXuid ); - } + ((NetworkPlayerSony *)networkPlayer)->SetUID( packet->m_onlineXuid ); } + } #endif - // 4J Stu - TU-1 hotfix - // Fix for #13150 - When a player loads/joins a game after saving/leaving in the nether, sometimes they are spawned on top of the nether and cannot mine down - validatePlayerSpawnPosition(player); + // 4J Stu - TU-1 hotfix + // Fix for #13150 - When a player loads/joins a game after saving/leaving in the nether, sometimes they are spawned on top of the nether and cannot mine down + validatePlayerSpawnPosition(player); -// logger.info(getName() + " logged in with entity id " + playerEntity.entityId + " at (" + playerEntity.x + ", " + playerEntity.y + ", " + playerEntity.z + ")"); + // logger.info(getName() + " logged in with entity id " + playerEntity.entityId + " at (" + playerEntity.x + ", " + playerEntity.y + ", " + playerEntity.z + ")"); - ServerLevel *level = server->getLevel(player->dimension); + ServerLevel *level = server->getLevel(player->dimension); - DWORD playerIndex = 0; + DWORD playerIndex = 0; + { + bool usedIndexes[MINECRAFT_NET_MAX_PLAYERS]; + ZeroMemory( &usedIndexes, MINECRAFT_NET_MAX_PLAYERS * sizeof(bool) ); + for(AUTO_VAR(it, players.begin()); it < players.end(); ++it) { - bool usedIndexes[MINECRAFT_NET_MAX_PLAYERS]; - ZeroMemory( &usedIndexes, MINECRAFT_NET_MAX_PLAYERS * sizeof(bool) ); - for(AUTO_VAR(it, players.begin()); it < players.end(); ++it) + usedIndexes[ (int)(*it)->getPlayerIndex() ] = true; + } + for(unsigned int i = 0; i < MINECRAFT_NET_MAX_PLAYERS; ++i) + { + 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 +327,7 @@ int PlayerList::getMaxRange() return PlayerChunkMap::convertChunkRangeToBlock(getViewDistance()); } - // 4J Changed return val to bool to check if new player or loaded player -bool PlayerList::load(shared_ptr player) +CompoundTag *PlayerList::load(shared_ptr player) { return playerIo->load(player); } @@ -301,6 +347,8 @@ void PlayerList::validatePlayerSpawnPosition(shared_ptr player) // Make sure that the player is on the ground, and in the centre x/z of the current column app.DebugPrintf("Original pos is %f, %f, %f in dimension %d\n", player->x, player->y, player->z, player->dimension); + bool spawnForced = player->isRespawnForced(); + double targetX = 0; if(player->x < 0) targetX = Mth::ceil(player->x) - 0.5; else targetX = Mth::floor(player->x) + 0.5; @@ -316,10 +364,10 @@ void PlayerList::validatePlayerSpawnPosition(shared_ptr player) app.DebugPrintf("New pos is %f, %f, %f in dimension %d\n", player->x, player->y, player->z, player->dimension); ServerLevel *level = server->getLevel(player->dimension); - while (level->getCubes(player, player->bb)->size() != 0) + while (level->getCubes(player, player->bb)->size() != 0) { - player->setPos(player->x, player->y + 1, player->z); - } + player->setPos(player->x, player->y + 1, player->z); + } app.DebugPrintf("Final pos is %f, %f, %f in dimension %d\n", player->x, player->y, player->z, player->dimension); // 4J Stu - If we are in the nether and the above while loop has put us above the nether then we have a problem @@ -342,11 +390,11 @@ void PlayerList::validatePlayerSpawnPosition(shared_ptr player) Pos *bedPosition = player->getRespawnPosition(); if (bedPosition != NULL) { - Pos *respawnPosition = Player::checkBedValidRespawnPosition(server->getLevel(player->dimension), bedPosition); + Pos *respawnPosition = Player::checkBedValidRespawnPosition(server->getLevel(player->dimension), bedPosition, spawnForced); if (respawnPosition != NULL) { player->moveTo(respawnPosition->x + 0.5f, respawnPosition->y + 0.1f, respawnPosition->z + 0.5f, 0, 0); - player->setRespawnPosition(bedPosition); + player->setRespawnPosition(bedPosition, spawnForced); } delete bedPosition; } @@ -354,7 +402,7 @@ void PlayerList::validatePlayerSpawnPosition(shared_ptr player) { player->setPos(player->x, player->y + 1, player->z); } - + app.DebugPrintf("Updated pos is %f, %f, %f in dimension %d\n", player->x, player->y, player->z, player->dimension); } } @@ -367,12 +415,12 @@ void PlayerList::add(shared_ptr player) broadcastAll(shared_ptr( new PlayerInfoPacket( player ) ) ); } - players.push_back(player); + players.push_back(player); // 4J Added addPlayerToReceiving(player); - // Ensure the area the player is spawning in is loaded! + // Ensure the area the player is spawning in is loaded! ServerLevel *level = server->getLevel(player->dimension); // 4J Stu - TU-1 hotfix @@ -381,8 +429,8 @@ void PlayerList::add(shared_ptr player) // 4J Stu - Swapped these lines about so that we get the chunk visiblity packet way ahead of all the add tracked entity packets // Fix for #9169 - ART : Sign text is replaced with the words “Awaiting approval”. - changeDimension(player, NULL); - level->addEntity(player); + changeDimension(player, NULL); + level->addEntity(player); for (int i = 0; i < players.size(); i++) { @@ -417,12 +465,20 @@ void PlayerList::move(shared_ptr player) void PlayerList::remove(shared_ptr player) { - save(player); + save(player); //4J Stu - We don't want to save the map data for guests, so when we are sure that the player is gone delete the map if(player->isGuest()) playerIo->deleteMapFilesForPlayer(player); ServerLevel *level = player->getLevel(); - level->removeEntity(player); - level->getChunkMap()->remove(player); + if (player->riding != NULL) + { + // remove mount first because the player unmounts when being + // removed, also remove mount because it's saved in the player's + // save tag + level->removeEntityImmediately(player->riding); + app.DebugPrintf("removing player mount"); + } + level->removeEntity(player); + level->getChunkMap()->remove(player); AUTO_VAR(it, find(players.begin(),players.end(),player)); if( it != players.end() ) { @@ -441,12 +497,12 @@ void PlayerList::remove(shared_ptr player) shared_ptr PlayerList::getPlayerForLogin(PendingConnection *pendingConnection, const wstring& userName, PlayerUID xuid, PlayerUID onlineXuid) { - if (players.size() >= maxPlayers) + if (players.size() >= maxPlayers) { - pendingConnection->disconnect(DisconnectPacket::eDisconnect_ServerFull); - return shared_ptr(); - } - + pendingConnection->disconnect(DisconnectPacket::eDisconnect_ServerFull); + return shared_ptr(); + } + shared_ptr player = shared_ptr(new ServerPlayer(server, server->getLevel(0), userName, new ServerPlayerGameMode(server->getLevel(0)) )); player->gameMode->player = player; // 4J added as had to remove this assignment from ServerPlayer ctor player->setXuid( xuid ); // 4J Added @@ -466,7 +522,7 @@ shared_ptr PlayerList::getPlayerForLogin(PendingConnection *pendin player->gameMode->setGameRules( GameRuleDefinition::generateNewGameRulesInstance(GameRulesInstance::eGameRulesInstanceType_ServerPlayer, serverRuleDefs, pendingConnection->connection) ); } - return player; + return player; } shared_ptr PlayerList::respawn(shared_ptr serverPlayer, int targetDimension, bool keepAllPlayerData) @@ -525,22 +581,24 @@ shared_ptr PlayerList::respawn(shared_ptr serverPlay AUTO_VAR(it, find(players.begin(),players.end(),serverPlayer)); if( it != players.end() ) { - players.erase(it); + players.erase(it); } - server->getLevel(serverPlayer->dimension)->removeEntityImmediately(serverPlayer); + server->getLevel(serverPlayer->dimension)->removeEntityImmediately(serverPlayer); - Pos *bedPosition = serverPlayer->getRespawnPosition(); + Pos *bedPosition = serverPlayer->getRespawnPosition(); + bool spawnForced = serverPlayer->isRespawnForced(); removePlayerFromReceiving(serverPlayer); - serverPlayer->dimension = targetDimension; + serverPlayer->dimension = targetDimension; EDefaultSkins skin = serverPlayer->getPlayerDefaultSkin(); DWORD playerIndex = serverPlayer->getPlayerIndex(); PlayerUID playerXuid = serverPlayer->getXuid(); PlayerUID playerOnlineXuid = serverPlayer->getOnlineXuid(); - - shared_ptr player = shared_ptr(new ServerPlayer(server, server->getLevel(serverPlayer->dimension), serverPlayer->name, new ServerPlayerGameMode(server->getLevel(serverPlayer->dimension)))); + + shared_ptr player = shared_ptr(new ServerPlayer(server, server->getLevel(serverPlayer->dimension), serverPlayer->getName(), new ServerPlayerGameMode(server->getLevel(serverPlayer->dimension)))); + player->connection = serverPlayer->connection; player->restoreFrom(serverPlayer, keepAllPlayerData); if (keepAllPlayerData) { @@ -552,9 +610,8 @@ shared_ptr PlayerList::respawn(shared_ptr serverPlay player->setOnlineXuid( playerOnlineXuid ); // 4J Added // 4J Stu - Don't reuse the id. If we do, then the player can be re-added after being removed, but the add packet gets sent before the remove packet - //player->entityId = serverPlayer->entityId; + //player->entityId = serverPlayer->entityId; - player->connection = serverPlayer->connection; player->setPlayerDefaultSkin( skin ); player->setIsGuest( serverPlayer->isGuest() ); player->setPlayerIndex( playerIndex ); @@ -570,7 +627,7 @@ shared_ptr PlayerList::respawn(shared_ptr serverPlay addPlayerToReceiving(player); - ServerLevel *level = server->getLevel(serverPlayer->dimension); + ServerLevel *level = server->getLevel(serverPlayer->dimension); // reset the player's game mode (first pick from old, then copy level if // necessary) @@ -582,39 +639,40 @@ shared_ptr PlayerList::respawn(shared_ptr serverPlay player->moveTo(serverPlayer->x, serverPlayer->y, serverPlayer->z, serverPlayer->yRot, serverPlayer->xRot); if(bedPosition != NULL) { - player->setRespawnPosition(bedPosition); + player->setRespawnPosition(bedPosition, spawnForced); delete bedPosition; } // Fix for #81759 - TU9: Content: Gameplay: Entering The End Exit Portal replaces the Player's currently held item with the first one from the Quickbar player->inventory->selected = serverPlayer->inventory->selected; } - else if (bedPosition != NULL) + else if (bedPosition != NULL) { - Pos *respawnPosition = Player::checkBedValidRespawnPosition(server->getLevel(serverPlayer->dimension), bedPosition); - if (respawnPosition != NULL) + Pos *respawnPosition = Player::checkBedValidRespawnPosition(server->getLevel(serverPlayer->dimension), bedPosition, spawnForced); + if (respawnPosition != NULL) { - player->moveTo(respawnPosition->x + 0.5f, respawnPosition->y + 0.1f, respawnPosition->z + 0.5f, 0, 0); - player->setRespawnPosition(bedPosition); - } + player->moveTo(respawnPosition->x + 0.5f, respawnPosition->y + 0.1f, respawnPosition->z + 0.5f, 0, 0); + player->setRespawnPosition(bedPosition, spawnForced); + } else { - player->connection->send( shared_ptr( new GameEventPacket(GameEventPacket::NO_RESPAWN_BED_AVAILABLE, 0) ) ); - } + player->connection->send( shared_ptr( new GameEventPacket(GameEventPacket::NO_RESPAWN_BED_AVAILABLE, 0) ) ); + } delete bedPosition; - } + } - // Ensure the area the player is spawning in is loaded! - level->cache->create(((int) player->x) >> 4, ((int) player->z) >> 4); + // Ensure the area the player is spawning in is loaded! + level->cache->create(((int) player->x) >> 4, ((int) player->z) >> 4); - while (!level->getCubes(player, player->bb)->empty()) + while (!level->getCubes(player, player->bb)->empty()) { - player->setPos(player->x, player->y + 1, player->z); - } + player->setPos(player->x, player->y + 1, player->z); + } player->connection->send( shared_ptr( new RespawnPacket((char) player->dimension, player->level->getSeed(), player->level->getMaxBuildHeight(), - player->gameMode->getGameModeForPlayer(), level->difficulty, level->getLevelData()->getGenerator(), - player->level->useNewSeaLevel(), player->entityId, level->getLevelData()->getXZSize(), level->getLevelData()->getHellScale()) ) ); - player->connection->teleport(player->x, player->y, player->z, player->yRot, player->xRot); + player->gameMode->getGameModeForPlayer(), level->difficulty, level->getLevelData()->getGenerator(), + player->level->useNewSeaLevel(), player->entityId, level->getLevelData()->getXZSize(), level->getLevelData()->getHellScale()) ) ); + player->connection->teleport(player->x, player->y, player->z, player->yRot, player->xRot); + player->connection->send( shared_ptr( new SetExperiencePacket(player->experienceProgress, player->totalExperience, player->experienceLevel)) ); if(keepAllPlayerData) { @@ -629,13 +687,14 @@ shared_ptr PlayerList::respawn(shared_ptr serverPlay player->getEntityData()->markDirty(Mob::DATA_EFFECT_COLOR_ID); } - sendLevelInfo(player, level); + sendLevelInfo(player, level); - level->getChunkMap()->add(player); - level->addEntity(player); - players.push_back(player); + level->getChunkMap()->add(player); + level->addEntity(player); + players.push_back(player); - player->initMenu(); + player->initMenu(); + player->setHealth(player->getHealth()); // 4J-JEV - Dying before this point in the tutorial is pretty annoying, // making sure to remove health/hunger and give you back your meat. @@ -650,7 +709,7 @@ shared_ptr PlayerList::respawn(shared_ptr serverPlay player->displayClientMessage(IDS_PLAYER_LEFT_END); } - return player; + return player; } @@ -704,7 +763,7 @@ void PlayerList::toggleDimension(shared_ptr player, int targetDime player->getLevel()->getTracker()->removeEntity(player); } - ServerLevel *oldLevel = server->getLevel(player->dimension); + ServerLevel *oldLevel = server->getLevel(player->dimension); // 4J Stu - Do this much earlier so we don't end up unloading chunks in the wrong dimension player->getLevel()->getChunkMap()->remove(player); @@ -718,9 +777,9 @@ void PlayerList::toggleDimension(shared_ptr player, int targetDime player->displayClientMessage(IDS_PLAYER_LEFT_END); } - player->dimension = targetDimension; + player->dimension = targetDimension; - ServerLevel *newLevel = server->getLevel(player->dimension); + ServerLevel *newLevel = server->getLevel(player->dimension); // 4J Stu - Fix for #46423 - TU5: Art: Code: No burning animation visible after entering The Nether while burning player->clearFire(); // Stop burning if travelling through a portal @@ -729,74 +788,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 +806,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 +820,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 +958,7 @@ void PlayerList::tick() { if( selectedPlayer->IsLocal() != TRUE ) { -//#ifdef _XBOX + //#ifdef _XBOX PlayerUID xuid = selectedPlayer->GetUID(); // Kick this player from the game shared_ptr player = nullptr; @@ -903,7 +982,7 @@ void PlayerList::tick() player->connection->setWasKicked(); player->connection->send( shared_ptr( new DisconnectPacket(DisconnectPacket::eDisconnect_Kicked) )); } -//#endif + //#endif } } } @@ -941,31 +1020,31 @@ void PlayerList::prioritiseTileChanges(int x, int y, int z, int dimension) void PlayerList::broadcastAll(shared_ptr packet) { - for (unsigned int i = 0; i < players.size(); i++) + for (unsigned int i = 0; i < players.size(); i++) { - shared_ptr player = players[i]; - player->connection->send(packet); - } + shared_ptr player = players[i]; + player->connection->send(packet); + } } void PlayerList::broadcastAll(shared_ptr packet, int dimension) { - for (unsigned int i = 0; i < players.size(); i++) + for (unsigned int i = 0; i < players.size(); i++) { - shared_ptr player = players[i]; - if (player->dimension == dimension) player->connection->send(packet); - } + shared_ptr player = players[i]; + if (player->dimension == dimension) player->connection->send(packet); + } } wstring PlayerList::getPlayerNames() { - wstring msg; - for (unsigned int i = 0; i < players.size(); i++) + wstring msg; + for (unsigned int i = 0; i < players.size(); i++) { - if (i > 0) msg += L", "; - msg += players[i]->name; - } - return msg; + if (i > 0) msg += L", "; + msg += players[i]->name; + } + return msg; } bool PlayerList::isWhiteListed(const wstring& name) @@ -991,38 +1070,145 @@ bool PlayerList::isOp(shared_ptr player) shared_ptr PlayerList::getPlayer(const wstring& name) { - for (unsigned int i = 0; i < players.size(); i++) + for (unsigned int i = 0; i < players.size(); i++) { - shared_ptr p = players[i]; - if (p->name == name) // 4J - used to be case insensitive (using equalsIgnoreCase) - imagine we'll be shifting to XUIDs anyway + shared_ptr p = players[i]; + if (p->name == name) // 4J - used to be case insensitive (using equalsIgnoreCase) - imagine we'll be shifting to XUIDs anyway { - return p; - } - } - return nullptr; + return p; + } + } + return nullptr; } // 4J Added shared_ptr PlayerList::getPlayer(PlayerUID uid) { - for (unsigned int i = 0; i < players.size(); i++) + for (unsigned int i = 0; i < players.size(); i++) { - shared_ptr p = players[i]; - if (p->getXuid() == uid || p->getOnlineXuid() == uid) // 4J - used to be case insensitive (using equalsIgnoreCase) - imagine we'll be shifting to XUIDs anyway + shared_ptr p = players[i]; + if (p->getXuid() == uid || p->getOnlineXuid() == uid) // 4J - used to be case insensitive (using equalsIgnoreCase) - imagine we'll be shifting to XUIDs anyway { - return p; - } - } - return nullptr; + return p; + } + } + return nullptr; +} + +shared_ptr PlayerList::getNearestPlayer(Pos *position, int range) +{ + if (players.empty()) return nullptr; + if (position == NULL) return players.at(0); + shared_ptr current = nullptr; + double dist = -1; + int rangeSqr = range * range; + + for (int i = 0; i < players.size(); i++) + { + shared_ptr next = players.at(i); + double newDist = position->distSqr(next->getCommandSenderWorldPosition()); + + if ((dist == -1 || newDist < dist) && (range <= 0 || newDist <= rangeSqr)) + { + dist = newDist; + current = next; + } + } + + return current; +} + +vector *PlayerList::getPlayers(Pos *position, int rangeMin, int rangeMax, int count, int mode, int levelMin, int levelMax, unordered_map *scoreRequirements, const wstring &playerName, const wstring &teamName, Level *level) +{ + app.DebugPrintf("getPlayers NOT IMPLEMENTED!"); + return NULL; + + /*if (players.empty()) return NULL; + vector > result = new vector >(); + bool reverse = count < 0; + bool playerNameNot = !playerName.empty() && playerName.startsWith("!"); + bool teamNameNot = !teamName.empty() && teamName.startsWith("!"); + int rangeMinSqr = rangeMin * rangeMin; + int rangeMaxSqr = rangeMax * rangeMax; + count = Mth.abs(count); + + if (playerNameNot) playerName = playerName.substring(1); + if (teamNameNot) teamName = teamName.substring(1); + + for (int i = 0; i < players.size(); i++) { + ServerPlayer player = players.get(i); + + if (level != null && player.level != level) continue; + if (playerName != null) { + if (playerNameNot == playerName.equalsIgnoreCase(player.getAName())) continue; + } + if (teamName != null) { + Team team = player.getTeam(); + String actualName = team == null ? "" : team.getName(); + if (teamNameNot == teamName.equalsIgnoreCase(actualName)) continue; + } + + if (position != null && (rangeMin > 0 || rangeMax > 0)) { + float distance = position.distSqr(player.getCommandSenderWorldPosition()); + if (rangeMin > 0 && distance < rangeMinSqr) continue; + if (rangeMax > 0 && distance > rangeMaxSqr) continue; + } + + if (!meetsScoreRequirements(player, scoreRequirements)) continue; + + if (mode != GameType.NOT_SET.getId() && mode != player.gameMode.getGameModeForPlayer().getId()) continue; + if (levelMin > 0 && player.experienceLevel < levelMin) continue; + if (player.experienceLevel > levelMax) continue; + + result.add(player); + } + + if (position != null) Collections.sort(result, new PlayerDistanceComparator(position)); + if (reverse) Collections.reverse(result); + if (count > 0) result = result.subList(0, Math.min(count, result.size())); + + return result;*/ +} + +bool PlayerList::meetsScoreRequirements(shared_ptr player, unordered_map scoreRequirements) +{ + app.DebugPrintf("meetsScoreRequirements NOT IMPLEMENTED!"); + return false; + + //if (scoreRequirements == null || scoreRequirements.size() == 0) return true; + + //for (Map.Entry requirement : scoreRequirements.entrySet()) { + // String name = requirement.getKey(); + // boolean min = false; + + // if (name.endsWith("_min") && name.length() > 4) { + // min = true; + // name = name.substring(0, name.length() - 4); + // } + + // Scoreboard scoreboard = player.getScoreboard(); + // Objective objective = scoreboard.getObjective(name); + // if (objective == null) return false; + // Score score = player.getScoreboard().getPlayerScore(player.getAName(), objective); + // int value = score.getScore(); + + // if (value < requirement.getValue() && min) { + // return false; + // } else if (value > requirement.getValue() && !min) { + // return false; + // } + //} + + //return true; } void PlayerList::sendMessage(const wstring& name, const wstring& message) { - shared_ptr player = getPlayer(name); - if (player != NULL) + shared_ptr player = getPlayer(name); + if (player != NULL) { - player->connection->send( shared_ptr( new ChatPacket(message) ) ); - } + player->connection->send( shared_ptr( new ChatPacket(message) ) ); + } } void PlayerList::broadcast(double x, double y, double z, double range, int dimension, shared_ptr packet) @@ -1040,11 +1226,11 @@ void PlayerList::broadcast(shared_ptr except, double x, double y, double sentTo.push_back(dynamic_pointer_cast(except)); } - for (unsigned int i = 0; i < players.size(); i++) + for (unsigned int i = 0; i < players.size(); i++) { - shared_ptr p = players[i]; - if (p == except) continue; - if (p->dimension != dimension) continue; + shared_ptr p = players[i]; + if (p == except) continue; + if (p->dimension != dimension) continue; // 4J - don't send to the same machine more than once bool dontSend = false; @@ -1074,10 +1260,10 @@ void PlayerList::broadcast(shared_ptr except, double x, double y, double } - double xd = x - p->x; - double yd = y - p->y; - double zd = z - p->z; - if (xd * xd + yd * yd + zd * zd < range * range) + double xd = x - p->x; + double yd = y - p->y; + double zd = z - p->z; + if (xd * xd + yd * yd + zd * zd < range * range) { #if 0 // _DEBUG shared_ptr SoundPacket= dynamic_pointer_cast(packet); @@ -1090,37 +1276,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 +1293,7 @@ void PlayerList::saveAll(ProgressListener *progressListener, bool bDeleteGuestMa for (unsigned int i = 0; i < players.size(); i++) { playerIo->save(players[i]); - + //4J Stu - We don't want to save the map data for guests, so when we are sure that the player is gone delete the map if(bDeleteGuestMaps && players[i]->isGuest()) playerIo->deleteMapFilesForPlayer(players[i]); @@ -1156,16 +1318,16 @@ void PlayerList::reloadWhitelist() void PlayerList::sendLevelInfo(shared_ptr player, ServerLevel *level) { - player->connection->send( shared_ptr( new SetTimePacket(level->getTime()) ) ); - if (level->isRaining()) + player->connection->send( shared_ptr( new SetTimePacket(level->getGameTime(), level->getDayTime(), level->getGameRules()->getBoolean(GameRules::RULE_DAYLIGHT)) ) ); + if (level->isRaining()) { - player->connection->send( shared_ptr( new GameEventPacket(GameEventPacket::START_RAINING, 0) ) ); - } + player->connection->send( shared_ptr( new GameEventPacket(GameEventPacket::START_RAINING, 0) ) ); + } else { // 4J Stu - Fix for #44836 - Customer Encountered: Out of Sync Weather [A-10] // If it was raining when the player left the level, and is now not raining we need to make sure that state is updated - player->connection->send( shared_ptr( new GameEventPacket(GameEventPacket::STOP_RAINING, 0) ) ); + player->connection->send( shared_ptr( new GameEventPacket(GameEventPacket::STOP_RAINING, 0) ) ); } // send the stronghold position if there is one @@ -1177,8 +1339,9 @@ void PlayerList::sendLevelInfo(shared_ptr player, ServerLevel *lev void PlayerList::sendAllPlayerInfo(shared_ptr player) { - player->refreshContainer(player->inventoryMenu); - player->resetSentInfo(); + player->refreshContainer(player->inventoryMenu); + player->resetSentInfo(); + player->connection->send( shared_ptr( new SetCarriedItemPacket(player->inventory->selected)) ); } int PlayerList::getPlayerCount() @@ -1215,7 +1378,7 @@ int PlayerList::getViewDistance() void PlayerList::setOverrideGameMode(GameType *gameMode) { - this->overrideGameMode = gameMode; + overrideGameMode = gameMode; } void PlayerList::updatePlayerGameMode(shared_ptr newPlayer, shared_ptr oldPlayer, Level *level) @@ -1389,7 +1552,7 @@ void PlayerList::addPlayerToReceiving(shared_ptr player) } } } - + if( shouldAddPlayer ) { #ifndef _CONTENT_PACKAGE diff --git a/Minecraft.Client/PlayerList.h b/Minecraft.Client/PlayerList.h index 14bd6b2d..6a6ee94c 100644 --- a/Minecraft.Client/PlayerList.h +++ b/Minecraft.Client/PlayerList.h @@ -13,6 +13,7 @@ class TileEntity; class ProgressListener; class GameType; class LoginPacket; +class ServerScoreboard; using namespace std; @@ -64,10 +65,15 @@ public: PlayerList(MinecraftServer *server); ~PlayerList(); void placeNewPlayer(Connection *connection, shared_ptr player, shared_ptr packet); + +protected: + void updateEntireScoreboard(ServerScoreboard *scoreboard, shared_ptr player); + +public: void setLevel(ServerLevelArray levels); void changeDimension(shared_ptr player, ServerLevel *from); int getMaxRange(); - bool load(shared_ptr player); // 4J Changed return val to bool to check if new player or loaded player + CompoundTag *load(shared_ptr player); protected: void save(shared_ptr player); public: @@ -78,6 +84,7 @@ public: shared_ptr getPlayerForLogin(PendingConnection *pendingConnection, const wstring& userName, PlayerUID xuid, PlayerUID OnlineXuid); shared_ptr respawn(shared_ptr serverPlayer, int targetDimension, bool keepAllPlayerData); void toggleDimension(shared_ptr player, int targetDimension); + void repositionAcrossDimension(shared_ptr entity, int lastDimension, ServerLevel *oldLevel, ServerLevel *newLevel); void tick(); bool isTrackingTile(int x, int y, int z, int dimension); // 4J added void prioritiseTileChanges(int x, int y, int z, int dimension); // 4J added @@ -92,11 +99,16 @@ public: bool isOp(shared_ptr player); // 4J Added shared_ptr getPlayer(const wstring& name); shared_ptr getPlayer(PlayerUID uid); + shared_ptr getNearestPlayer(Pos *position, int range); + vector *getPlayers(Pos *position, int rangeMin, int rangeMax, int count, int mode, int levelMin, int levelMax, unordered_map *scoreRequirements, const wstring &playerName, const wstring &teamName, Level *level); + +private: + bool meetsScoreRequirements(shared_ptr player, unordered_map scoreRequirements); + +public: void sendMessage(const wstring& name, const wstring& message); void broadcast(double x, double y, double z, double range, int dimension, shared_ptr packet); void broadcast(shared_ptr except, double x, double y, double z, double range, int dimension, shared_ptr packet); - void broadcastToAllOps(const wstring& message); - bool sendTo(const wstring& name, shared_ptr packet); // 4J Added ProgressListener *progressListener param and bDeleteGuestMaps param void saveAll(ProgressListener *progressListener, bool bDeleteGuestMaps = false); void whiteList(const wstring& playerName); diff --git a/Minecraft.Client/PlayerRenderer.cpp b/Minecraft.Client/PlayerRenderer.cpp index c332b41c..7d135c2b 100644 --- a/Minecraft.Client/PlayerRenderer.cpp +++ b/Minecraft.Client/PlayerRenderer.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "PlayerRenderer.h" #include "SkullTileRenderer.h" +#include "HumanoidMobRenderer.h" #include "HumanoidModel.h" #include "ModelPart.h" #include "LocalPlayer.h" @@ -27,9 +28,9 @@ const unsigned int PlayerRenderer::s_nametagColors[MINECRAFT_NET_MAX_PLAYERS] = #endif }; -const wstring PlayerRenderer::MATERIAL_NAMES[5] = { L"cloth", L"chain", L"iron", L"diamond", L"gold" }; +ResourceLocation PlayerRenderer::DEFAULT_LOCATION = ResourceLocation(TN_MOB_CHAR); -PlayerRenderer::PlayerRenderer() : MobRenderer( new HumanoidModel(0), 0.5f ) +PlayerRenderer::PlayerRenderer() : LivingEntityRenderer( new HumanoidModel(0), 0.5f ) { humanoidModel = (HumanoidModel *) model; @@ -46,7 +47,7 @@ unsigned int PlayerRenderer::getNametagColour(int index) return 0xFF000000; } -int PlayerRenderer::prepareArmor(shared_ptr _player, int layer, float a) +int PlayerRenderer::prepareArmor(shared_ptr _player, int layer, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr player = dynamic_pointer_cast(_player); @@ -65,7 +66,7 @@ int PlayerRenderer::prepareArmor(shared_ptr _player, int layer, float a) if (dynamic_cast(item)) { ArmorItem *armorItem = dynamic_cast(item); - bindTexture(L"armor/" + MATERIAL_NAMES[armorItem->modelIndex] + L"_" + _toString(layer == 2 ? 2 : 1) + L".png"); + bindTexture(HumanoidMobRenderer::getArmorLocation(armorItem, layer)); HumanoidModel *armor = layer == 2 ? armorParts2 : armorParts1; @@ -108,7 +109,7 @@ int PlayerRenderer::prepareArmor(shared_ptr _player, int layer, float a) } -void PlayerRenderer::prepareSecondPassArmor(shared_ptr _player, int layer, float a) +void PlayerRenderer::prepareSecondPassArmor(shared_ptr _player, int layer, float a) { // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr player = dynamic_pointer_cast(_player); @@ -119,7 +120,7 @@ void PlayerRenderer::prepareSecondPassArmor(shared_ptr _player, int layer, if (dynamic_cast(item)) { ArmorItem *armorItem = dynamic_cast(item); - bindTexture(L"armor/" + MATERIAL_NAMES[armorItem->modelIndex] + L"_" + _toString(layer == 2 ? 2 : 1) + L"_b.png"); + bindTexture(HumanoidMobRenderer::getArmorLocation((ArmorItem *)item, layer, true)); float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : player->getBrightness(a); glColor3f(brightness, brightness, brightness); @@ -169,7 +170,7 @@ void PlayerRenderer::render(shared_ptr _mob, double x, double y, double armorParts1->sneaking = armorParts2->sneaking = humanoidModel->sneaking = mob->isSneaking(); double yp = y - mob->heightOffset; - if (mob->isSneaking() && (dynamic_pointer_cast(mob) == NULL)) + if (mob->isSneaking() && !mob->instanceof(eTYPE_LOCALPLAYER)) { yp -= 2 / 16.0f; } @@ -210,7 +211,7 @@ void PlayerRenderer::render(shared_ptr _mob, double x, double y, double } } - MobRenderer::render(mob, x, yp, z, rot, a); + LivingEntityRenderer::render(mob, x, yp, z, rot, a); // turn them off again if(pAdditionalModelParts && pAdditionalModelParts->size()!=0) @@ -228,97 +229,13 @@ void PlayerRenderer::render(shared_ptr _mob, double x, double y, double } -void PlayerRenderer::renderName(shared_ptr _mob, double x, double y, double z) +void PlayerRenderer::additionalRendering(shared_ptr _mob, float a) { - // 4J - dynamic cast required because we aren't using templates/generics in our version - shared_ptr mob = dynamic_pointer_cast(_mob); + 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/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/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..ab9db75d 100644 --- a/Minecraft.Client/Textures.cpp +++ b/Minecraft.Client/Textures.cpp @@ -16,6 +16,9 @@ #include "..\Minecraft.World\net.minecraft.world.h" #include "..\Minecraft.World\net.minecraft.world.level.h" #include "..\Minecraft.World\StringHelpers.h" +#include "ResourceLocation.h" +#include "..\Minecraft.World\ItemEntity.h" +#include "TextureAtlas.h" bool Textures::MIPMAP = true; C4JRender::eTextureFormat Textures::TEXTURE_FORMAT = C4JRender::TEXTURE_FORMAT_RxGyBzAw; @@ -120,6 +123,44 @@ wchar_t *Textures::preLoaded[TN_COUNT] = L"mob/wolf_collar", L"mob/zombie_villager", + // 1.6.4 + L"item/lead_knot", + + L"misc/beacon_beam", + + L"mob/bat", + + L"mob/horse/donkey", + L"mob/horse/horse_black", + L"mob/horse/horse_brown", + L"mob/horse/horse_chestnut", + L"mob/horse/horse_creamy", + L"mob/horse/horse_darkbrown", + L"mob/horse/horse_gray", + L"mob/horse/horse_markings_blackdots", + L"mob/horse/horse_markings_white", + L"mob/horse/horse_markings_whitedots", + L"mob/horse/horse_markings_whitefield", + L"mob/horse/horse_skeleton", + L"mob/horse/horse_white", + L"mob/horse/horse_zombie", + L"mob/horse/mule", + + L"mob/horse/armor/horse_armor_diamond", + L"mob/horse/armor/horse_armor_gold", + L"mob/horse/armor/horse_armor_iron", + + L"mob/witch", + + L"mob/wither/wither", + L"mob/wither/wither_armor", + L"mob/wither/wither_invulnerable", + + L"item/trapped", + L"item/trapped_double", + //L"item/christmas", + //L"item/christmas_double", + #ifdef _LARGE_WORLDS L"misc/additionalmapicons", #endif @@ -367,9 +408,28 @@ void Textures::bindTexture(const wstring &resourceName) } // 4J Added -void Textures::bindTexture(int resourceId) +void Textures::bindTexture(ResourceLocation *resource) { - bind(loadTexture(resourceId)); + if(resource->isPreloaded()) + { + bind(loadTexture(resource->getTexture())); + } + else + { + bind(loadTexture(TN_COUNT, resource->getPath())); + } +} + +void Textures::bindTextureLayers(ResourceLocation *resource) +{ + assert(resource->isPreloaded()); + + int layers = resource->getTextureCount(); + + for( int i = 0; i < layers; i++ ) + { + RenderManager.TextureBind(loadTexture(resource->getTexture(i))); + } } void Textures::bind(int id) @@ -382,6 +442,26 @@ void Textures::bind(int id) } } +ResourceLocation *Textures::getTextureLocation(shared_ptr entity) +{ + shared_ptr item = dynamic_pointer_cast(entity); + int iconType = item->getItem()->getIconType(); + return getTextureLocation(iconType); +} + +ResourceLocation *Textures::getTextureLocation(int iconType) +{ + switch(iconType) + { + case Icon::TYPE_TERRAIN: + return &TextureAtlas::LOCATION_BLOCKS; + break; + case Icon::TYPE_ITEM: + return &TextureAtlas::LOCATION_ITEMS; + break; + } +} + void Textures::clearLastBoundId() { lastBoundId = -1; @@ -1300,6 +1380,42 @@ TEXTURE_NAME TUImages[] = TN_PARTICLES, TN_MOB_ZOMBIE_VILLAGER, + TN_ITEM_LEASHKNOT, + + TN_MISC_BEACON_BEAM, + + TN_MOB_BAT, + + TN_MOB_DONKEY, + TN_MOB_HORSE_BLACK, + TN_MOB_HORSE_BROWN, + TN_MOB_HORSE_CHESTNUT, + TN_MOB_HORSE_CREAMY, + TN_MOB_HORSE_DARKBROWN, + TN_MOB_HORSE_GRAY, + TN_MOB_HORSE_MARKINGS_BLACKDOTS, + TN_MOB_HORSE_MARKINGS_WHITE, + TN_MOB_HORSE_MARKINGS_WHITEDOTS, + TN_MOB_HORSE_MARKINGS_WHITEFIELD, + TN_MOB_HORSE_SKELETON, + TN_MOB_HORSE_WHITE, + TN_MOB_HORSE_ZOMBIE, + TN_MOB_MULE, + TN_MOB_HORSE_ARMOR_DIAMOND, + TN_MOB_HORSE_ARMOR_GOLD, + TN_MOB_HORSE_ARMOR_IRON, + + TN_MOB_WITCH, + + TN_MOB_WITHER, + TN_MOB_WITHER_ARMOR, + TN_MOB_WITHER_INVULNERABLE, + + TN_TILE_TRAP_CHEST, + TN_TILE_LARGE_TRAP_CHEST, + //TN_TILE_XMAS_CHEST, + //TN_TILE_LARGE_XMAS_CHEST, + #ifdef _LARGE_WORLDS TN_MISC_ADDITIONALMAPICONS, #endif @@ -1324,6 +1440,8 @@ wchar_t *TUImagePaths[] = L"armor/cloth_2.png", L"armor/cloth_2_b.png", + // + NULL }; diff --git a/Minecraft.Client/Textures.h b/Minecraft.Client/Textures.h index eb0799e2..eb3d2f6d 100644 --- a/Minecraft.Client/Textures.h +++ b/Minecraft.Client/Textures.h @@ -12,6 +12,7 @@ class Options; using namespace std; class IntBuffer; class PreStitchedTextureMap; +class ResourceLocation; typedef enum _TEXTURE_NAME @@ -102,7 +103,7 @@ typedef enum _TEXTURE_NAME TN_TERRAIN_MOON_PHASES, // 1.2.3 - TN_MOB_OZELOT, + TN_MOB_OCELOT, TN_MOB_CAT_BLACK, TN_MOB_CAT_RED, TN_MOB_CAT_SIAMESE, @@ -113,6 +114,43 @@ typedef enum _TEXTURE_NAME TN_MOB_WOLF_COLLAR, TN_MOB_ZOMBIE_VILLAGER, + // 1.6.4 + TN_ITEM_LEASHKNOT, + + TN_MISC_BEACON_BEAM, + + TN_MOB_BAT, + + TN_MOB_DONKEY, + TN_MOB_HORSE_BLACK, + TN_MOB_HORSE_BROWN, + TN_MOB_HORSE_CHESTNUT, + TN_MOB_HORSE_CREAMY, + TN_MOB_HORSE_DARKBROWN, + TN_MOB_HORSE_GRAY, + TN_MOB_HORSE_MARKINGS_BLACKDOTS, + TN_MOB_HORSE_MARKINGS_WHITE, + TN_MOB_HORSE_MARKINGS_WHITEDOTS, + TN_MOB_HORSE_MARKINGS_WHITEFIELD, + TN_MOB_HORSE_SKELETON, + TN_MOB_HORSE_WHITE, + TN_MOB_HORSE_ZOMBIE, + TN_MOB_MULE, + TN_MOB_HORSE_ARMOR_DIAMOND, + TN_MOB_HORSE_ARMOR_GOLD, + TN_MOB_HORSE_ARMOR_IRON, + + TN_MOB_WITCH, + + TN_MOB_WITHER, + TN_MOB_WITHER_ARMOR, + TN_MOB_WITHER_INVULNERABLE, + + TN_TILE_TRAP_CHEST, + TN_TILE_LARGE_TRAP_CHEST, + //TN_TILE_XMAS_CHEST, + //TN_TILE_LARGE_XMAS_CHEST, + #ifdef _LARGE_WORLDS TN_MISC_ADDITIONALMAPICONS, #endif @@ -240,11 +278,15 @@ private: public: void bindTexture(const wstring &resourceName); - void bindTexture(int resourceId); // 4J Added + void bindTexture(ResourceLocation *resource); // 4J Added + void bindTextureLayers(ResourceLocation *resource); // 4J added // 4J Made public for use in XUI controls void bind(int id); + ResourceLocation *getTextureLocation(shared_ptr entity); + ResourceLocation *getTextureLocation(int iconType); + public: void clearLastBoundId(); diff --git a/Minecraft.Client/TheEndPortalRenderer.cpp b/Minecraft.Client/TheEndPortalRenderer.cpp index 52581579..98c7e7cc 100644 --- a/Minecraft.Client/TheEndPortalRenderer.cpp +++ b/Minecraft.Client/TheEndPortalRenderer.cpp @@ -7,19 +7,24 @@ #include "..\Minecraft.World\FloatBuffer.h" #include "TheEndPortalRenderer.h" +ResourceLocation TheEndPortalRenderer::END_SKY_LOCATION = ResourceLocation(TN_MISC_TUNNEL); +ResourceLocation TheEndPortalRenderer::END_PORTAL_LOCATION = ResourceLocation(TN_MISC_PARTICLEFIELD); +int TheEndPortalRenderer::RANDOM_SEED = 31100; +Random TheEndPortalRenderer::RANDOM = Random(RANDOM_SEED); + void TheEndPortalRenderer::render(shared_ptr _table, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) { // 4J Convert as we aren't using a templated class shared_ptr table = dynamic_pointer_cast(_table); - float xx = (float) (tileEntityRenderDispatcher->xPlayer); - float yy = (float) (tileEntityRenderDispatcher->yPlayer); - float zz = (float) (tileEntityRenderDispatcher->zPlayer); + float xx = (float) tileEntityRenderDispatcher->xPlayer; + float yy = (float) tileEntityRenderDispatcher->yPlayer; + float zz = (float) tileEntityRenderDispatcher->zPlayer; glDisable(GL_LIGHTING); - Random random(31100); + RANDOM.setSeed(RANDOM_SEED); - float hoff = (12) / 16.0f; + float hoff = 12 / 16.0f; for (int i = 0; i < 16; i++) { glPushMatrix(); @@ -30,7 +35,7 @@ void TheEndPortalRenderer::render(shared_ptr _table, double x, doubl float br = 1.0f / (dist + 1); if (i == 0) { - this->bindTexture(TN_MISC_TUNNEL); // 4J was "/misc/tunnel.png" + this->bindTexture(&END_SKY_LOCATION); br = 0.1f; dist = 65; sscale = 1 / 8.0f; @@ -39,7 +44,7 @@ void TheEndPortalRenderer::render(shared_ptr _table, double x, doubl } if (i == 1) { - this->bindTexture(TN_MISC_PARTICLEFIELD); // 4J was "/misc/particlefield.png" + this->bindTexture(&END_PORTAL_LOCATION); glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE); sscale = 1 / 2.0f; @@ -78,7 +83,7 @@ void TheEndPortalRenderer::render(shared_ptr _table, double x, doubl glPushMatrix(); glLoadIdentity(); - glTranslatef(0, (System::currentTimeMillis() % 700000 / 700000.0f), 0); + glTranslatef(0, System::currentTimeMillis() % 700000 / 700000.0f, 0); glScalef(sscale, sscale, sscale); glTranslatef(0.5f, 0.5f, 0); glRotatef((i * i * 4321 + i * 9) * 2.0f, 0, 0, 1); @@ -91,9 +96,9 @@ void TheEndPortalRenderer::render(shared_ptr _table, double x, doubl t->useProjectedTexture(true); // 4J added - turns on both the generation of texture coordinates in the vertex shader & perspective divide of the texture coord in the pixel shader t->begin(); - float r = random.nextFloat() * 0.5f + 0.1f; - float g = random.nextFloat() * 0.5f + 0.4f; - float b = random.nextFloat() * 0.5f + 0.5f; + float r = RANDOM.nextFloat() * 0.5f + 0.1f; + float g = RANDOM.nextFloat() * 0.5f + 0.4f; + float b = RANDOM.nextFloat() * 0.5f + 0.5f; if (i == 0) r = g = b = 1; t->color(r * br, g * br, b * br, 1.0f); t->vertex(x, y + hoff, z); diff --git a/Minecraft.Client/TheEndPortalRenderer.h b/Minecraft.Client/TheEndPortalRenderer.h index 1e4ca546..d94fddc3 100644 --- a/Minecraft.Client/TheEndPortalRenderer.h +++ b/Minecraft.Client/TheEndPortalRenderer.h @@ -4,6 +4,12 @@ class TheEndPortalRenderer : public TileEntityRenderer { +private: + static ResourceLocation END_SKY_LOCATION; + static ResourceLocation END_PORTAL_LOCATION; + static int RANDOM_SEED; + static Random RANDOM; + public: virtual void render(shared_ptr _table, double x, double y, double z, float a, bool setColor, float alpha=1.0f, bool useCompiled = true); diff --git a/Minecraft.Client/TileEntityRenderDispatcher.cpp b/Minecraft.Client/TileEntityRenderDispatcher.cpp index 1708d215..f9ecfea4 100644 --- a/Minecraft.Client/TileEntityRenderDispatcher.cpp +++ b/Minecraft.Client/TileEntityRenderDispatcher.cpp @@ -13,6 +13,7 @@ #include "TheEndPortalRenderer.h" #include "SkullTileRenderer.h" #include "EnderChestRenderer.h" +#include "BeaconRenderer.h" TileEntityRenderDispatcher *TileEntityRenderDispatcher::instance = NULL; double TileEntityRenderDispatcher::xOff = 0; @@ -28,12 +29,12 @@ TileEntityRenderDispatcher::TileEntityRenderDispatcher() { // 4J -a dded font = NULL; - textures = NULL; - level = NULL; - cameraEntity = nullptr; - playerRotY = 0.0f; - playerRotX = 0.0f;; - xPlayer = yPlayer = zPlayer = 0; + textures = NULL; + level = NULL; + cameraEntity = nullptr; + playerRotY = 0.0f; + playerRotX = 0.0f;; + xPlayer = yPlayer = zPlayer = 0; glEnable(GL_LIGHTING); renderers[eTYPE_SIGNTILEENTITY] = new SignRenderer(); @@ -45,19 +46,20 @@ TileEntityRenderDispatcher::TileEntityRenderDispatcher() renderers[eTYPE_THEENDPORTALTILEENTITY] = new TheEndPortalRenderer(); renderers[eTYPE_SKULLTILEENTITY] = new SkullTileRenderer(); renderers[eTYPE_FURNACETILEENTITY] = NULL; + renderers[eTYPE_BEACONTILEENTITY] = new BeaconRenderer(); glDisable(GL_LIGHTING); AUTO_VAR(itEnd, renderers.end()); for( classToTileRendererMap::iterator it = renderers.begin(); it != itEnd; it++ ) { if(it->second) it->second->init(this); - } + } } TileEntityRenderer *TileEntityRenderDispatcher::getRenderer(eINSTANCEOF e) { TileEntityRenderer *r = NULL; - //TileEntityRenderer *r = renderers[e]; + //TileEntityRenderer *r = renderers[e]; AUTO_VAR(it, renderers.find( e )); // 4J Stu - The .at and [] accessors insert elements if they don't exist if( it == renderers.end() ) @@ -66,13 +68,13 @@ TileEntityRenderer *TileEntityRenderDispatcher::getRenderer(eINSTANCEOF e) } /* 4J - not doing this hierarchical search anymore. We need to explicitly add renderers for any eINSTANCEOF type that we want to be able to render - if (it == renderers.end() && e != TileEntity::_class) + if (it == renderers.end() && e != TileEntity::_class) { - r = getRenderer(dynamic_cast( e->getSuperclass() )); + r = getRenderer(dynamic_cast( e->getSuperclass() )); // 4J - added condition here to only add if a valid renderer found if( r ) renderers.insert( classToTileRendererMap::value_type( e, r ) ); //assert(false); - } + } else if(it != renderers.end() && e != TileEntity::_class) r = (*it).second; */ @@ -87,57 +89,57 @@ bool TileEntityRenderDispatcher::hasRenderer(shared_ptr e) TileEntityRenderer *TileEntityRenderDispatcher::getRenderer(shared_ptr e) { - if (e == NULL) return NULL; - return getRenderer(e->GetType()); + if (e == NULL) return NULL; + return getRenderer(e->GetType()); } -void TileEntityRenderDispatcher::prepare(Level *level, Textures *textures, Font *font, shared_ptr player, float a) +void TileEntityRenderDispatcher::prepare(Level *level, Textures *textures, Font *font, shared_ptr player, float a) { if( this->level != level ) { setLevel( level ); } - this->textures = textures; - this->cameraEntity = player; - this->font = font; + this->textures = textures; + cameraEntity = player; + this->font = font; - playerRotY = player->yRotO + (player->yRot - player->yRotO) * a; - playerRotX = player->xRotO + (player->xRot - player->xRotO) * a; + playerRotY = player->yRotO + (player->yRot - player->yRotO) * a; + playerRotX = player->xRotO + (player->xRot - player->xRotO) * a; - xPlayer = player->xOld + (player->x - player->xOld) * a; - yPlayer = player->yOld + (player->y - player->yOld) * a; - zPlayer = player->zOld + (player->z - player->zOld) * a; + xPlayer = player->xOld + (player->x - player->xOld) * a; + yPlayer = player->yOld + (player->y - player->yOld) * a; + zPlayer = player->zOld + (player->z - player->zOld) * a; } void TileEntityRenderDispatcher::render(shared_ptr e, float a, bool setColor/*=true*/) { - if (e->distanceToSqr(xPlayer, yPlayer, zPlayer) < 64 * 64) + if (e->distanceToSqr(xPlayer, yPlayer, zPlayer) < e->getViewDistance()) { // 4J - changes brought forward from 1.8.2 - if (SharedConstants::TEXTURE_LIGHTING) + if (SharedConstants::TEXTURE_LIGHTING) { - int col = level->getLightColor(e->x, e->y, e->z, 0); - int u = col % 65536; - int v = col / 65536; - glMultiTexCoord2f(GL_TEXTURE1, u / 1.0f, v / 1.0f); - glColor4f(1, 1, 1, 1); - } + int col = level->getLightColor(e->x, e->y, e->z, 0); + int u = col % 65536; + int v = col / 65536; + glMultiTexCoord2f(GL_TEXTURE1, u / 1.0f, v / 1.0f); + glColor4f(1, 1, 1, 1); + } else { - float br = level->getBrightness(e->x, e->y, e->z); - glColor4f(br, br, br, 1); - } - render(e, e->x - xOff, e->y - yOff, e->z - zOff, a, setColor); - } + float br = level->getBrightness(e->x, e->y, e->z); + glColor4f(br, br, br, 1); + } + render(e, e->x - xOff, e->y - yOff, e->z - zOff, a, setColor); + } } void TileEntityRenderDispatcher::render(shared_ptr entity, double x, double y, double z, float a, bool setColor/*=true*/, float alpha, bool useCompiled) { - TileEntityRenderer *renderer = getRenderer(entity); - if (renderer != NULL) + TileEntityRenderer *renderer = getRenderer(entity); + if (renderer != NULL) { - renderer->render(entity, x, y, z, a, setColor, alpha, useCompiled); - } + renderer->render(entity, x, y, z, a, setColor, alpha, useCompiled); + } } void TileEntityRenderDispatcher::setLevel(Level *level) @@ -152,10 +154,10 @@ void TileEntityRenderDispatcher::setLevel(Level *level) double TileEntityRenderDispatcher::distanceToSqr(double x, double y, double z) { - double xd = x - xPlayer; - double yd = y - yPlayer; - double zd = z - zPlayer; - return xd * xd + yd * yd + zd * zd; + double xd = x - xPlayer; + double yd = y - yPlayer; + double zd = z - zPlayer; + return xd * xd + yd * yd + zd * zd; } Font *TileEntityRenderDispatcher::getFont() diff --git a/Minecraft.Client/TileEntityRenderDispatcher.h b/Minecraft.Client/TileEntityRenderDispatcher.h index d86ddb01..a9d5fea7 100644 --- a/Minecraft.Client/TileEntityRenderDispatcher.h +++ b/Minecraft.Client/TileEntityRenderDispatcher.h @@ -25,7 +25,7 @@ public: Textures *textures; Level *level; - shared_ptr cameraEntity; + shared_ptr cameraEntity; float playerRotY; float playerRotX; double xPlayer, yPlayer, zPlayer; @@ -37,7 +37,7 @@ public: TileEntityRenderer *getRenderer(eINSTANCEOF e); bool hasRenderer(shared_ptr e); TileEntityRenderer * getRenderer(shared_ptr e); - void prepare(Level *level, Textures *textures, Font *font, shared_ptr player, float a); + void prepare(Level *level, Textures *textures, Font *font, shared_ptr player, float a); void render(shared_ptr e, float a, bool setColor = true); void render(shared_ptr entity, double x, double y, double z, float a, bool setColor = true, float alpha=1.0f, bool useCompiled = true); // 4J Added useCompiled void setLevel(Level *level); diff --git a/Minecraft.Client/TileEntityRenderer.cpp b/Minecraft.Client/TileEntityRenderer.cpp index b5c83d71..94bdd39c 100644 --- a/Minecraft.Client/TileEntityRenderer.cpp +++ b/Minecraft.Client/TileEntityRenderer.cpp @@ -2,16 +2,16 @@ #include "TileEntityRenderer.h" #include "TileEntityRenderDispatcher.h" -void TileEntityRenderer::bindTexture(int resourceName) +void TileEntityRenderer::bindTexture(ResourceLocation *location) { Textures *t = tileEntityRenderDispatcher->textures; - if(t != NULL) t->bind(t->loadTexture(resourceName)); + if(t != NULL) t->bind(t->loadTexture(location->getTexture())); } -void TileEntityRenderer::bindTexture(const wstring& urlTexture, int backupTexture) +void TileEntityRenderer::bindTexture(const wstring& urlTexture, ResourceLocation *location) { Textures *t = tileEntityRenderDispatcher->textures; - if(t != NULL) t->bind(t->loadHttpTexture(urlTexture, backupTexture)); + if(t != NULL) t->bind(t->loadHttpTexture(urlTexture, location->getTexture())); } Level *TileEntityRenderer::getLevel() diff --git a/Minecraft.Client/TileEntityRenderer.h b/Minecraft.Client/TileEntityRenderer.h index b7d08b86..b3bafb9d 100644 --- a/Minecraft.Client/TileEntityRenderer.h +++ b/Minecraft.Client/TileEntityRenderer.h @@ -1,5 +1,7 @@ #pragma once #include "Textures.h" +#include "ResourceLocation.h" + class TileEntityRenderDispatcher; class TileEntity; class Level; @@ -10,11 +12,11 @@ class TileEntityRenderer protected: TileEntityRenderDispatcher *tileEntityRenderDispatcher; public: - virtual void render(shared_ptr entity, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) = 0; // 4J added setColor param and alpha and useCompiled + virtual void render(shared_ptr entity, double x, double y, double z, float a, bool setColor, float alpha, bool useCompiled) = 0; // 4J added setColor param, alpha and useCompiled virtual void onNewLevel(Level *level) {} protected: - void bindTexture(int resourceName); // 4J - changed from wstring to int - void bindTexture(const wstring& urlTexture, int backupTexture); // 4J - changed from wstring to int + void bindTexture(ResourceLocation *location); // 4J - changed from wstring to int + void bindTexture(const wstring& urlTexture, ResourceLocation *location); // 4J - changed from wstring to int private: Level *getLevel(); public: diff --git a/Minecraft.Client/TileRenderer.cpp b/Minecraft.Client/TileRenderer.cpp index 3b8d4c4e..2acc6170 100644 --- a/Minecraft.Client/TileRenderer.cpp +++ b/Minecraft.Client/TileRenderer.cpp @@ -22,7 +22,6 @@ void TileRenderer::_init() fixedTexture = NULL; xFlipTexture = false; noCulling = false; - blsmooth = 1; applyAmbienceOcclusion = false; setColor = true; northFlip = FLIP_NONE; @@ -187,6 +186,15 @@ void TileRenderer::clearFixedTexture() bool TileRenderer::hasFixedTexture() { +#ifdef __PSVITA__ + // AP - alpha cut out is expensive on vita. Pass on the Alpha Cut out flag to the tesselator + if(fixedTexture) + { + Tesselator* t = Tesselator::getInstance(); + t->setAlphaCutOut( fixedTexture->getFlags() & Icon::IS_ALPHA_CUT_OUT ); + } +#endif + return fixedTexture != NULL; } @@ -244,7 +252,7 @@ void TileRenderer::tesselateInWorldFixedTexture( Tile* tile, int x, int y, int z } void TileRenderer::tesselateInWorldNoCulling( Tile* tile, int x, int y, int z, int forceData, - shared_ptr< TileEntity > forceEntity ) // 4J added forceData, forceEntity param + shared_ptr< TileEntity > forceEntity ) // 4J added forceData, forceEntity param { noCulling = true; tesselateInWorld( tile, x, y, z, forceData ); @@ -252,7 +260,7 @@ void TileRenderer::tesselateInWorldNoCulling( Tile* tile, int x, int y, int z, i } bool TileRenderer::tesselateInWorld( Tile* tt, int x, int y, int z, int forceData, - shared_ptr< TileEntity > forceEntity ) // 4J added forceData, forceEntity param + shared_ptr< TileEntity > forceEntity ) // 4J added forceData, forceEntity param { Tesselator* t = Tesselator::getInstance(); int shape = tt->getRenderShape(); @@ -377,9 +385,15 @@ bool TileRenderer::tesselateInWorld( Tile* tt, int x, int y, int z, int forceDat case Tile::SHAPE_BED: retVal = tesselateBedInWorld( tt, x, y, z ); break; + case Tile::SHAPE_REPEATER: + retVal = tesselateRepeaterInWorld((RepeaterTile *)tt, x, y, z); + break; case Tile::SHAPE_DIODE: retVal = tesselateDiodeInWorld( (DiodeTile *)tt, x, y, z ); break; + case Tile::SHAPE_COMPARATOR: + retVal = tesselateComparatorInWorld((ComparatorTile *)tt, x, y, z); + break; case Tile::SHAPE_PISTON_BASE: retVal = tesselatePistonBaseInWorld( tt, x, y, z, false, forceData ); break; @@ -389,6 +403,9 @@ bool TileRenderer::tesselateInWorld( Tile* tt, int x, int y, int z, int forceDat case Tile::SHAPE_IRON_FENCE: retVal = tesselateThinFenceInWorld( ( ThinFenceTile* )tt, x, y, z ); break; + case Tile::SHAPE_THIN_PANE: + retVal = tesselateThinPaneInWorld(tt, x, y, z); + break; case Tile::SHAPE_VINE: retVal = tesselateVineInWorld( tt, x, y, z ); break; @@ -411,7 +428,13 @@ bool TileRenderer::tesselateInWorld( Tile* tt, int x, int y, int z, int forceDat retVal = tesselateAirPortalFrameInWorld((TheEndPortalFrameTile *)tt, x, y, z); break; case Tile::SHAPE_COCOA: - retVal = tesselateCocoaInWorld((CocoaTile *) tt, x, y, z); + retVal = tesselateCocoaInWorld((CocoaTile *)tt, x, y, z); + break; + case Tile::SHAPE_BEACON: + retVal = tesselateBeaconInWorld(tt, x, y, z); + break; + case Tile::SHAPE_HOPPER: + retVal = tesselateHopperInWorld(tt, x, y, z); break; }; @@ -423,42 +446,42 @@ bool TileRenderer::tesselateInWorld( Tile* tt, int x, int y, int z, int forceDat bool TileRenderer::tesselateAirPortalFrameInWorld(TheEndPortalFrameTile *tt, int x, int y, int z) { - int data = level->getData(x, y, z); + int data = level->getData(x, y, z); - int direction = data & 3; - if (direction == Direction::SOUTH) + int direction = data & 3; + if (direction == Direction::SOUTH) { - upFlip = FLIP_180; - } + upFlip = FLIP_180; + } else if (direction == Direction::EAST) { - upFlip = FLIP_CW; - } + upFlip = FLIP_CW; + } else if (direction == Direction::WEST) { - upFlip = FLIP_CCW; - } + upFlip = FLIP_CCW; + } - if (!TheEndPortalFrameTile::hasEye(data)) + if (!TheEndPortalFrameTile::hasEye(data)) { - setShape(0, 0, 0, 1, 13.0f / 16.0f, 1); - tesselateBlockInWorld(tt, x, y, z); + setShape(0, 0, 0, 1, 13.0f / 16.0f, 1); + tesselateBlockInWorld(tt, x, y, z); - upFlip = FLIP_NONE; - return true; - } + upFlip = FLIP_NONE; + return true; + } noCulling = true; - setShape(0, 0, 0, 1, 13.0f / 16.0f, 1); - tesselateBlockInWorld(tt, x, y, z); - setFixedTexture(tt->getEye()); - setShape(4.0f / 16.0f, 13.0f / 16.0f, 4.0f / 16.0f, 12.0f / 16.0f, 1, 12.0f / 16.0f); - tesselateBlockInWorld(tt, x, y, z); + setShape(0, 0, 0, 1, 13.0f / 16.0f, 1); + tesselateBlockInWorld(tt, x, y, z); + setFixedTexture(tt->getEye()); + setShape(4.0f / 16.0f, 13.0f / 16.0f, 4.0f / 16.0f, 12.0f / 16.0f, 1, 12.0f / 16.0f); + tesselateBlockInWorld(tt, x, y, z); noCulling = false; - clearFixedTexture(); + clearFixedTexture(); - upFlip = FLIP_NONE; - return true; + upFlip = FLIP_NONE; + return true; } bool TileRenderer::tesselateBedInWorld( Tile* tt, int x, int y, int z ) @@ -613,17 +636,17 @@ bool TileRenderer::tesselateBedInWorld( Tile* tt, int x, int y, int z ) int flipEdge = Facing::WEST; switch ( direction ) { - case Direction::NORTH: - break; - case Direction::SOUTH: - flipEdge = Facing::EAST; - break; - case Direction::EAST: - flipEdge = Facing::NORTH; - break; - case Direction::WEST: - flipEdge = Facing::SOUTH; - break; + case Direction::NORTH: + break; + case Direction::SOUTH: + flipEdge = Facing::EAST; + break; + case Direction::EAST: + flipEdge = Facing::NORTH; + break; + case Direction::WEST: + flipEdge = Facing::SOUTH; + break; } if ( ( skipEdge != Facing::NORTH ) && ( noCulling || tt->shouldRenderFace( level, x, y, z - 1, Facing::NORTH ) ) ) @@ -701,38 +724,42 @@ bool TileRenderer::tesselateBedInWorld( Tile* tt, int x, int y, int z ) bool TileRenderer::tesselateBrewingStandInWorld(BrewingStandTile *tt, int x, int y, int z) { - // bounding box first - setShape(7.0f / 16.0f, 0.0f, 7.0f / 16.0f, 9.0f / 16.0f, 14.0f / 16.0f, 9.0f / 16.0f); - tesselateBlockInWorld(tt, x, y, z); + // bounding box first + setShape(7.0f / 16.0f, 0.0f, 7.0f / 16.0f, 9.0f / 16.0f, 14.0f / 16.0f, 9.0f / 16.0f); + tesselateBlockInWorld(tt, x, y, z); - setFixedTexture(tt->getBaseTexture()); - setShape(9.0f / 16.0f, 0.0f, 5.0f / 16.0f, 15.0f / 16.0f, 2 / 16.0f, 11.0f / 16.0f); - tesselateBlockInWorld(tt, x, y, z); - setShape(2.0f / 16.0f, 0.0f, 1.0f / 16.0f, 8.0f / 16.0f, 2 / 16.0f, 7.0f / 16.0f); - tesselateBlockInWorld(tt, x, y, z); - setShape(2.0f / 16.0f, 0.0f, 9.0f / 16.0f, 8.0f / 16.0f, 2 / 16.0f, 15.0f / 16.0f); - tesselateBlockInWorld(tt, x, y, z); + setFixedTexture(tt->getBaseTexture()); - 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/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/Sentient/TelemetryEnum.h b/Minecraft.Client/Windows64/Sentient/TelemetryEnum.h index 77d39a39..5a5a709f 100644 --- a/Minecraft.Client/Windows64/Sentient/TelemetryEnum.h +++ b/Minecraft.Client/Windows64/Sentient/TelemetryEnum.h @@ -8,8 +8,8 @@ EnemyWeaponID What weapon the enemy is holding or what counter/AI the enemy is t EnrollmentType How did players enroll? (Using Kinect) LandscapeOrPortrait Are you currently showing in landscape or portrait mode? (Win8 only) LevelDurationInSeconds How long, total, has the user been playing in this level - whatever best represents this duration for attempting the level you'd like to track. -LevelExitProgressStat1 Refers to the highest level performance metric for your game.  For example, a performance metric could points earned, race time, total kills, etc. This is entirely up to you and will help us understand how well the player performed, or how far the player progressed  in the level before exiting. -LevelExitProgressStat2 Refers to the highest level performance metric for your game.  For example, a performance metric could points earned, race time, total kills, etc. This is entirely up to you and will help us understand how well the player performed, or how far the player progressed  in the level before exiting. +LevelExitProgressStat1 Refers to the highest level performance metric for your game.� For example, a performance metric could points earned, race time, total kills, etc. This is entirely up to you and will help us understand how well the player performed, or how far the player progressed �in the level before exiting. +LevelExitProgressStat2 Refers to the highest level performance metric for your game.� For example, a performance metric could points earned, race time, total kills, etc. This is entirely up to you and will help us understand how well the player performed, or how far the player progressed �in the level before exiting. LevelID This is a more granular view of mode, allowing teams to get a sense of the levels or maps players are playing and providing some insight into how players progress through a game. Teams will have to provide the game mappings that correspond to the integers. The intent is that a level is highest level at which modes can be dissected and provides an indication of player progression in a game. The intent is that level start and ends do not occur more than every 2 minutes or so, otherwise the data reported will be difficult to understand. Levels are unique only within a given modeID - so you can have a ModeID =1, LevelID =1 and a different ModeID=2, LevelID = 1 indicate two completely different levels. LevelID = 0 means undefined or unknown. LevelInstanceID Generated by the game every time LevelStart or LevelResume is called. This should be a unique ID (can be sequential) within a session. LowResMapX Player position normalized to 0-255 @@ -18,7 +18,7 @@ LowResMapZ Player position normalized to 0-255 MapID Unique ID for the current map the player is on MarketplaceOfferID Unique ID for the Xbox LIVE marketplace offer that the upsell links to MicroGoodTypeID Describes the type of consumable or microgood -MultiplayerInstanceID multiplayerinstanceID is a title-generated value that is the same for all players in the same multiplayer session.  +MultiplayerInstanceID multiplayerinstanceID is a title-generated value that is the same for all players in the same multiplayer session.� NumberOfLocalPlayers the number of players that are playing together in the game locally in the current session (on the same piece of hardware) NumberOfOnlinePlayers the number of players that are playing together in the game online in the current session (not on the same piece of hardware) NumberOfSkeletonsInView the max and min of skeletons that were in view, regardless of enrollment @@ -28,7 +28,7 @@ PlayerLevelUpProgressStat1 Refers to a performance metric for your player when t PlayerLevelUpProgressStat2 Refers to a performance metric for your player when they level or rank up. This is entirely up to you and will help us understand how well the player performed, or how far the player has progressed. PlayerWeaponID What weapon the player is holding or what approach/tact the player is taking to overcome a challenge PlayspaceFeedbackWarningDirection identifies which side of the playspace players are getting too close to that results in the playspace feedback -SaveOrCheckpointID It is important that you also generate and save a unique SaveOrCheckpointID that can be read and reported when the player resumes from this save file or checkpoint. These IDs should be completely unique across the player’s experience, even if they play the same level multiple times. These IDs are critical to allowing us to re-stitch a player’s experience in your title and provide an accurate measure of time in level. +SaveOrCheckpointID It is important that you also generate and save a unique SaveOrCheckpointID that can be read and reported when the player resumes from this save file or checkpoint. These IDs should be completely unique across the player�s experience, even if they play the same level multiple times. These IDs are critical to allowing us to re-stitch a player�s experience in your title and provide an accurate measure of time in level. SecondsSinceInitialize Number of seconds elapsed since Sentient initialize. SecondsSinceInitializeMax Number of seconds elapsed since Sentient initialize. SecondsSinceInitializeMin Number of seconds elapsed since Sentient initialize. @@ -224,6 +224,12 @@ enum ETelemetryChallenges eTelemetryTutorial_Trading, eTelemetryTutorial_TradingMenu, eTelemetryTutorial_Enderchest, + eTelemetryTutorial_Hopper, + eTelemetryTutorial_Beacon, + eTelemetryTutorial_Horse, + eTelemetryTutorial_HorseMenu, + eTelemetryTutorial_FireworksMenu, + eTelemetryTutorial_BeaconMenu // Sent over network as a byte }; \ No newline at end of file diff --git a/Minecraft.Client/Windows64Media/Media/languages.loc b/Minecraft.Client/Windows64Media/Media/languages.loc index 3f4659e3..e3d9162b 100644 Binary files a/Minecraft.Client/Windows64Media/Media/languages.loc and b/Minecraft.Client/Windows64Media/Media/languages.loc differ diff --git a/Minecraft.Client/Windows64Media/Sound/Minecraft.msscmp b/Minecraft.Client/Windows64Media/Sound/Minecraft.msscmp new file mode 100644 index 00000000..13983f6d Binary files /dev/null and b/Minecraft.Client/Windows64Media/Sound/Minecraft.msscmp differ diff --git a/Minecraft.Client/Windows64Media/loc/4J_stringsGeneric.xml b/Minecraft.Client/Windows64Media/loc/4J_stringsGeneric.xml index 461ff6f0..7adcacc4 100644 --- a/Minecraft.Client/Windows64Media/loc/4J_stringsGeneric.xml +++ b/Minecraft.Client/Windows64Media/loc/4J_stringsGeneric.xml @@ -178,13 +178,12 @@ Saving of settings to gamer profile has failed. - - Guest Gamer Profile + Guest Player - Guest gamer profile cannot access this feature. Please use a different gamer profile. + Guest players cannot access the "PSN". @@ -192,13 +191,12 @@ - Saving content. Please don't turn off your console. + Saving content. Please don't turn off your system. Unlock Full Game - This is the Minecraft trial game. If you had the full game, you would just have earned an achievement! Unlock the full game to experience the joy of Minecraft and to play with your friends across the globe through Xbox LIVE. diff --git a/Minecraft.Client/Windows64Media/loc/4J_stringsPlatformSpecific.xml b/Minecraft.Client/Windows64Media/loc/4J_stringsPlatformSpecific.xml index 8d705a63..79e76680 100644 --- a/Minecraft.Client/Windows64Media/loc/4J_stringsPlatformSpecific.xml +++ b/Minecraft.Client/Windows64Media/loc/4J_stringsPlatformSpecific.xml @@ -99,6 +99,10 @@ + + The save file in the save transfer area has a version number that this version doesn't support yet. + + You are being returned to the main menu because of a problem reading your profile. diff --git a/Minecraft.Client/Windows64Media/loc/AdditionalStrings.xml b/Minecraft.Client/Windows64Media/loc/AdditionalStrings.xml new file mode 100644 index 00000000..9834da86 --- /dev/null +++ b/Minecraft.Client/Windows64Media/loc/AdditionalStrings.xml @@ -0,0 +1,123 @@ + + + Show all Mash-up Worlds + + + + Hide + + + + Minecraft: PlayStation®3 Edition + + + + Options + + + + Save Cache + + + + A network error has occurred. + + + + Network Error + + + + A network error has occurred. Exiting to Main Menu. + + + + Online service is disabled on your Sony Entertainment Network account due to chat restrictions. + + + + Online service is disabled on your Sony Entertainment Network account due to parental control settings. + + + + Online Service + + + + You have been signed out from the "PSN". Online features of the game will not be available until you sign back into the "PSN". + + + + You have been signed out from the "PSN". Online features of the game will not be available until you sign back into the "PSN". Exiting to Main Menu. + + + + Choose user for player %d (or cancel to play as guest) + + + + Free + + + + Your Options file is corrupt and needs to be deleted. + + + + Delete options file. + + + + Retry loading options file. + + + + Your Save Cache file is corrupt and needs to be deleted. + + + + Trophies Disabled + + + + Trophies will be disabled because this save belongs to another user. + + + + Fatal error: Trophy Initialization failed. Please exit game. + + + + View Game Invites + + + + Corrupt File + + + + Controller Disconnected + + + + Your controller has been disconnected. Please reconnect the controller. + + + + Online service is disabled on your Sony Entertainment Network account due to parental control settings for one of your local players. + + + Online features are disabled due to a game update being available. + + + There are no downloadable content offers available for this title at the moment. + + + + Invitation + + + + Please come and play a game of Minecraft: PlayStation®Vita Edition! + + \ No newline at end of file diff --git a/Minecraft.Client/Windows64Media/loc/EULA.xml b/Minecraft.Client/Windows64Media/loc/EULA.xml new file mode 100644 index 00000000..42a075b4 --- /dev/null +++ b/Minecraft.Client/Windows64Media/loc/EULA.xml @@ -0,0 +1,99 @@ + + + + Minecraft: PlayStation®Vita Edition - TERMS OF USE + These Terms set out some rules for using Minecraft: PlayStation®Vita Edition ("Minecraft"). In order to protect Minecraft and the members of our community, we need these terms to set out some rules for downloading and using Minecraft. We don't like rules any more than you do, so we have tried to keep this as short as possible but if you buy, download, use or play Minecraft, you are agreeing to stick to these terms ("Terms"). + Before we get going there is one thing we want to make really clear. Minecraft is a game that allows players to build and break things. If you play with other people (multiplayer) you can build with them or you can break what they have been building - and they can do the same to you. So don't play with other people if they don't behave like you want them to. Also sometimes people do things that they shouldn't. We don't like it but there is not a lot we can do to stop it except ask that everyone behaves properly. We rely on you and others like you in the community to let us know if someone isn’t behaving properly and if that is the case and / or you think someone is breaching the rules or these Terms or using Minecraft improperly please do tell us. We have a flagging / reporting system for doing that so please use it and we will do what is necessary to deal with it. + To flag or report any issues please email us at support@mojang.com and give us as much information as you can such as the user's details and what has happened. + Now back to the Terms: + ONE MAJOR RULE + The one major rule is that you must not distribute anything we've made. By "distribute anything we've made" what we mean is "give copies of Minecraft away, make commercial use of, try to make money from, or let other people get access to Minecraft and its parts in a way that is unfair or unreasonable". So the one major rule is that (unless we specifically agree it – such as in our Brand and Asset Usage Guidelines) you must not: + • give copies of Minecraft to anyone else; + • make commercial use of anything we've made; + • try to make money from anything we've made; or + • let other people get access to anything we've made in a way that is unfair or unreasonable. + ...and so that we are crystal clear, what we have made includes, but is not limited to, the client or the server software for Minecraft. It also includes modified versions of a Game, part of it or anything else we've made. + Otherwise we are quite relaxed about what you do - in fact we really encourage you to do cool stuff (see below) - but just don't do those things that we say you can't. + USING MINECRAFT + • You have bought Minecraft so you can use it, yourself, on your PlayStation®Vita system. + • Below we also give you limited rights to do other things but we have to draw a line somewhere or else people will go too far. If you wish to make something related to anything we've made we're humbled, but please make sure that it can't be interpreted as being official and that it complies with these Terms and above all do not make commercial use of anything we've made. + • The permission we give you to use and play Minecraft can be revoked if you break these Terms. + • When you buy Minecraft, we give you permission to install Minecraft on your own PlayStation®Vita system and use and play it on that PlayStation®Vita system as set out in these Terms. This permission is personal to you, so you are not allowed to distribute Minecraft (or any part of it) to anyone else (except as expressly permitted by us of course). + • Within reason you're free to do whatever you want with screenshots and videos of Minecraft. By "within reason" we mean that you can't make any commercial use of them or do things that are unfair or adversely affect our rights. Also, don't just rip art resources and pass them around, that's no fun. + • Essentially the simple rule is do not make commercial use of anything we've made unless specifically agreed by us, either in our brand and asset usage guidelines or under these Terms. Oh and if the law expressly allows it, such as under a "fair use" or "fair dealing" doctrine then that's ok too – but only to the extent that the law says so. + OWNERSHIP OF MINECRAFT AND OTHER THINGS + • Although we give you permission to play Minecraft, we are still the owners of it. We are also the owners of our brands and any content contained in Minecraft, which is made up of our software, textures, assets, tools, infrastructure and a whole load of other clever (and not so clever) stuff that we own. All our rights in that stuff are asserted and reserved but you can use it subject to these Terms. + • That doesn’t mean we own the cool stuff that you create using Minecraft - you just have to accept that we own each part of Minecraft and Minecraft as a product and service and those things mentioned in the previous sentence – and we also own the copyright and other so called intellectual property rights ("IPRs") associated with those things and the names and brands associated with Minecraft. + • You of course are going to make your own stuff in and using Minecraft. We don’t own the original stuff that you create and we don’t claim any ownership of anything that we shouldn’t. We will however own things that are copies (or substantial copies) or derivatives of our property and creations (outlined above) - but if you create original things they aren’t ours. So, as an example: + - a single block – we own that; + - a Gothic Cathedral with a rollercoaster running through it – we don't own that. + • Therefore, when you pay for the use of Minecraft, you are only buying a permission to use the Minecraft product in accordance with these Terms. The only permissions you have in connection with Minecraft are the permissions set out in these Terms. + CONTENT + • If you make any content available on or through Minecraft, you must give us permission to use, copy, modify and adapt that content. This permission must be irrevocable and unrestricted. You must also let us permit other people to use your content and you must let the other people you let access it (such as those you play multiplayer games with) use it. + • Please think carefully before you make any content available, because it may be made public and may be used by other people in a way you don't like. + • If you are going to make something available on or through Minecraft, it must not be offensive to people or illegal, it must be honest, and it must be your own creation. The types of things you must not make available using Minecraft include: posts that include racist or homophobic language; posts that are bullying or trolling; posts that might damage our or another person's reputation; posts that include porn, advertising or someone else's creation or image; or posts that impersonate a moderator or try to trick or exploit people. + • Any content you make available on Minecraft must also be your creation. You must not make any content available, using Minecraft, that infringes the rights of anyone else. If you post content on Minecraft, and we get challenged, threatened or sued by someone because the content infringes that persons rights, we may hold you responsible and that means you may have to pay us back for any damage we suffer as a result. Therefore it is really important that you only make content available that you have created and you don't do so with any content created by anyone else. + • Please take care over who you play with. It is hard for either you or us to know for sure that what people say is true, or even if people are really who they say they are. You should also not give out information about yourself through Minecraft. + If you are going to make content ("Your Content") available using Minecraft it must: + - comply with all Sony Computer Entertainment’s rules including the ToSUA which are the "PSN" Terms of Service and the User Agreement and any other guidelines that you have to agree to in order to use your PlayStation®Vita system and the "PSN"; + - not be offensive to people; + - not be illegal or unlawful; + - be honest and not mislead, trick or exploit anyone else nor impersonate others; + - not infringe anyone’s copyright or other rights; + - not be racist, sexist or homophobic; + - not be bullying or trolling; + - not damage our or another person’s reputation; + - not include pornography; + - not include advertising. + - You must not make any content available using Minecraft that infringes the rights of anyone else. + • You are responsible for all Your Content that is made available by you using Minecraft. + • By making Your Content available you warrant and are telling us that you are fully entitled to do so under these Terms and that we are entitled to exercise the rights you have granted to us under these Terms. + • If we get challenged, threatened or sued by someone because of any content that you make available using Minecraft or is made available by anyone on or through Minecraft it may be removed, you may be held responsible and you may have to compensate us back for any damage we suffer as a result. Your access to certain aspects of Minecraft may be removed or suspended too. + USER CONTENT + The following sets out some terms concerning both Your Content and content made available by others which are referred to simply as "User Content". Minecraft is an entertainment service and ancillary to this we (and our licensees (like Sony Computer Entertainment) are involved in the transmission, distribution, storage and retrieval of User Content without review, selection or alteration of the content. What that means is that we do not review the User Content and so we won't know what is being circulated by you or other people. We have these rules in the Terms so that you and other people have to comply with but we can’t know everything that goes on. + So please note that: + • the views expressed in any User Content are the views of the individual authors or creators and not us or anyone connected with us unless we specify otherwise; + • we are not responsible for (and make no warranty or representation in relation to and disclaim all liability for) all User Content including any comments, views or remarks expressed in it; + • by using Minecraft you acknowledge that we have no responsibility to review the content of any User Content and that all User Content is made available on the basis that we are not required to and do not exercise any control or judgement over it. + HOWEVER we (or our licensees like Sony Computer Entertainment) may remove, reject or suspend access to any User Content and remove or suspend your ability to post, make available or access User Content – including removing or suspending access to Minecraft or "PSN" if we consider it is appropriate to do so, such as because you have breached these Terms or we receive a complaint. We will also act expeditiously to remove or disable access to User Content if and when we have actual knowledge of it being unlawful. + UPGRADES + • We might make upgrades and updates available from time to time, but we don't have to. We are also not obliged to provide ongoing support or maintenance of any game. Of course, we hope to continue to release new updates for Minecraft, we just can't guarantee that we will do so. + OUR LIABILITY + • When you get a copy of Minecraft, we provide it 'as is'. Updates and upgrades are also provided 'as is'. This means that we are not making any promises to you about the standard or quality of Minecraft or that Minecraft will be uninterrupted or error free or for any loss or damage that they cause. We only promise to provide Minecraft and any services with reasonable skill and care. The law in most countries says that we can't disclaim liability for death or personal injury caused by our negligence so if your computer gets up and stabs you because of something we've done wrong then we'll take the hit on that. + WE ARE NOT LIABLE FOR: + • ANY USE OR MISUSE OF MINECRAFT BY YOU OR ANY OTHER PERSON; + • ANY CONTENT THAT IS MADE AVAILABLE BY YOU USING MINECRAFT; + • ANY BREACH OF THESE TERMS BY YOU; + • ANY BREACH OF ANY TERMS BY ANY OTHER PERSON. + TERMINATION + • If we want we can terminate your right to use Minecraft if you breach these Terms. You can terminate it too, at any time, all you have to do is uninstall Minecraft from your PlayStation®Vita system. In any case the paragraphs about "Ownership of Minecraft", "Our Liability" and "General Stuff" will continue to apply even after termination. + GENERAL STUFF + • These Terms are subject to any legal rights you might have. Nothing in these Terms will limit any of your rights that may not be excluded under law nor shall it exclude or limit our liability for death or personal injury resulting from our negligence nor any fraudulent representation. + • We may also change these Terms from time to time but those changes will only be effective to the extent that they can legally apply. For example if you only use Minecraft in single player mode and don't use the updates we make available then the old EULA applies but if you do use the updates or use parts of Minecraft that rely on our providing ongoing online services then the new EULA will apply. In that case we may not be able to / don't need to tell you about the changes for them to have effect so you should check back here from time to time so you are aware of any changes to these Terms. We're not going to be unfair about this though - but sometimes the law changes or someone does something that affects other users of Minecraft and we therefore need to put a lid on it. + • If you come to us with a suggestion for Minecraft or any of our games, that suggestion is made for free. This means we can use your suggestion in any way we want and we don't have to pay you for it. If you think you have a suggestion that we would be willing to pay you for, you must tell us you expect to be paid before you tell us the suggestion. + • In addition to these Terms we also have some Brand and Asset Usage Guidelines which you can find online. + • If you break these rules we (or Sony Computer Entertainment) may stop you from using Minecraft. If you don't want to or can't agree to these rules, then you must not buy, download, use or play Minecraft. + If there’s anything legal you’re wondering about that isn’t answered from this page, don’t do it and ask us about it. Basically, don’t be ridiculous and we won’t. + We are: + Mojang AB + Maria Skolgata 83, + SE-11853 + Stockholm + Sweden + Organization number: 556819-2388 + + + + + Any content purchased in an in-game store will be purchased from Sony Network Entertainment Europe Limited ("SNEE") and be subject to Sony Entertainment Network Terms of Service and User Agreement which is available on the PlayStation®Store. Please check usage rights for each purchase as these may differ from item to item. Unless otherwise shown, content available in any in-game store has the same age rating as the game. + + + + + Purchase and use of items are subject to the Network Terms of Service and User Agreement. This online service has been sublicensed to you by Sony Computer Entertainment America. + + + + Remember: Use of this software is subject to the Software Usage Terms at eu.playstation.com/legal. + + \ No newline at end of file diff --git a/Minecraft.Client/Windows64Media/loc/extra.xml b/Minecraft.Client/Windows64Media/loc/extra.xml new file mode 100644 index 00000000..982fd7f8 --- /dev/null +++ b/Minecraft.Client/Windows64Media/loc/extra.xml @@ -0,0 +1,14 @@ + + + Increase World Size + + + Overwrite Edges + + + Increase World Size + + + Overwrite Edges + + \ No newline at end of file diff --git a/Minecraft.Client/Windows64Media/loc/stringsDynafont.xml b/Minecraft.Client/Windows64Media/loc/stringsDynafont.xml new file mode 100644 index 00000000..dca31ec2 --- /dev/null +++ b/Minecraft.Client/Windows64Media/loc/stringsDynafont.xml @@ -0,0 +1,7 @@ + + + + DynaFont developed by DynaComware. + + + \ No newline at end of file diff --git a/Minecraft.Client/Windows64Media/loc/stringsGeneric.xml b/Minecraft.Client/Windows64Media/loc/stringsGeneric.xml index 4eccce8b..36b521dd 100644 --- a/Minecraft.Client/Windows64Media/loc/stringsGeneric.xml +++ b/Minecraft.Client/Windows64Media/loc/stringsGeneric.xml @@ -429,6 +429,27 @@ When loading or creating a world, you can press the "More Options" button to ent {*T2*}Host Privileges{*ETW*}{*B*} When enabled, the host can toggle their ability to fly, disable exhaustion, and make themselves invisible from the in-game menu. {*DISABLES_ACHIEVEMENTS*}{*B*}{*B*} + {*T2*}Daylight Cycle{*ETW*}{*B*} + When disabled, the time of day will not change.{*B*}{*B*} + + {*T2*}Keep Inventory{*ETW*}{*B*} + When enabled, players will keep their inventory when they die.{*B*}{*B*} + + {*T2*}Mob Spawning{*ETW*}{*B*} + When disabled, mobs will not spawn naturally.{*B*}{*B*} + + {*T2*}Mob Griefing{*ETW*}{*B*} + When disabled, prevents monsters and animals from changing blocks (for example, Creeper explosions won't destroy blocks and Sheep won't remove Grass) or picking up items.{*B*}{*B*} + + {*T2*}Mob Loot{*ETW*}{*B*} + When disabled, monsters and animals will not drop loot (for example, Creepers won't drop gunpowder).{*B*}{*B*} + + {*T2*}Tile Drops{*ETW*}{*B*} + When disabled, blocks will not drop items when destroyed (for example, Stone blocks won't drop Cobblestone).{*B*}{*B*} + + {*T2*}Natural Regeneration{*ETW*}{*B*} + When disabled, players will not regenerate health naturally.{*B*}{*B*} + {*T1*}World Generation Options{*ETW*}{*B*} When creating a new world there are some additional options.{*B*}{*B*} @@ -472,20 +493,20 @@ To modify the privileges for a player, select their name and press{*CONTROLLER_V When this option is enabled, the player is able to change privileges for other players (except the host) if "Trust Players" is turned off, kick players and they can enable and disable fire spreading and TNT exploding.{*B*}{*B*} {*T2*}Kick Player{*ETW*}{*B*} - For players that are not on the same {*PLATFORM_NAME*} console as the host player, selecting this option will kick the player from the game and any other players on their {*PLATFORM_NAME*} console. This player will not be able to rejoin the game until it is restarted.{*B*}{*B*} + {*KICK_PLAYER_DESCRIPTION*}{*B*}{*B*} {*T1*}Host Player Options{*ETW*}{*B*} If "Host Privileges" is enabled the host player can modify some privileges for themselves. To modify the privileges for a player, select their name and press{*CONTROLLER_VK_A*} to bring up the player privileges menu where you can use the following options.{*B*}{*B*} {*T2*}Can Fly{*ETW*}{*B*} When this option is enabled, the player is able to fly. This option is only relevant to Survival mode, as flying is enabled for all players in Creative mode.{*B*}{*B*} - + {*T2*}Disable Exhaustion{*ETW*}{*B*} This option only affects Survival mode. When enabled, physical activities (walking/sprinting/jumping etc.) do not decrease the food bar. However, if the player becomes injured, the food bar will slowly decrease while the player is healing.{*B*}{*B*} - + {*T2*}Invisible{*ETW*}{*B*} When this option is enabled, the player is not visible to other players and is invulnerable.{*B*}{*B*} - + {*T2*}Can Teleport{*ETW*}{*B*} This allows the player to move players or themselves to other players in the world. @@ -583,7 +604,7 @@ If "Host Privileges" is enabled the host player can modify some privileges for t {*T3*}HOW TO PLAY : THE END{*ETW*}{*B*}{*B*} The End is another dimension in the game, which is reached through an active End Portal. The End Portal can be found in a Stronghold, which is deep underground in the Overworld.{*B*} To activate the End Portal, you'll need to put an Eye of Ender into any End Portal Frame without one.{*B*} -Once the portal is active, jump into it to go to The End.{*B*}{*B*} +Once the portal is active, jump in to it to go to The End.{*B*}{*B*} In The End you will meet the Ender Dragon, a fierce and powerful enemy, along with many Enderman, so you will have to be well prepared for the battle before going there!{*B*}{*B*} You'll find that there are Ender Crystals on top of eight Obsidian spikes that the Ender Dragon uses to heal itself, so the first step in the battle is to destroy each of these.{*B*} @@ -605,65 +626,116 @@ so they can easily join you. - -{*T3*}{*TITLE_UPDATE_NAME*}{*ETW*}{*B*}{*B*} -{*T3*}Changes and Additions{*ETW*}{*B*}{*B*} -- Added new items - Emerald, Emerald Ore, Block of Emerald, Ender Chest, Tripwire Hook, Enchanted Golden Apple, Anvil, Flower Pot, Cobblestone Walls, Mossy Cobblestone Walls, Wither Painting, Potato, Baked Potato, Poisonous Potato, Carrot, Golden Carrot, Carrot on a Stick, -Pumpkin Pie, Night Vision Potion, Invisibility Potion, Nether Quartz, Nether Quartz Ore, Block of Quartz, Quartz Slab, Quartz Stair, Chiseled Quartz Block, Pillar Quartz Block, Enchanted Book, Carpet.{*B*} -- Added new recipes for Smooth Sandstone and Chiselled Sandstone.{*B*} -- Added new Mobs - Zombie Villagers.{*B*} -- Added new terrain generation features - Desert Temples, Desert Villages, Jungle Temples.{*B*} -- Added Trading with villagers.{*B*} -- Added Anvil interface.{*B*} -- Can dye leather armor.{*B*} -- Can dye wolf collars.{*B*} -- Can control riding a pig with a Carrot on a Stick.{*B*} -- Updated Bonus Chest content with more items.{*B*} -- Changed placement of half blocks and other blocks on half blocks.{*B*} -- Changed placement of upside down stairs and slabs.{*B*} -- Added different villager professions.{*B*} -- Villagers spawned from a spawn egg will have a random profession.{*B*} -- Added sideways log placement.{*B*} -- Furnaces can use wooden tools as a fuel.{*B*} -- Ice and Glass panes can be collected with silk touch enchanted tools.{*B*} -- Wooden Buttons and Wooden Pressure Plates can be activated with Arrows.{*B*} -- Nether mobs can spawn in the Overworld from Portals.{*B*} -- Creepers and Spiders are aggressive towards the last player that hit them.{*B*} -- Mobs in Creative mode become neutral again after a short period.{*B*} -- Remove knockback when drowning.{*B*} -- Doors being broken by zombies show damage.{*B*} -- Ice melts in the nether.{*B*} -- Cauldrons fill up when out in the rain.{*B*} -- Pistons take twice as long to update.{*B*} -- Pig drops Saddle when killed (if has one).{*B*} -- Sky color in The End changed.{*B*} -- String can be placed (for Tripwires).{*B*} -- Rain drips through leaves.{*B*} -- Levers can be placed on the bottom of blocks.{*B*} -- TNT does variable damage depending on difficulty setting.{*B*} -- Book recipe changed.{*B*} -- Boats break Lilypads, instead of Lilypads breaking Boats.{*B*} -- Pigs drop more Porkchops.{*B*} -- Slimes spawn less in Superflat worlds.{*B*} -- Creeper damage variable based on difficulty setting, more knockback.{*B*} -- Fixed Endermen not opening their jaws.{*B*} -- Added teleporting of players (using the {*BACK_BUTTON*} menu in-game).{*B*} -- Added new Host Options for flying, invisibility and invulnerability for remote players.{*B*} -- Added new tutorials to the Tutorial World for new items and features.{*B*} -- Updated the positions of the Music Disc Chests in the Tutorial World.{*B*} + {*T3*}Changes and Additions{*ETW*}{*B*}{*B*} +- Added new items - Hardened Clay, Stained Clay, Block of Coal, Hay Bale, Activator Rail, Block of Redstone, Daylight Sensor, Dropper, Hopper, Minecart with Hopper, Minecart with TNT, Redstone Comparator, Weighted Pressure Plate, Beacon, Trapped Chest, Firework Rocket, Firework Star, Nether Star, Lead, Horse Armor, Name Tag, Horse Spawn Egg{*B*} +- Added new Mobs - Wither, Wither Skeletons, Witches, Bats, Horses, Donkeys and Mules{*B*} +- Added new terrain generation features - Witch Huts.{*B*} +- Added Beacon interface.{*B*} +- Added Horse interface.{*B*} +- Added Hopper interface.{*B*} +- Added Fireworks - Fireworks interface is accessible from the Crafting Table when you have the ingredients to craft a Firework Star or Firework Rocket.{*B*} +- Added 'Adventure Mode' - You can only break blocks with the correct tools.{*B*} +- Added lots of new sounds.{*B*} +- Mobs, items and projectiles can now pass through portals.{*B*} +- Repeaters can now be locked by powering their sides with another Repeater.{*B*} +- Zombies and Skeletons can now spawn with different weapons and armor.{*B*} +- New death messages.{*B*} +- Name mobs with a Name Tag, and rename containers to change the title when the menu is open.{*B*} +- Bonemeal no longer instantly grows everything to full size, and instead randomly grows in stages.{*B*} +- A Redstone signal describing the contents of Chests, Brewing Stands, Dispensers and Jukeboxes can be detected by placing a Redstone Comparator directly against them.{*B*} +- Dispensers can face in any direction.{*B*} +- Eating a Golden Apple gives the player extra "absorption" health for a short period.{*B*} +- The longer you remain in an area the harder the monsters that spawn in that area will be.{*B*} {*ETB*}Welcome back! You may not have noticed but your Minecraft has just been updated.{*B*}{*B*} -There are lots of new features for you and friends to play with so here’s just a few highlights. Have a read and then go and have fun!{*B*}{*B*} -{*T1*}New Items{*ETB*} - Emerald, Emerald Ore, Block of Emerald, Ender Chest, Tripwire Hook, Enchanted Golden Apple, Anvil, Flower Pot, Cobblestone Walls, Mossy Cobblestone Walls, Wither Painting, Potato, Baked Potato, Poisonous Potato, Carrot, Golden Carrot, Carrot on a Stick, -Pumpkin Pie, Night Vision Potion, Invisibility Potion, Nether Quartz, Nether Quartz Ore, Block of Quartz, Quartz Slab, Quartz Stair, Chiseled Quartz Block, Pillar Quartz Block, Enchanted Book, Carpet.{*B*}{*B*} - {*T1*}New Mobs{*ETB*} - Zombie Villagers.{*B*}{*B*} -{*T1*}New Features{*ETB*} - Trade with villagers, repair or enchant weapons and tools with an Anvil, store items in an Ender Chest, control a pig while riding it using a Carrot on a Stick!{*B*}{*B*} -{*T1*}New Mini-Tutorials{*ETB*} – Learn how to use the new features in the Tutorial World!{*B*}{*B*} -{*T1*}New 'Easter Eggs'{*ETB*} – We've moved all the secret Music Discs in the Tutorial World. See if you can find them again!{*B*}{*B*} - +There are lots of new features for you and friends to play with so here’s just a few highlights. Have a read and then go and have fun!{*B*}{*B*} +{*T1*}New Items{*ETB*} - Hardened Clay, Stained Clay, Block of Coal, Hay Bale, Activator Rail, Block of Redstone, Daylight Sensor, Dropper, Hopper, Minecart with Hopper, Minecart with TNT, Redstone Comparator, Weighted Pressure Plate, Beacon, Trapped Chest, Firework Rocket, Firework Star, Nether Star, Lead, Horse Armor, Name Tag, Horse Spawn Egg{*B*}{*B*} +{*T1*}New Mobs{*ETB*} - Wither, Wither Skeletons, Witches, Bats, Horses, Donkeys and Mules{*B*}{*B*} +{*T1*}New Features{*ETB*} - Tame and ride a horse, craft fireworks and put on a show, name animals and monsters with a Name Tag, create more advanced Redstone circuits, and new Host Options to help control what guests to your world can do!{*B*}{*B*} +{*T1*}New Tutorial World{*ETB*} – Learn how to use the old and new features in the Tutorial World. See if you can find all the secret Music Discs hidden in the world!{*B*}{*B*} + + + + + Horses + + + + {*T3*}HOW TO PLAY : HORSES{*ETW*}{*B*}{*B*} +Horses and Donkeys are found mainly in open plains. Mules are the offspring of a Donkey and a Horse, but are infertile themselves.{*B*} +All adult Horses, Donkeys and Mules can be ridden. However only Horses can be armored, and only Mules and Donkeys may be equipped with saddlebags for transporting items.{*B*}{*B*} +Horses, Donkeys and Mules must be tamed before they can be used. A horse is tamed by attempting to ride it, and managing to stay on the horse while it attempts to throw the rider off.{*B*} +When Love Hearts appear around the horse, it is tame, and will no longer attempt to throw the player off. To steer a horse, the player must equip the horse with a Saddle.{*B*}{*B*} +Saddles can be bought from villagers or found inside Chests hidden in the world.{*B*} +Tame Donkeys and Mules can be given saddlebags by attaching a Chest. These saddlebags can then be accessed whilst riding or sneaking.{*B*}{*B*} +Horses and Donkeys (but not Mules) can be bred like other animals using Golden Apples or Golden Carrots.{*B*} +Foals will grow into adult horses over time, although feeding them Wheat or Hay will speed this up.{*B*} + + + + + Beacons + + + + {*T3*}HOW TO PLAY : BEACONS{*ETW*}{*B*}{*B*} +Active Beacons project a bright beam of light into the sky and grant powers to nearby players.{*B*} +They are crafted with Glass, Obsidian and Nether Stars, which can be obtained by defeating the Wither.{*B*}{*B*} +Beacons must be placed so that they are in sunlight during the day. Beacons must be placed on Pyramids of Iron, Gold, Emerald or Diamond.{*B*} +The material the Beacon is placed on has no effect on the power of the Beacon.{*B*}{*B*} +In the Beacon menu you can select one primary power for your Beacon. The more tiers your pyramid has the more powers you will have to choose from.{*B*} +A Beacon on a pyramid with at least four tiers also gives the option of either the Regeneration secondary power or a stronger primary power.{*B*}{*B*} +To set the powers of your Beacon you must sacrifice an Emerald, Diamond, Gold or Iron Ingot in the payment slot.{*B*} +Once set, the powers will emanate from the Beacon indefinitely.{*B*} + + + + + Fireworks + + + + {*T3*}HOW TO PLAY : FIREWORKS{*ETW*}{*B*}{*B*} +Fireworks are decorative items that can be launched by hand or from Dispensers. They are crafted using Paper, Gunpowder and optionally a number of Firework Stars.{*B*} +The colors, fade, shape, size, and effects (such as trails and twinkle) of Firework Stars can be customized by including additional ingredients when crafting.{*B*}{*B*} +To craft a Firework place Gunpowder and Paper in the 3x3 crafting grid that is shown above your inventory.{*B*} +You can optionally place multiple Firework Stars in the crafting grid to add them to the Firework.{*B*} +Filling more slots in the crafting grid with Gunpowder will increase the height at which all the Firework Stars will explode.{*B*}{*B*} +You can then take the crafted Firework out of the output slot.{*B*}{*B*} +Firework Stars can be crafted by placing Gunpowder and Dye into the crafting grid.{*B*} + - The Dye will set the color of the explosion of the Firework Star.{*B*} + - The shape of the Firework Star is set by adding either a Fire Charge, Gold Nugget, Feather or Mob Head.{*B*} + - A trail or a twinkle can be added using Diamonds or Glowstone Dust.{*B*}{*B*} +After a Firework Star has been crafted, you can set the fade color of the Firework Star by crafting it with Dye. + + + + + Hoppers + + + + {*T3*}HOW TO PLAY : HOPPERS{*ETW*}{*B*}{*B*} +Hoppers are used to insert or remove items from containers, and to automatically pick up items thrown into them.{*B*} +They can affect Brewing Stands, Chests, Dispensers, Droppers, Minecarts with Chests, Minecarts with Hoppers, as well as other Hoppers.{*B*}{*B*} +Hoppers will continuously attempt to suck items out of a suitable container placed above them. They will also attempt to insert stored items into an output container.{*B*} +If a Hopper is powered by Redstone it will become inactive and stop both sucking and inserting items.{*B*}{*B*} +A Hopper points in the direction it tries to output items. To make a Hopper point to a particular block, place the Hopper against that block whilst sneaking.{*B*} + + + + + Droppers + + + + {*T3*}HOW TO PLAY : DROPPERS{*ETW*}{*B*}{*B*} +When powered by Redstone, Droppers will drop a single random item contained within them onto the ground. Use {*CONTROLLER_ACTION_USE*} to open the Dropper and then you can load the Dropper with items from your inventory.{*B*} +If the Dropper is facing a Chest or another type of Container, the item will be placed into that instead. Long chains of Droppers can be constructed to transport items over a distance, but for this to work they will have to be alternately powered on and off. + @@ -692,100 +764,103 @@ Pumpkin Pie, Night Vision Potion, Invisibility Potion, Nether Quartz, Nether Qua Iron doors can only be opened by Redstone, buttons or switches. - + - - NOT USED - - - NOT USED - - - NOT USED - - - NOT USED - - - - Gives the user 1 Armor when worn. - + + NOT USED + - - Gives the user 3 Armor when worn. - + + NOT USED + - - Gives the user 2 Armor when worn. - + + NOT USED + - - Gives the user 1 Armor when worn. - + + NOT USED + - - Gives the user 2 Armor when worn. - + + Gives the user 1 Armor when worn. + - - Gives the user 5 Armor when worn. - + + Gives the user 3 Armor when worn. + - - Gives the user 4 Armor when worn. - + + Gives the user 2 Armor when worn. + - - Gives the user 1 Armor when worn. - + + Gives the user 1 Armor when worn. + - - Gives the user 2 Armor when worn. - + + Gives the user 2 Armor when worn. + - - Gives the user 6 Armor when worn. - + + Gives the user 5 Armor when worn. + - - Gives the user 5 Armor when worn. - + + Gives the user 4 Armor when worn. + - - Gives the user 2 Armor when worn. - + + Gives the user 1 Armor when worn. + - - Gives the user 2 Armor when worn. - + + Gives the user 2 Armor when worn. + - - Gives the user 5 Armor when worn. - + + Gives the user 6 Armor when worn. + - - Gives the user 3 Armor when worn. - + + Gives the user 5 Armor when worn. + - - Gives the user 1 Armor when worn. - + + Gives the user 2 Armor when worn. + - - Gives the user 3 Armor when worn. - + + Gives the user 2 Armor when worn. + - - Gives the user 8 Armor when worn. - + + Gives the user 5 Armor when worn. + - - Gives the user 6 Armor when worn. - + + Gives the user 3 Armor when worn. + - - Gives the user 3 Armor when worn. - + + Gives the user 1 Armor when worn. + + + + Gives the user 3 Armor when worn. + + + + Gives the user 8 Armor when worn. + + + + Gives the user 6 Armor when worn. + + + + Gives the user 3 Armor when worn. + A shiny ingot which can be used to craft tools made from this material. Created by smelting ore in a furnace. @@ -912,6 +987,10 @@ The colors of the bed are always the same, regardless of the colors of wool used Will create an image of an area explored while held. This can be used for path-finding. + + When used becomes a map of the part of the world that you are in, and gets filled in as you explore. + + Allows for ranged attacks by using arrows. @@ -920,6 +999,54 @@ The colors of the bed are always the same, regardless of the colors of wool used Used as ammunition for bows.
+ + Dropped by the Wither, used in crafting Beacons. + + + + When activated, create colorful explosions. The color, effect, shape and fade are determined by the Firework Star used when the Firework is created. + + + + Used to determine the color, effect and shape of a Firework. + + + + Used in Redstone circuits to maintain, compare, or subtract signal strength, or to measure certain block states. + + + + Is a type of Minecart that acts as a moving TNT block. + + + + Is a block that outputs a Redstone signal based on sunlight (or lack of sunlight). + + + + Is a special type of Minecart that functions similarly to a Hopper. It will collect items lying on tracks and from containers above it. + + + + A special type of Armor that can be equipped to a horse. Provides 5 Armor. + + + + A special type of Armor that can be equipped to a horse. Provides 7 Armor. + + + + A special type of Armor that can be equipped to a horse. Provides 11 Armor. + + + + Used to leash mobs to the player or Fence posts. + + + + Used to name mobs in the world. + + Restores 2.5{*ICON_SHANK_01*}. @@ -1022,7 +1149,7 @@ Can also be used for low-level lighting.
- Functions like a Pressure Plate (sends a Redstone signal when powered) but can only be activated by a minecart. + Functions like a Pressure Plate (sends a Redstone signal when powered) but can only be activated by a Minecart. @@ -1566,6 +1693,66 @@ Can also be used for low-level lighting. Mob Heads can be placed as a decoration, or worn as a mask in the helmet slot. + + Used to execute commands. + + + + Projects a beam of light into the sky and can provide Status Effects to nearby players. + + + + Stores blocks and items inside. Place two chest side by side to create a larger chest with double capacity. The trapped chest also creates a Redstone charge when opened. + + + + Provides a Redstone charge. The charge will be stronger if more items are on the plate. + + + + Provides a Redstone charge. The charge will be stronger if more items are on the plate. Requires more weight than the light plate. + + + + Used as a redstone power source. Can be crafted back into Redstone. + + + + Used to catch items or to transfer items into and out of containers. + + + + A type of rail that can enable or disable Minecarts with Hoppers and trigger Minecarts with TNT. + + + + Used to hold and drop items, or push items into another container, when given a Redstone charge. + + + + Colorful blocks crafted by dyeing Hardened clay. + + + + Can be fed to Horses, Donkeys or Mules to heal up to 10 Hearts. Speeds up the growth of foals. + + + + Created by smelting Clay in a furnace. + + + + Crafted from glass and a dye. + + + + Crafted from Stained Glass + + + + A compact way of storing Coal. Can be used as fuel in a Furnace. + + Squid @@ -1754,6 +1941,62 @@ Can also be used for low-level lighting. Appear in Villages to protect them, and can be created using Iron Blocks and Pumpkins.
+ + Bat + + + + These flying creatures are found in caverns or other large enclosed spaces. + + + + Witch + + + + These enemies can be found in swamps and attack you by throwing Potions. They drop Potions when killed. + + + + Horse + + + + These animals can be tamed and can then be ridden. + + + + Donkey + + + + These animals can be tamed and can then be ridden. They can have a chest attached. + + + + Mule + + + + Born when a Horse and a Donkey breed. These animals can be tamed and can then be ridden and carry chests. + + + + Zombie Horse + + + + Skeleton Horse + + + + Wither + + + + These are crafted from Wither Skulls and Soul Sand. They fire exploding skulls at you. + + Explosives Animator @@ -2446,6 +2689,10 @@ Can also be used for low-level lighting. Map
+ + Empty Map + + Music Disc - "13" @@ -2650,6 +2897,50 @@ Can also be used for low-level lighting. Creeper Head
+ + Nether Star + + + + Firework Rocket + + + + Firework Star + + + + Redstone Comparator + + + + Minecart with TNT + + + + Minecart with Hopper + + + + Iron Horse Armor + + + + Gold Horse Armor + + + + Diamond Horse Armor + + + + Lead + + + + Name Tag + + Stone @@ -2682,6 +2973,10 @@ Can also be used for low-level lighting. Jungle Wood Planks
+ + Wood Planks (any type) + + Sapling @@ -2880,22 +3175,21 @@ Can also be used for low-level lighting. Block of Gold - +
- - A compact way of storing Gold. - + + 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/Network/NetworkPlayerXbox.cpp b/Minecraft.Client/Xbox/Network/NetworkPlayerXbox.cpp index 37e24f7a..386a0206 100644 --- a/Minecraft.Client/Xbox/Network/NetworkPlayerXbox.cpp +++ b/Minecraft.Client/Xbox/Network/NetworkPlayerXbox.cpp @@ -12,7 +12,7 @@ unsigned char NetworkPlayerXbox::GetSmallId() return m_qnetPlayer->GetSmallId(); } -void NetworkPlayerXbox::SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority) +void NetworkPlayerXbox::SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority, bool ack) { DWORD flags; flags = QNET_SENDDATA_RELIABLE | QNET_SENDDATA_SEQUENTIAL; @@ -20,6 +20,11 @@ void NetworkPlayerXbox::SendData(INetworkPlayer *player, const void *pvData, int m_qnetPlayer->SendData(((NetworkPlayerXbox *)player)->m_qnetPlayer, pvData, dataSize, flags); } +int NetworkPlayerXbox::GetOutstandingAckCount() +{ + return 0; +} + bool NetworkPlayerXbox::IsSameSystem(INetworkPlayer *player) { return ( m_qnetPlayer->IsSameSystem(((NetworkPlayerXbox *)player)->m_qnetPlayer) == TRUE ); @@ -119,3 +124,19 @@ IQNetPlayer *NetworkPlayerXbox::GetQNetPlayer() return m_qnetPlayer; } +void NetworkPlayerXbox::SentChunkPacket() +{ + m_lastChunkPacketTime = System::currentTimeMillis(); +} + +int NetworkPlayerXbox::GetTimeSinceLastChunkPacket_ms() +{ + // If we haven't ever sent a packet, return maximum + if( m_lastChunkPacketTime == 0 ) + { + return INT_MAX; + } + + __int64 currentTime = System::currentTimeMillis(); + return (int)( currentTime - m_lastChunkPacketTime ); +} \ No newline at end of file diff --git a/Minecraft.Client/Xbox/Network/NetworkPlayerXbox.h b/Minecraft.Client/Xbox/Network/NetworkPlayerXbox.h index 1822717c..bec7a125 100644 --- a/Minecraft.Client/Xbox/Network/NetworkPlayerXbox.h +++ b/Minecraft.Client/Xbox/Network/NetworkPlayerXbox.h @@ -11,8 +11,9 @@ public: // Common player interface NetworkPlayerXbox(IQNetPlayer *qnetPlayer); virtual unsigned char GetSmallId(); - virtual void SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority); + virtual void SendData(INetworkPlayer *player, const void *pvData, int dataSize, bool lowPriority, bool ack); virtual bool IsSameSystem(INetworkPlayer *player); + virtual int GetOutstandingAckCount(); virtual int GetSendQueueSizeBytes( INetworkPlayer *player, bool lowPriority ); virtual int GetSendQueueSizeMessages( INetworkPlayer *player, bool lowPriority ); virtual int GetCurrentRtt(); @@ -30,10 +31,13 @@ public: virtual const wchar_t *GetOnlineName(); virtual std::wstring GetDisplayName(); virtual PlayerUID GetUID(); + virtual void SentChunkPacket(); + virtual int GetTimeSinceLastChunkPacket_ms(); // Extra xbox-specific things IQNetPlayer *GetQNetPlayer(); private: IQNetPlayer *m_qnetPlayer; Socket *m_pSocket; + __int64 m_lastChunkPacketTime; }; \ No newline at end of file diff --git a/Minecraft.Client/ZombieModel.cpp b/Minecraft.Client/ZombieModel.cpp index 2063b830..648dd09f 100644 --- a/Minecraft.Client/ZombieModel.cpp +++ b/Minecraft.Client/ZombieModel.cpp @@ -15,9 +15,9 @@ ZombieModel::ZombieModel(float g, bool isArmor) : HumanoidModel(g, 0, 64, isArmo { } -void ZombieModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim) +void ZombieModel::setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim) { - HumanoidModel::setupAnim(time, r, bob, yRot, xRot, scale, uiBitmaskOverrideAnim); + HumanoidModel::setupAnim(time, r, bob, yRot, xRot, scale, entity, uiBitmaskOverrideAnim); float attack2 = Mth::sin(attackTime*PI); float attack = Mth::sin((1-(1-attackTime)*(1-attackTime))*PI); diff --git a/Minecraft.Client/ZombieModel.h b/Minecraft.Client/ZombieModel.h index 1971db09..208b4c30 100644 --- a/Minecraft.Client/ZombieModel.h +++ b/Minecraft.Client/ZombieModel.h @@ -12,5 +12,5 @@ protected: public: ZombieModel(float g, bool isArmor); - virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, unsigned int uiBitmaskOverrideAnim=0); + virtual void setupAnim(float time, float r, float bob, float yRot, float xRot, float scale, shared_ptr entity, unsigned int uiBitmaskOverrideAnim=0); }; diff --git a/Minecraft.Client/ZombieRenderer.cpp b/Minecraft.Client/ZombieRenderer.cpp index 5408736d..7fd2d201 100644 --- a/Minecraft.Client/ZombieRenderer.cpp +++ b/Minecraft.Client/ZombieRenderer.cpp @@ -4,6 +4,10 @@ #include "..\Minecraft.World\net.minecraft.world.entity.monster.h" #include "ZombieRenderer.h" +ResourceLocation ZombieRenderer::ZOMBIE_PIGMAN_LOCATION(TN_MOB_PIGZOMBIE); +ResourceLocation ZombieRenderer::ZOMBIE_LOCATION(TN_MOB_ZOMBIE); +ResourceLocation ZombieRenderer::ZOMBIE_VILLAGER_LOCATION(TN_MOB_ZOMBIE_VILLAGER); + ZombieRenderer::ZombieRenderer() : HumanoidMobRenderer(new ZombieModel(), .5f, 1.0f) { modelVersion = 1; @@ -34,7 +38,7 @@ void ZombieRenderer::createArmorParts() villagerArmorParts2 = new VillagerZombieModel(0.5f, 0, true); } -int ZombieRenderer::prepareArmor(shared_ptr _mob, int layer, float a) +int ZombieRenderer::prepareArmor(shared_ptr _mob, int layer, float a) { shared_ptr mob = dynamic_pointer_cast(_mob); swapArmor(mob); @@ -48,7 +52,24 @@ void ZombieRenderer::render(shared_ptr _mob, double x, double y, double HumanoidMobRenderer::render(_mob, x, y, z, rot, a); } -void ZombieRenderer::additionalRendering(shared_ptr _mob, float a) +ResourceLocation *ZombieRenderer::getTextureLocation(shared_ptr entity) +{ + shared_ptr mob = dynamic_pointer_cast(entity); + + // TODO Extract this clusterfck into 3 renderers + if ( entity->instanceof(eTYPE_PIGZOMBIE) ) + { + return &ZOMBIE_PIGMAN_LOCATION; + } + + if (mob->isVillager()) + { + return &ZOMBIE_VILLAGER_LOCATION; + } + return &ZOMBIE_LOCATION; +} + +void ZombieRenderer::additionalRendering(shared_ptr _mob, float a) { shared_ptr mob = dynamic_pointer_cast(_mob); swapArmor(mob); @@ -80,7 +101,7 @@ void ZombieRenderer::swapArmor(shared_ptr mob) humanoidModel = (HumanoidModel *) model; } -void ZombieRenderer::setupRotations(shared_ptr _mob, float bob, float bodyRot, float a) +void ZombieRenderer::setupRotations(shared_ptr _mob, float bob, float bodyRot, float a) { shared_ptr mob = dynamic_pointer_cast(_mob); if (mob->isConverting()) diff --git a/Minecraft.Client/ZombieRenderer.h b/Minecraft.Client/ZombieRenderer.h index e070cc7b..c8f110b1 100644 --- a/Minecraft.Client/ZombieRenderer.h +++ b/Minecraft.Client/ZombieRenderer.h @@ -1,5 +1,4 @@ #pragma once - #include "HumanoidMobRenderer.h" class VillagerZombieModel; @@ -8,6 +7,10 @@ class Zombie; class ZombieRenderer : public HumanoidMobRenderer { private: + static ResourceLocation ZOMBIE_PIGMAN_LOCATION; + static ResourceLocation ZOMBIE_LOCATION; + static ResourceLocation ZOMBIE_VILLAGER_LOCATION; + HumanoidModel *defaultModel; VillagerZombieModel *villagerModel; @@ -24,18 +27,19 @@ public: ZombieRenderer(); protected: - void createArmorParts(); - int prepareArmor(shared_ptr _mob, int layer, float a); + virtual void createArmorParts(); + virtual int prepareArmor(shared_ptr _mob, int layer, float a); public: - void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual void render(shared_ptr _mob, double x, double y, double z, float rot, float a); + virtual ResourceLocation *getTextureLocation(shared_ptr entity); protected: - void additionalRendering(shared_ptr _mob, float a); + virtual void additionalRendering(shared_ptr _mob, float a); private: - void swapArmor(shared_ptr mob); + virtual void swapArmor(shared_ptr mob); protected: - void setupRotations(shared_ptr _mob, float bob, float bodyRot, float a); + virtual void setupRotations(shared_ptr _mob, float bob, float bodyRot, float a); }; \ No newline at end of file diff --git a/Minecraft.Client/compat_shims.cpp b/Minecraft.Client/compat_shims.cpp new file mode 100644 index 00000000..8e401c03 --- /dev/null +++ b/Minecraft.Client/compat_shims.cpp @@ -0,0 +1,5 @@ +#pragma comment(lib, "legacy_stdio_definitions.lib") + +namespace std { + char const* _Winerror_map(int) { return nullptr; } +} \ No newline at end of file diff --git a/Minecraft.Client/iob_shim.asm b/Minecraft.Client/iob_shim.asm new file mode 100644 index 00000000..4ad52c48 --- /dev/null +++ b/Minecraft.Client/iob_shim.asm @@ -0,0 +1,12 @@ +; iob_shim.asm +; Provides __iob_func for legacy libs compiled against pre-VS2015 CRT + +.code +EXTRN __acrt_iob_func:PROC + +__iob_func PROC + mov ecx, 0 + jmp __acrt_iob_func +__iob_func ENDP + +END \ No newline at end of file diff --git a/Minecraft.Client/sce_sys/keystone_vita b/Minecraft.Client/sce_sys/keystone_vita new file mode 100644 index 00000000..30388343 Binary files /dev/null and b/Minecraft.Client/sce_sys/keystone_vita differ diff --git a/Minecraft.Client/stdafx.h b/Minecraft.Client/stdafx.h index 05b17e81..25d93572 100644 --- a/Minecraft.Client/stdafx.h +++ b/Minecraft.Client/stdafx.h @@ -211,10 +211,10 @@ typedef XUID GameSessionUID; #include "Common\XUI\XUI_Scene_Base.h" #endif +#include "Common\App_defines.h" #include "Common\UI\UIEnums.h" #include "Common\UI\UIStructs.h" // #ifdef _XBOX -#include "Common\App_defines.h" #include "Common\App_enums.h" #include "Common\Tutorial\TutorialEnum.h" #include "Common\App_structs.h" diff --git a/Minecraft.World/AABB.cpp b/Minecraft.World/AABB.cpp index 4c867f0d..8bc8e140 100644 --- a/Minecraft.World/AABB.cpp +++ b/Minecraft.World/AABB.cpp @@ -49,7 +49,7 @@ void AABB::ReleaseThreadStorage() AABB *AABB::newPermanent(double x0, double y0, double z0, double x1, double y1, double z1) { - return new AABB(x0, y0, z0, x1, y1, z1); + return new AABB(x0, y0, z0, x1, y1, z1); } void AABB::clearPool() @@ -66,277 +66,289 @@ AABB *AABB::newTemp(double x0, double y0, double z0, double x1, double y1, doubl AABB *thisAABB = &tls->pool[tls->poolPointer]; thisAABB->set(x0, y0, z0, x1, y1, z1); tls->poolPointer = ( tls->poolPointer + 1 ) % ThreadStorage::POOL_SIZE; - return thisAABB; + return thisAABB; } AABB::AABB(double x0, double y0, double z0, double x1, double y1, double z1) { - this->x0 = x0; - this->y0 = y0; - this->z0 = z0; - this->x1 = x1; - this->y1 = y1; - this->z1 = z1; + this->x0 = x0; + this->y0 = y0; + this->z0 = z0; + this->x1 = x1; + this->y1 = y1; + this->z1 = z1; } AABB *AABB::set(double x0, double y0, double z0, double x1, double y1, double z1) { - this->x0 = x0; - this->y0 = y0; - this->z0 = z0; - this->x1 = x1; - this->y1 = y1; - this->z1 = z1; - return this; + this->x0 = x0; + this->y0 = y0; + this->z0 = z0; + this->x1 = x1; + this->y1 = y1; + this->z1 = z1; + return this; } AABB *AABB::expand(double xa, double ya, double za) { - double _x0 = x0; - double _y0 = y0; - double _z0 = z0; - double _x1 = x1; - double _y1 = y1; - double _z1 = z1; + double _x0 = x0; + double _y0 = y0; + double _z0 = z0; + double _x1 = x1; + double _y1 = y1; + double _z1 = z1; - if (xa < 0) _x0 += xa; - if (xa > 0) _x1 += xa; + if (xa < 0) _x0 += xa; + if (xa > 0) _x1 += xa; - if (ya < 0) _y0 += ya; - if (ya > 0) _y1 += ya; + if (ya < 0) _y0 += ya; + if (ya > 0) _y1 += ya; - if (za < 0) _z0 += za; - if (za > 0) _z1 += za; + if (za < 0) _z0 += za; + if (za > 0) _z1 += za; - return AABB::newTemp(_x0, _y0, _z0, _x1, _y1, _z1); + return AABB::newTemp(_x0, _y0, _z0, _x1, _y1, _z1); } AABB *AABB::grow(double xa, double ya, double za) { - double _x0 = x0 - xa; - double _y0 = y0 - ya; - double _z0 = z0 - za; - double _x1 = x1 + xa; - double _y1 = y1 + ya; - double _z1 = z1 + za; + double _x0 = x0 - xa; + double _y0 = y0 - ya; + double _z0 = z0 - za; + double _x1 = x1 + xa; + double _y1 = y1 + ya; + double _z1 = z1 + za; - return AABB::newTemp(_x0, _y0, _z0, _x1, _y1, _z1); + return AABB::newTemp(_x0, _y0, _z0, _x1, _y1, _z1); +} + +AABB *AABB::minmax(AABB *other) +{ + double _x0 = min(x0, other->x0); + double _y0 = min(y0, other->y0); + double _z0 = min(z0, other->z0); + double _x1 = max(x1, other->x1); + double _y1 = max(y1, other->y1); + double _z1 = max(z1, other->z1); + + return newTemp(_x0, _y0, _z0, _x1, _y1, _z1); } AABB *AABB::cloneMove(double xa, double ya, double za) { - return AABB::newTemp(x0 + xa, y0 + ya, z0 + za, x1 + xa, y1 + ya, z1 + za); + return AABB::newTemp(x0 + xa, y0 + ya, z0 + za, x1 + xa, y1 + ya, z1 + za); } double AABB::clipXCollide(AABB *c, double xa) { - if (c->y1 <= y0 || c->y0 >= y1) return xa; - if (c->z1 <= z0 || c->z0 >= z1) return xa; + if (c->y1 <= y0 || c->y0 >= y1) return xa; + if (c->z1 <= z0 || c->z0 >= z1) return xa; - if (xa > 0 && c->x1 <= x0) + if (xa > 0 && c->x1 <= x0) { - double max = x0 - c->x1; - if (max < xa) xa = max; - } - if (xa < 0 && c->x0 >= x1) + double max = x0 - c->x1; + if (max < xa) xa = max; + } + if (xa < 0 && c->x0 >= x1) { - double max = x1 - c->x0; - if (max > xa) xa = max; - } + double max = x1 - c->x0; + if (max > xa) xa = max; + } - return xa; + return xa; } double AABB::clipYCollide(AABB *c, double ya) { - if (c->x1 <= x0 || c->x0 >= x1) return ya; - if (c->z1 <= z0 || c->z0 >= z1) return ya; + if (c->x1 <= x0 || c->x0 >= x1) return ya; + if (c->z1 <= z0 || c->z0 >= z1) return ya; - if (ya > 0 && c->y1 <= y0) + if (ya > 0 && c->y1 <= y0) { - double max = y0 - c->y1; - if (max < ya) ya = max; - } - if (ya < 0 && c->y0 >= y1) + double max = y0 - c->y1; + if (max < ya) ya = max; + } + if (ya < 0 && c->y0 >= y1) { - double max = y1 - c->y0; - if (max > ya) ya = max; - } + double max = y1 - c->y0; + if (max > ya) ya = max; + } - return ya; + return ya; } double AABB::clipZCollide(AABB *c, double za) { - if (c->x1 <= x0 || c->x0 >= x1) return za; - if (c->y1 <= y0 || c->y0 >= y1) return za; + if (c->x1 <= x0 || c->x0 >= x1) return za; + if (c->y1 <= y0 || c->y0 >= y1) return za; - if (za > 0 && c->z1 <= z0) + if (za > 0 && c->z1 <= z0) { - double max = z0 - c->z1; - if (max < za) za = max; - } - if (za < 0 && c->z0 >= z1) + double max = z0 - c->z1; + if (max < za) za = max; + } + if (za < 0 && c->z0 >= z1) { - double max = z1 - c->z0; - if (max > za) za = max; - } + double max = z1 - c->z0; + if (max > za) za = max; + } - return za; + return za; } bool AABB::intersects(AABB *c) { - if (c->x1 <= x0 || c->x0 >= x1) return false; - if (c->y1 <= y0 || c->y0 >= y1) return false; - if (c->z1 <= z0 || c->z0 >= z1) return false; - return true; + if (c->x1 <= x0 || c->x0 >= x1) return false; + if (c->y1 <= y0 || c->y0 >= y1) return false; + if (c->z1 <= z0 || c->z0 >= z1) return false; + return true; } bool AABB::intersectsInner(AABB *c) { - if (c->x1 < x0 || c->x0 > x1) return false; - if (c->y1 < y0 || c->y0 > y1) return false; - if (c->z1 < z0 || c->z0 > z1) return false; - return true; + if (c->x1 < x0 || c->x0 > x1) return false; + if (c->y1 < y0 || c->y0 > y1) return false; + if (c->z1 < z0 || c->z0 > z1) return false; + return true; } AABB *AABB::move(double xa, double ya, double za) { - x0 += xa; - y0 += ya; - z0 += za; - x1 += xa; - y1 += ya; - z1 += za; - return this; + x0 += xa; + y0 += ya; + z0 += za; + x1 += xa; + y1 += ya; + z1 += za; + return this; } bool AABB::intersects(double x02, double y02, double z02, double x12, double y12, double z12) { - if (x12 <= x0 || x02 >= x1) return false; - if (y12 <= y0 || y02 >= y1) return false; - if (z12 <= z0 || z02 >= z1) return false; - return true; + if (x12 <= x0 || x02 >= x1) return false; + if (y12 <= y0 || y02 >= y1) return false; + if (z12 <= z0 || z02 >= z1) return false; + return true; } bool AABB::contains(Vec3 *p) { - if (p->x <= x0 || p->x >= x1) return false; - if (p->y <= y0 || p->y >= y1) return false; - if (p->z <= z0 || p->z >= z1) return false; - return true; + if (p->x <= x0 || p->x >= x1) return false; + if (p->y <= y0 || p->y >= y1) return false; + if (p->z <= z0 || p->z >= z1) return false; + return true; } // 4J Added bool AABB::containsIncludingLowerBound(Vec3 *p) { - if (p->x < x0 || p->x >= x1) return false; - if (p->y < y0 || p->y >= y1) return false; - if (p->z < z0 || p->z >= z1) return false; - return true; + if (p->x < x0 || p->x >= x1) return false; + if (p->y < y0 || p->y >= y1) return false; + if (p->z < z0 || p->z >= z1) return false; + return true; } double AABB::getSize() { - double xs = x1 - x0; - double ys = y1 - y0; - double zs = z1 - z0; - return (xs + ys + zs) / 3.0f; + double xs = x1 - x0; + double ys = y1 - y0; + double zs = z1 - z0; + return (xs + ys + zs) / 3.0f; } AABB *AABB::shrink(double xa, double ya, double za) { - double _x0 = x0 + xa; - double _y0 = y0 + ya; - double _z0 = z0 + za; - double _x1 = x1 - xa; - double _y1 = y1 - ya; - double _z1 = z1 - za; + double _x0 = x0 + xa; + double _y0 = y0 + ya; + double _z0 = z0 + za; + double _x1 = x1 - xa; + double _y1 = y1 - ya; + double _z1 = z1 - za; - return AABB::newTemp(_x0, _y0, _z0, _x1, _y1, _z1); + return AABB::newTemp(_x0, _y0, _z0, _x1, _y1, _z1); } AABB *AABB::copy() { - return AABB::newTemp(x0, y0, z0, x1, y1, z1); + return AABB::newTemp(x0, y0, z0, x1, y1, z1); } HitResult *AABB::clip(Vec3 *a, Vec3 *b) { - Vec3 *xh0 = a->clipX(b, x0); - Vec3 *xh1 = a->clipX(b, x1); + Vec3 *xh0 = a->clipX(b, x0); + Vec3 *xh1 = a->clipX(b, x1); - Vec3 *yh0 = a->clipY(b, y0); - Vec3 *yh1 = a->clipY(b, y1); + Vec3 *yh0 = a->clipY(b, y0); + Vec3 *yh1 = a->clipY(b, y1); - Vec3 *zh0 = a->clipZ(b, z0); - Vec3 *zh1 = a->clipZ(b, z1); + Vec3 *zh0 = a->clipZ(b, z0); + Vec3 *zh1 = a->clipZ(b, z1); - if (!containsX(xh0)) xh0 = NULL; - if (!containsX(xh1)) xh1 = NULL; - if (!containsY(yh0)) yh0 = NULL; - if (!containsY(yh1)) yh1 = NULL; - if (!containsZ(zh0)) zh0 = NULL; - if (!containsZ(zh1)) zh1 = NULL; + if (!containsX(xh0)) xh0 = NULL; + if (!containsX(xh1)) xh1 = NULL; + if (!containsY(yh0)) yh0 = NULL; + if (!containsY(yh1)) yh1 = NULL; + if (!containsZ(zh0)) zh0 = NULL; + if (!containsZ(zh1)) zh1 = NULL; - Vec3 *closest = NULL; + Vec3 *closest = NULL; - if (xh0 != NULL && (closest == NULL || a->distanceToSqr(xh0) < a->distanceToSqr(closest))) closest = xh0; - if (xh1 != NULL && (closest == NULL || a->distanceToSqr(xh1) < a->distanceToSqr(closest))) closest = xh1; - if (yh0 != NULL && (closest == NULL || a->distanceToSqr(yh0) < a->distanceToSqr(closest))) closest = yh0; - if (yh1 != NULL && (closest == NULL || a->distanceToSqr(yh1) < a->distanceToSqr(closest))) closest = yh1; - if (zh0 != NULL && (closest == NULL || a->distanceToSqr(zh0) < a->distanceToSqr(closest))) closest = zh0; - if (zh1 != NULL && (closest == NULL || a->distanceToSqr(zh1) < a->distanceToSqr(closest))) closest = zh1; + if (xh0 != NULL && (closest == NULL || a->distanceToSqr(xh0) < a->distanceToSqr(closest))) closest = xh0; + if (xh1 != NULL && (closest == NULL || a->distanceToSqr(xh1) < a->distanceToSqr(closest))) closest = xh1; + if (yh0 != NULL && (closest == NULL || a->distanceToSqr(yh0) < a->distanceToSqr(closest))) closest = yh0; + if (yh1 != NULL && (closest == NULL || a->distanceToSqr(yh1) < a->distanceToSqr(closest))) closest = yh1; + if (zh0 != NULL && (closest == NULL || a->distanceToSqr(zh0) < a->distanceToSqr(closest))) closest = zh0; + if (zh1 != NULL && (closest == NULL || a->distanceToSqr(zh1) < a->distanceToSqr(closest))) closest = zh1; - if (closest == NULL) return NULL; + if (closest == NULL) return NULL; - int face = -1; + int face = -1; - if (closest == xh0) face = 4; - if (closest == xh1) face = 5; - if (closest == yh0) face = 0; - if (closest == yh1) face = 1; - if (closest == zh0) face = 2; - if (closest == zh1) face = 3; + if (closest == xh0) face = 4; + if (closest == xh1) face = 5; + if (closest == yh0) face = 0; + if (closest == yh1) face = 1; + if (closest == zh0) face = 2; + if (closest == zh1) face = 3; - return new HitResult(0, 0, 0, face, closest); + return new HitResult(0, 0, 0, face, closest); } bool AABB::containsX(Vec3 *v) { - if (v == NULL) return false; - return v->y >= y0 && v->y <= y1 && v->z >= z0 && v->z <= z1; + if (v == NULL) return false; + return v->y >= y0 && v->y <= y1 && v->z >= z0 && v->z <= z1; } bool AABB::containsY(Vec3 *v) { - if (v == NULL) return false; - return v->x >= x0 && v->x <= x1 && v->z >= z0 && v->z <= z1; + if (v == NULL) return false; + return v->x >= x0 && v->x <= x1 && v->z >= z0 && v->z <= z1; } bool AABB::containsZ(Vec3 *v) { - if (v == NULL) return false; - return v->x >= x0 && v->x <= x1 && v->y >= y0 && v->y <= y1; + if (v == NULL) return false; + return v->x >= x0 && v->x <= x1 && v->y >= y0 && v->y <= y1; } void AABB::set(AABB *b) { - this->x0 = b->x0; - this->y0 = b->y0; - this->z0 = b->z0; - this->x1 = b->x1; - this->y1 = b->y1; - this->z1 = b->z1; + x0 = b->x0; + y0 = b->y0; + z0 = b->z0; + x1 = b->x1; + y1 = b->y1; + z1 = b->z1; } wstring AABB::toString() { - return L"box[" + _toString(x0) + L", " + _toString(y0) + L", " + _toString(z0) + L" -> " + + return L"box[" + _toString(x0) + L", " + _toString(y0) + L", " + _toString(z0) + L" -> " + _toString(x1) + L", " + _toString(y1) + L", " + _toString(z1) + L"]"; } diff --git a/Minecraft.World/AABB.h b/Minecraft.World/AABB.h index 81405ea1..4f7a3531 100644 --- a/Minecraft.World/AABB.h +++ b/Minecraft.World/AABB.h @@ -42,7 +42,7 @@ public: AABB *set(double x0, double y0, double z0, double x1, double y1, double z1); AABB *expand(double xa, double ya, double za); AABB *grow(double xa, double ya, double za); -public: + AABB *minmax(AABB *other); AABB *cloneMove(double xa, double ya, double za); double clipXCollide(AABB *c, double xa); double clipYCollide(AABB *c, double ya); diff --git a/Minecraft.World/Abilities.cpp b/Minecraft.World/Abilities.cpp index 06006860..1177937b 100644 --- a/Minecraft.World/Abilities.cpp +++ b/Minecraft.World/Abilities.cpp @@ -63,7 +63,7 @@ float Abilities::getFlyingSpeed() void Abilities::setFlyingSpeed(float value) { - this->flyingSpeed = value; + flyingSpeed = value; } float Abilities::getWalkingSpeed() @@ -73,5 +73,5 @@ float Abilities::getWalkingSpeed() void Abilities::setWalkingSpeed(float value) { - this->walkingSpeed = value; + walkingSpeed = value; } \ No newline at end of file diff --git a/Minecraft.World/AbsoptionMobEffect.cpp b/Minecraft.World/AbsoptionMobEffect.cpp new file mode 100644 index 00000000..6f5e1647 --- /dev/null +++ b/Minecraft.World/AbsoptionMobEffect.cpp @@ -0,0 +1,20 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.effect.h" +#include "AbsoptionMobEffect.h" + +AbsoptionMobEffect::AbsoptionMobEffect(int id, bool isHarmful, eMinecraftColour color) : MobEffect(id, isHarmful, color) +{ +} + +void AbsoptionMobEffect::removeAttributeModifiers(shared_ptr entity, BaseAttributeMap *attributes, int amplifier) +{ + entity->setAbsorptionAmount(entity->getAbsorptionAmount() - 4 * (amplifier + 1)); + MobEffect::removeAttributeModifiers(entity, attributes, amplifier); +} + +void AbsoptionMobEffect::addAttributeModifiers(shared_ptr entity, BaseAttributeMap *attributes, int amplifier) +{ + entity->setAbsorptionAmount(entity->getAbsorptionAmount() + 4 * (amplifier + 1)); + MobEffect::addAttributeModifiers(entity, attributes, amplifier); +} diff --git a/Minecraft.World/AbsoptionMobEffect.h b/Minecraft.World/AbsoptionMobEffect.h new file mode 100644 index 00000000..568186b7 --- /dev/null +++ b/Minecraft.World/AbsoptionMobEffect.h @@ -0,0 +1,14 @@ +#pragma once + +class LivingEntity; + +#include "MobEffect.h" + +class AbsoptionMobEffect : public MobEffect +{ +public: + AbsoptionMobEffect(int id, bool isHarmful, eMinecraftColour color); + + void removeAttributeModifiers(shared_ptr entity, BaseAttributeMap *attributes, int amplifier); + void addAttributeModifiers(shared_ptr entity, BaseAttributeMap *attributes, int amplifier); +}; \ No newline at end of file diff --git a/Minecraft.World/AbstractContainerMenu.cpp b/Minecraft.World/AbstractContainerMenu.cpp index 71d30feb..082e8008 100644 --- a/Minecraft.World/AbstractContainerMenu.cpp +++ b/Minecraft.World/AbstractContainerMenu.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "net.minecraft.world.entity.player.h" #include "net.minecraft.world.item.h" +#include "net.minecraft.world.level.redstone.h" #include "Slot.h" #include "AbstractContainerMenu.h" @@ -8,46 +9,36 @@ // TODO Make sure all derived classes also call this AbstractContainerMenu::AbstractContainerMenu() { - lastSlots = new vector >(); - slots = new vector(); containerId = 0; changeUid = 0; - m_bNeedsRendered = false; - containerListeners = new vector(); + quickcraftType = -1; + quickcraftStatus = 0; + + m_bNeedsRendered = false; } AbstractContainerMenu::~AbstractContainerMenu() { - delete lastSlots; - for( unsigned int i = 0; i < slots->size(); i++ ) + for( unsigned int i = 0; i < slots.size(); i++ ) { - delete slots->at(i); + delete slots.at(i); } - delete slots; - delete containerListeners; } Slot *AbstractContainerMenu::addSlot(Slot *slot) { - slot->index = (int)slots->size(); - slots->push_back(slot); - lastSlots->push_back(nullptr); + slot->index = (int)slots.size(); + slots.push_back(slot); + lastSlots.push_back(nullptr); return slot; } void AbstractContainerMenu::addSlotListener(ContainerListener *listener) { - // TODO 4J Add exceptions - /* - if (containerListeners->contains(listener)) { - throw new IllegalArgumentException("Listener already listening"); - } - */ - containerListeners->push_back(listener); - + containerListeners.push_back(listener); vector > *items = getItems(); listener->refreshContainer(this, items); @@ -55,11 +46,17 @@ void AbstractContainerMenu::addSlotListener(ContainerListener *listener) broadcastChanges(); } +void AbstractContainerMenu::removeSlotListener(ContainerListener *listener) +{ + AUTO_VAR(it, std::find(containerListeners.begin(), containerListeners.end(), listener) ); + if(it != containerListeners.end()) containerListeners.erase(it); +} + vector > *AbstractContainerMenu::getItems() { vector > *items = new vector >(); - AUTO_VAR(itEnd, slots->end()); - for (AUTO_VAR(it, slots->begin()); it != itEnd; it++) + AUTO_VAR(itEnd, slots.end()); + for (AUTO_VAR(it, slots.begin()); it != itEnd; it++) { items->push_back((*it)->getItem()); } @@ -68,8 +65,8 @@ vector > *AbstractContainerMenu::getItems() void AbstractContainerMenu::sendData(int id, int value) { - AUTO_VAR(itEnd, containerListeners->end()); - for (AUTO_VAR(it, containerListeners->begin()); it != itEnd; it++) + AUTO_VAR(itEnd, containerListeners.end()); + for (AUTO_VAR(it, containerListeners.begin()); it != itEnd; it++) { (*it)->setContainerData(this, id, value); } @@ -77,18 +74,20 @@ void AbstractContainerMenu::sendData(int id, int value) void AbstractContainerMenu::broadcastChanges() { - for (unsigned int i = 0; i < slots->size(); i++) + for (unsigned int i = 0; i < slots.size(); i++) { - shared_ptr current = slots->at(i)->getItem(); - shared_ptr expected = lastSlots->at(i); + shared_ptr current = slots.at(i)->getItem(); + shared_ptr expected = lastSlots.at(i); if (!ItemInstance::matches(expected, current)) { - expected = current == NULL ? nullptr : current->copy(); - (*lastSlots)[i] = expected; + // 4J Stu - Added 0 count check. There is a bug in the Java with anvils that means this broadcast + // happens while we are in the middle of quickmoving, and before the slot properly gets set to null + expected = (current == NULL || current->count == 0) ? nullptr : current->copy(); + lastSlots[i] = expected; m_bNeedsRendered = true; - AUTO_VAR(itEnd, containerListeners->end()); - for (AUTO_VAR(it, containerListeners->begin()); it != itEnd; it++) + AUTO_VAR(itEnd, containerListeners.end()); + for (AUTO_VAR(it, containerListeners.begin()); it != itEnd; it++) { (*it)->slotChanged(this, i, expected); } @@ -101,14 +100,14 @@ bool AbstractContainerMenu::needsRendered() bool needsRendered = m_bNeedsRendered; m_bNeedsRendered = false; - for (unsigned int i = 0; i < slots->size(); i++) + for (unsigned int i = 0; i < slots.size(); i++) { - shared_ptr current = slots->at(i)->getItem(); - shared_ptr expected = lastSlots->at(i); + shared_ptr current = slots.at(i)->getItem(); + shared_ptr expected = lastSlots.at(i); if (!ItemInstance::matches(expected, current)) { expected = current == NULL ? nullptr : current->copy(); - (*lastSlots)[i] = expected; + lastSlots[i] = expected; needsRendered = true; } } @@ -123,8 +122,8 @@ bool AbstractContainerMenu::clickMenuButton(shared_ptr player, int butto Slot *AbstractContainerMenu::getSlotFor(shared_ptr c, int index) { - AUTO_VAR(itEnd, slots->end()); - for (AUTO_VAR(it, slots->begin()); it != itEnd; it++) + AUTO_VAR(itEnd, slots.end()); + for (AUTO_VAR(it, slots.begin()); it != itEnd; it++) { Slot *slot = *it; //slots->at(i); if (slot->isAt(c, index)) @@ -137,12 +136,12 @@ Slot *AbstractContainerMenu::getSlotFor(shared_ptr c, int index) Slot *AbstractContainerMenu::getSlot(int index) { - return slots->at(index); + return slots.at(index); } shared_ptr AbstractContainerMenu::quickMoveStack(shared_ptr player, int slotIndex) { - Slot *slot = slots->at(slotIndex); + Slot *slot = slots.at(slotIndex); if (slot != NULL) { return slot->getItem(); @@ -150,18 +149,97 @@ shared_ptr AbstractContainerMenu::quickMoveStack(shared_ptr AbstractContainerMenu::clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player) +shared_ptr AbstractContainerMenu::clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player, bool looped) // 4J Added looped param { shared_ptr clickedEntity = nullptr; shared_ptr inventory = player->inventory; - if ((clickType == CLICK_PICKUP || clickType == CLICK_QUICK_MOVE) && (buttonNum == 0 || buttonNum == 1)) + if (clickType == CLICK_QUICK_CRAFT) { - 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..27993d77 100644 --- a/Minecraft.World/ArmorSlot.cpp +++ b/Minecraft.World/ArmorSlot.cpp @@ -19,6 +19,10 @@ int ArmorSlot::getMaxStackSize() bool ArmorSlot::mayPlace(shared_ptr item) { + if (item == NULL) + { + return false; + } if ( dynamic_cast( item->getItem() ) != NULL) { return dynamic_cast( item->getItem() )->slot == slotNum; diff --git a/Minecraft.World/ArrayWithLength.h b/Minecraft.World/ArrayWithLength.h index 4e9f9941..e22724c6 100644 --- a/Minecraft.World/ArrayWithLength.h +++ b/Minecraft.World/ArrayWithLength.h @@ -83,6 +83,7 @@ class Enchantment; class ClipChunk; typedef arrayWithLength doubleArray; +typedef array2DWithLength coords2DArray; typedef arrayWithLength byteArray; typedef arrayWithLength charArray; typedef arrayWithLength shortArray; diff --git a/Minecraft.World/Arrow.cpp b/Minecraft.World/Arrow.cpp index 1b102c65..743f966b 100644 --- a/Minecraft.World/Arrow.cpp +++ b/Minecraft.World/Arrow.cpp @@ -7,6 +7,9 @@ #include "net.minecraft.world.item.h" #include "net.minecraft.world.damagesource.h" #include "net.minecraft.world.item.enchantment.h" +#include "net.minecraft.network.packet.h" +#include "..\Minecraft.Client\ServerPlayer.h" +#include "..\Minecraft.Client\PlayerConnection.h" #include "com.mojang.nbt.h" #include "Arrow.h" @@ -48,16 +51,18 @@ void Arrow::_init() Arrow::Arrow(Level *level) : Entity( level ) { _init(); - - this->setSize(0.5f, 0.5f); + + viewScale = 10; + setSize(0.5f, 0.5f); } -Arrow::Arrow(Level *level, shared_ptr mob, shared_ptr target, float power, float uncertainty) : Entity( level ) +Arrow::Arrow(Level *level, shared_ptr mob, shared_ptr target, float power, float uncertainty) : Entity( level ) { _init(); - - this->owner = mob; - if ( dynamic_pointer_cast( mob ) != NULL) pickup = PICKUP_ALLOWED; + + viewScale = 10; + owner = mob; + if ( mob->instanceof(eTYPE_PLAYER) ) pickup = PICKUP_ALLOWED; y = mob->y + mob->getHeadHeight() - 0.1f; @@ -82,29 +87,31 @@ Arrow::Arrow(Level *level, shared_ptr mob, shared_ptr target, float po Arrow::Arrow(Level *level, double x, double y, double z) : Entity( level ) { _init(); + + viewScale = 10; + setSize(0.5f, 0.5f); - this->setSize(0.5f, 0.5f); - - this->setPos(x, y, z); - this->heightOffset = 0; + setPos(x, y, z); + heightOffset = 0; } -Arrow::Arrow(Level *level, shared_ptr mob, float power) : Entity( level ) +Arrow::Arrow(Level *level, shared_ptr mob, float power) : Entity( level ) { _init(); - this->owner = mob; - if ( dynamic_pointer_cast( mob ) != NULL) pickup = PICKUP_ALLOWED; + viewScale = 10; + owner = mob; + if ( mob->instanceof(eTYPE_PLAYER) ) pickup = PICKUP_ALLOWED; setSize(0.5f, 0.5f); - this->moveTo(mob->x, mob->y + mob->getHeadHeight(), mob->z, mob->yRot, mob->xRot); + moveTo(mob->x, mob->y + mob->getHeadHeight(), mob->z, mob->yRot, mob->xRot); x -= Mth::cos(yRot / 180 * PI) * 0.16f; y -= 0.1f; z -= Mth::sin(yRot / 180 * PI) * 0.16f; - this->setPos(x, y, z); - this->heightOffset = 0; + setPos(x, y, z); + heightOffset = 0; xd = -Mth::sin(yRot / 180 * PI) * Mth::cos(xRot / 180 * PI); zd = Mth::cos(yRot / 180 * PI) * Mth::cos(xRot / 180 * PI); @@ -128,9 +135,9 @@ void Arrow::shoot(double xd, double yd, double zd, float pow, float uncertainty) yd /= dist; zd /= dist; - xd += (random->nextGaussian()) * 0.0075f * uncertainty; - yd += (random->nextGaussian()) * 0.0075f * uncertainty; - zd += (random->nextGaussian()) * 0.0075f * uncertainty; + xd += (random->nextGaussian() * (random->nextBoolean() ? -1 : 1)) * 0.0075f * uncertainty; + yd += (random->nextGaussian() * (random->nextBoolean() ? -1 : 1)) * 0.0075f * uncertainty; + zd += (random->nextGaussian() * (random->nextBoolean() ? -1 : 1)) * 0.0075f * uncertainty; xd *= pow; yd *= pow; @@ -142,8 +149,8 @@ void Arrow::shoot(double xd, double yd, double zd, float pow, float uncertainty) double sd = sqrt(xd * xd + zd * zd); - yRotO = this->yRot = (float) (atan2(xd, zd) * 180 / PI); - xRotO = this->xRot = (float) (atan2(yd, sd) * 180 / PI); + yRotO = yRot = (float) (atan2(xd, zd) * 180 / PI); + xRotO = xRot = (float) (atan2(yd, sd) * 180 / PI); life = 0; } @@ -161,8 +168,8 @@ void Arrow::lerpMotion(double xd, double yd, double zd) if (xRotO == 0 && yRotO == 0) { double sd = sqrt(xd * xd + zd * zd); - yRotO = this->yRot = (float) (atan2( xd, zd) * 180 / PI); - xRotO = this->xRot = (float) (atan2( yd, sd) * 180 / PI); + yRotO = yRot = (float) (atan2( xd, zd) * 180 / PI); + xRotO = xRot = (float) (atan2( yd, sd) * 180 / PI); xRotO = xRot; yRotO = yRot; app.DebugPrintf("%f %f : 0x%x\n",xRot,yRot,&yRot); @@ -179,8 +186,8 @@ void Arrow::tick() if (xRotO == 0 && yRotO == 0) { double sd = sqrt(xd * xd + zd * zd); - yRotO = this->yRot = (float) (atan2(xd, zd) * 180 / PI); - xRotO = this->xRot = (float) (atan2(yd, sd) * 180 / PI); + yRotO = yRot = (float) (atan2(xd, zd) * 180 / PI); + xRotO = xRot = (float) (atan2(yd, sd) * 180 / PI); } @@ -269,6 +276,16 @@ void Arrow::tick() res = new HitResult(hitEntity); } + if ( (res != NULL) && (res->entity != NULL) && res->entity->instanceof(eTYPE_PLAYER)) + { + shared_ptr player = dynamic_pointer_cast(res->entity); + // 4J: Check for owner being null + if ( player->abilities.invulnerable || ((owner != NULL) && (owner->instanceof(eTYPE_PLAYER) && !dynamic_pointer_cast(owner)->canHarmPlayer(player)))) + { + res = NULL; + } + } + if (res != NULL) { if (res->entity != NULL) @@ -294,15 +311,19 @@ void Arrow::tick() // 4J Stu - We should not set the entity on fire unless we can cause some damage (this doesn't necessarily mean that the arrow hit lowered their health) // set targets on fire first because we want cooked // pork/chicken/steak - if (this->isOnFire()) + if (isOnFire() && res->entity->GetType() != eTYPE_ENDERMAN) { res->entity->setOnFire(5); } - shared_ptr mob = dynamic_pointer_cast(res->entity); - if (mob != NULL) + if (res->entity->instanceof(eTYPE_LIVINGENTITY)) { - mob->arrowCount++; + shared_ptr mob = dynamic_pointer_cast(res->entity); + + if (!level->isClientSide) + { + mob->setArrowCount(mob->getArrowCount() + 1); + } if (knockback > 0) { float pushLen = sqrt(xd * xd + zd * zd); @@ -316,12 +337,17 @@ void Arrow::tick() { ThornsEnchantment::doThornsAfterAttack(owner, mob, random); } + + if (owner != NULL && res->entity != owner && owner->GetType() == eTYPE_SERVERPLAYER) + { + dynamic_pointer_cast(owner)->connection->send( shared_ptr( new GameEventPacket(GameEventPacket::SUCCESSFUL_BOW_HIT, 0)) ); + } } // 4J : WESTY : For award, need to track if creeper was killed by arrow from the player. - if ( (dynamic_pointer_cast(owner) != NULL ) && // arrow owner is a player - ( res->entity->isAlive() == false ) && // target is now dead - ( dynamic_pointer_cast( res->entity ) != NULL ) ) // target is a creeper + if (owner != NULL && owner->instanceof(eTYPE_PLAYER) // arrow owner is a player + && !res->entity->isAlive() // target is now dead + && (res->entity->GetType() == eTYPE_CREEPER)) // target is a creeper { dynamic_pointer_cast(owner)->awardStat( @@ -330,9 +356,8 @@ void Arrow::tick() ); } - // 4J - sound change brought forward from 1.2.3 - level->playSound(shared_from_this(), eSoundType_RANDOM_BOW_HIT, 1.0f, 1.2f / (random->nextFloat() * 0.2f + 0.9f)); - remove(); + playSound( eSoundType_RANDOM_BOW_HIT, 1.0f, 1.2f / (random->nextFloat() * 0.2f + 0.9f)); + if (res->entity->GetType() != eTYPE_ENDERDRAGON) remove(); } else { @@ -365,11 +390,15 @@ void Arrow::tick() z -= (zd / dd) * 0.05f; } - // 4J - sound change brought forward from 1.2.3 - level->playSound(shared_from_this(), eSoundType_RANDOM_BOW_HIT, 1.0f, 1.2f / (random->nextFloat() * 0.2f + 0.9f)); + playSound(eSoundType_RANDOM_BOW_HIT, 1.0f, 1.2f / (random->nextFloat() * 0.2f + 0.9f)); inGround = true; shakeTime = 7; setCritArrow(false); + + if (lastTile != 0) + { + Tile::tiles[lastTile]->entityInside(level, xTile, yTile, zTile, shared_from_this() ); + } } } delete res; @@ -480,12 +509,17 @@ void Arrow::playerTouch(shared_ptr player) if (bRemove) { - level->playSound(shared_from_this(), eSoundType_RANDOM_POP, 0.2f, ((random->nextFloat() - random->nextFloat()) * 0.7f + 1.0f) * 2.0f); + playSound(eSoundType_RANDOM_POP, 0.2f, ((random->nextFloat() - random->nextFloat()) * 0.7f + 1.0f) * 2.0f); player->take(shared_from_this(), 1); remove(); } } +bool Arrow::makeStepSound() +{ + return false; +} + float Arrow::getShadowHeightOffs() { return 0; diff --git a/Minecraft.World/Arrow.h b/Minecraft.World/Arrow.h index b96aa210..9cfa2f84 100644 --- a/Minecraft.World/Arrow.h +++ b/Minecraft.World/Arrow.h @@ -2,11 +2,12 @@ using namespace std; #include "Entity.h" +#include "Projectile.h" class Level; class CompoundTag; -class Arrow : public Entity +class Arrow : public Entity, public Projectile { public: eINSTANCEOF GetType() { return eTYPE_ARROW; } @@ -26,35 +27,35 @@ private: static const int FLAG_CRIT = 1; private: - int xTile; - int yTile; - int zTile; - int lastTile; - int lastData; - bool inGround; + int xTile; + int yTile; + int zTile; + int lastTile; + int lastData; + bool inGround; public: int pickup; - int shakeTime; - shared_ptr owner; + int shakeTime; + shared_ptr owner; private: double baseDamage; - int knockback; + int knockback; private: int life; - int flightTime; + int flightTime; // 4J - added common ctor code. void _init(); public: Arrow(Level *level); - Arrow(Level *level, shared_ptr mob, shared_ptr target, float power, float uncertainty); - Arrow(Level *level, double x, double y, double z); - Arrow(Level *level, shared_ptr mob, float power); + Arrow(Level *level, shared_ptr mob, shared_ptr target, float power, float uncertainty); + Arrow(Level *level, double x, double y, double z); + Arrow(Level *level, shared_ptr mob, float power); protected: virtual void defineSynchedData(); @@ -63,11 +64,16 @@ public: void shoot(double xd, double yd, double zd, float pow, float uncertainty); virtual void lerpTo(double x, double y, double z, float yRot, float xRot, int steps); virtual void lerpMotion(double xd, double yd, double zd); - virtual void tick(); - virtual void addAdditonalSaveData(CompoundTag *tag); - virtual void readAdditionalSaveData(CompoundTag *tag); - virtual void playerTouch(shared_ptr player); - virtual float getShadowHeightOffs(); + virtual void tick(); + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditionalSaveData(CompoundTag *tag); + virtual void playerTouch(shared_ptr player); + +protected: + virtual bool makeStepSound(); + +public: + virtual float getShadowHeightOffs(); void setBaseDamage(double baseDamage); double getBaseDamage(); diff --git a/Minecraft.World/AttackDamageMobEffect.cpp b/Minecraft.World/AttackDamageMobEffect.cpp new file mode 100644 index 00000000..00ab0f95 --- /dev/null +++ b/Minecraft.World/AttackDamageMobEffect.cpp @@ -0,0 +1,19 @@ +#include "stdafx.h" + +#include "AttackDamageMobEffect.h" + +AttackDamageMobEffect::AttackDamageMobEffect(int id, bool isHarmful, eMinecraftColour color) : MobEffect(id, isHarmful, color) +{ +} + +double AttackDamageMobEffect::getAttributeModifierValue(int amplifier, AttributeModifier *original) +{ + if (id == MobEffect::weakness->id) + { + return -0.5f * (amplifier + 1); + } + else + { + return 1.3 * (amplifier + 1); + } +} \ No newline at end of file diff --git a/Minecraft.World/AttackDamageMobEffect.h b/Minecraft.World/AttackDamageMobEffect.h new file mode 100644 index 00000000..0597abfa --- /dev/null +++ b/Minecraft.World/AttackDamageMobEffect.h @@ -0,0 +1,13 @@ +#pragma once + +#include "MobEffect.h" + +class AttributeModifier; + +class AttackDamageMobEffect : public MobEffect +{ +public: + AttackDamageMobEffect(int id, bool isHarmful, eMinecraftColour color); + + double getAttributeModifierValue(int amplifier, AttributeModifier *original); +}; \ No newline at end of file diff --git a/Minecraft.World/Attribute.cpp b/Minecraft.World/Attribute.cpp new file mode 100644 index 00000000..7c280862 --- /dev/null +++ b/Minecraft.World/Attribute.cpp @@ -0,0 +1,18 @@ +#include "stdafx.h" +#include "Attribute.h" + +const int Attribute::AttributeNames [] = +{ + IDS_ATTRIBUTE_NAME_GENERIC_MAXHEALTH, + IDS_ATTRIBUTE_NAME_GENERIC_FOLLOWRANGE, + IDS_ATTRIBUTE_NAME_GENERIC_KNOCKBACKRESISTANCE, + IDS_ATTRIBUTE_NAME_GENERIC_MOVEMENTSPEED, + IDS_ATTRIBUTE_NAME_GENERIC_ATTACKDAMAGE, + IDS_ATTRIBUTE_NAME_HORSE_JUMPSTRENGTH, + IDS_ATTRIBUTE_NAME_ZOMBIE_SPAWNREINFORCEMENTS, +}; + +int Attribute::getName(eATTRIBUTE_ID id) +{ + return AttributeNames[id]; +} \ No newline at end of file diff --git a/Minecraft.World/Attribute.h b/Minecraft.World/Attribute.h new file mode 100644 index 00000000..1fb5246b --- /dev/null +++ b/Minecraft.World/Attribute.h @@ -0,0 +1,71 @@ +#pragma once +class AttributeModifier; + +// 4J: This ID is serialised into save data so new attributes must always be added after existing ones +enum eATTRIBUTE_ID +{ + // 1.6.4 + eAttributeId_GENERIC_MAXHEALTH, + eAttributeId_GENERIC_FOLLOWRANGE, + eAttributeId_GENERIC_KNOCKBACKRESISTANCE, + eAttributeId_GENERIC_MOVEMENTSPEED, + eAttributeId_GENERIC_ATTACKDAMAGE, + eAttributeId_HORSE_JUMPSTRENGTH, + eAttributeId_ZOMBIE_SPAWNREINFORCEMENTS, + + // 1.8+ + // New attributes go here + + eAttributeId_COUNT +}; + +class Attribute +{ +public: + static const int MAX_NAME_LENGTH = 64; + + /** + * 4J: Changed this from a string name to an ID + * Gets the ID of this attribute, for serialization. + * + * @return Name of this attribute. + */ + virtual eATTRIBUTE_ID getId() = 0; + + /** + * Sanitizes an attribute value, making sure it's not out of range and is an acceptable amount. + * + * + * @param value Value to sanitize. + * @return Sanitized value, safe for use. + */ + virtual double sanitizeValue(double value) = 0; + + /** + * Get the default value of this attribute, to be used upon creation. + * + * @return Default value. + */ + virtual double getDefaultValue() = 0; + + /** + * Checks if this attribute should be synced to the client. + * + * Attributes should be serverside only unless the client needs to know about it. + * + * @return True if the client should know about this attribute. + */ + virtual bool isClientSyncable() = 0; + + // 4J: Added to retrieve string ID for attribute + static int getName(eATTRIBUTE_ID id); + +protected: + static const int AttributeNames []; +}; + +#ifdef __ORBIS__ +typedef unordered_map> attrAttrModMap; +#else +typedef unordered_map attrAttrModMap; +#endif \ No newline at end of file diff --git a/Minecraft.World/AttributeInstance.h b/Minecraft.World/AttributeInstance.h new file mode 100644 index 00000000..e127f1a7 --- /dev/null +++ b/Minecraft.World/AttributeInstance.h @@ -0,0 +1,22 @@ +#pragma once +#include "AttributeModifier.h" + +class AttributeInstance +{ +public: + virtual ~AttributeInstance() {} + + virtual Attribute *getAttribute() = 0; + virtual double getBaseValue() = 0; + virtual void setBaseValue(double baseValue) = 0; + virtual double getValue() = 0; + + virtual unordered_set *getModifiers(int operation) = 0; + virtual void getModifiers(unordered_set& result) = 0; + virtual AttributeModifier *getModifier(eMODIFIER_ID id) = 0; + virtual void addModifiers(unordered_set *modifiers) = 0; + virtual void addModifier(AttributeModifier *modifier) = 0; + virtual void removeModifier(AttributeModifier *modifier) = 0; + virtual void removeModifier(eMODIFIER_ID id) = 0; + virtual void removeModifiers() = 0; +}; \ No newline at end of file diff --git a/Minecraft.World/AttributeModifier.cpp b/Minecraft.World/AttributeModifier.cpp new file mode 100644 index 00000000..c479853d --- /dev/null +++ b/Minecraft.World/AttributeModifier.cpp @@ -0,0 +1,129 @@ +#include "stdafx.h" + +#include "AttributeModifier.h" +#include "HtmlString.h" + +void AttributeModifier::_init(eMODIFIER_ID id, const wstring name, double amount, int operation) +{ + assert(operation < TOTAL_OPERATIONS); + this->amount = amount; + this->operation = operation; + this->name = name; + this->id = id; + this->serialize = true; +} + +AttributeModifier::AttributeModifier(double amount, int operation) +{ + // Create an anonymous attribute + _init(eModifierId_ANONYMOUS, name, amount, operation); +} + +AttributeModifier::AttributeModifier(eMODIFIER_ID id, double amount, int operation) +{ + _init(id, name, amount, operation); + + //Validate.notEmpty(name, "Modifier name cannot be empty"); + //Validate.inclusiveBetween(0, TOTAL_OPERATIONS - 1, operation, "Invalid operation"); +} + +eMODIFIER_ID AttributeModifier::getId() +{ + return id; +} + +wstring AttributeModifier::getName() +{ + return name; +} + +int AttributeModifier::getOperation() +{ + return operation; +} + +double AttributeModifier::getAmount() +{ + return amount; +} + +bool AttributeModifier::isSerializable() +{ + return serialize; +} + +AttributeModifier *AttributeModifier::setSerialize(bool serialize) +{ + this->serialize = serialize; + return this; +} + +bool AttributeModifier::equals(AttributeModifier *modifier) +{ + if (this == modifier) return true; + if (modifier == NULL) return false; //|| getClass() != o.getClass()) return false; + + if (id != modifier->id) return false; + + return true; +} + +wstring AttributeModifier::toString() +{ + return L""; + + /*return L"AttributeModifier{" + + L"amount=" + amount + + L", operation=" + operation + + L", name='" + name + '\'' + + L", id=" + id + + L", serialize=" + serialize + + L'}';*/ +} + +HtmlString AttributeModifier::getHoverText(eATTRIBUTE_ID attribute) +{ + double amount = getAmount(); + double displayAmount; + + if (getOperation() == AttributeModifier::OPERATION_MULTIPLY_BASE || getOperation() == AttributeModifier::OPERATION_MULTIPLY_TOTAL) + { + displayAmount = getAmount() * 100.0f; + } + else + { + displayAmount = getAmount(); + } + + eMinecraftColour color; + + if (amount > 0) + { + color = eHTMLColor_9; + } + else if (amount < 0) + { + displayAmount *= -1; + color = eHTMLColor_c; + } + + bool percentage = false; + switch(getOperation()) + { + case AttributeModifier::OPERATION_ADDITION: + percentage = false; + break; + case AttributeModifier::OPERATION_MULTIPLY_BASE: + case AttributeModifier::OPERATION_MULTIPLY_TOTAL: + percentage = true; + break; + default: + // No other operations + assert(0); + } + + wchar_t formatted[256]; + swprintf(formatted, 256, L"%ls%d%ls %ls", (amount > 0 ? L"+" : L"-"), (int) displayAmount, (percentage ? L"%" : L""), app.GetString(Attribute::getName(attribute))); + + return HtmlString(formatted, color); +} \ No newline at end of file diff --git a/Minecraft.World/AttributeModifier.h b/Minecraft.World/AttributeModifier.h new file mode 100644 index 00000000..c67fda1d --- /dev/null +++ b/Minecraft.World/AttributeModifier.h @@ -0,0 +1,69 @@ +#pragma once + +/* +4J - Both modifier uuid and name have been replaced by an id enum. Note that we have special value +"eModifierId_ANONYMOUS" for attribute modifiers that previously didn't have a fixed UUID and are never removed. + +To all intents and purposes anonymous modifiers don't have an ID and so are handled differently in some cases, for instance: + 1. You can have multiple modifiers with the anonymous ID on a single attribute instance + 2. Anonymous modifiers can't be removed from attribute instance by ID + +IMPORTANT: Saved out to file so don't change order. All new values should be added at the end. +*/ + +class HtmlString; + +enum eMODIFIER_ID +{ + eModifierId_ANONYMOUS = 0, + + eModifierId_ITEM_BASEDAMAGE, + + eModifierId_MOB_FLEEING, + eModifierId_MOB_SPRINTING, + + eModifierId_MOB_ENDERMAN_ATTACKSPEED, + eModifierId_MOB_PIG_ATTACKSPEED, + eModifierId_MOB_WITCH_DRINKSPEED, + eModifierId_MOB_ZOMBIE_BABYSPEED, + + eModifierId_POTION_DAMAGEBOOST, + eModifierId_POTION_HEALTHBOOST, + eModifierId_POTION_MOVESPEED, + eModifierId_POTION_MOVESLOWDOWN, + eModifierId_POTION_WEAKNESS, + + eModifierId_COUNT, +}; + +class AttributeModifier +{ +public: + static const int OPERATION_ADDITION = 0; + static const int OPERATION_MULTIPLY_BASE = 1; + static const int OPERATION_MULTIPLY_TOTAL = 2; + static const int TOTAL_OPERATIONS = 3; + +private: + double amount; + int operation; + wstring name; + eMODIFIER_ID id; + bool serialize; + + void _init(eMODIFIER_ID id, const wstring name, double amount, int operation); + +public: + AttributeModifier(double amount, int operation); + AttributeModifier(eMODIFIER_ID id, double amount, int operation); + + eMODIFIER_ID getId(); + wstring getName(); + int getOperation(); + double getAmount(); + bool isSerializable(); + AttributeModifier *setSerialize(bool serialize); + bool equals(AttributeModifier *modifier); + wstring toString(); + HtmlString getHoverText(eATTRIBUTE_ID attribute); // 4J: Added to keep modifier readable string creation in one place +}; \ No newline at end of file diff --git a/Minecraft.World/AvoidPlayerGoal.cpp b/Minecraft.World/AvoidPlayerGoal.cpp index c94d5cb1..53aebe89 100644 --- a/Minecraft.World/AvoidPlayerGoal.cpp +++ b/Minecraft.World/AvoidPlayerGoal.cpp @@ -10,16 +10,28 @@ #include "net.minecraft.world.phys.h" #include "AvoidPlayerGoal.h" -AvoidPlayerGoal::AvoidPlayerGoal(PathfinderMob *mob, const type_info& avoidType, float maxDist, float walkSpeed, float sprintSpeed) : avoidType(avoidType) +AvoidPlayerGoalEntitySelector::AvoidPlayerGoalEntitySelector(AvoidPlayerGoal *parent) +{ + m_parent = parent; +} + +bool AvoidPlayerGoalEntitySelector::matches(shared_ptr entity) const +{ + return entity->isAlive() && m_parent->mob->getSensing()->canSee(entity); +} + +AvoidPlayerGoal::AvoidPlayerGoal(PathfinderMob *mob, const type_info& avoidType, float maxDist, double walkSpeedModifier, double sprintSpeedModifier) : avoidType(avoidType) { this->mob = mob; //this->avoidType = avoidType; this->maxDist = maxDist; - this->walkSpeed = walkSpeed; - this->sprintSpeed = sprintSpeed; + this->walkSpeedModifier = walkSpeedModifier; + this->sprintSpeedModifier = sprintSpeedModifier; this->pathNav = mob->getNavigation(); setRequiredControlFlags(Control::MoveControlFlag); + entitySelector = new AvoidPlayerGoalEntitySelector(this); + toAvoid = weak_ptr(); path = NULL; } @@ -27,6 +39,7 @@ AvoidPlayerGoal::AvoidPlayerGoal(PathfinderMob *mob, const type_info& avoidType, AvoidPlayerGoal::~AvoidPlayerGoal() { if(path != NULL) delete path; + delete entitySelector; } bool AvoidPlayerGoal::canUse() @@ -40,7 +53,7 @@ bool AvoidPlayerGoal::canUse() } else { - vector > *entities = mob->level->getEntitiesOfClass(avoidType, mob->bb->grow(maxDist, 3, maxDist)); + vector > *entities = mob->level->getEntitiesOfClass(avoidType, mob->bb->grow(maxDist, 3, maxDist), entitySelector); if (entities->empty()) { delete entities; @@ -50,8 +63,6 @@ bool AvoidPlayerGoal::canUse() delete entities; } - if (!mob->getSensing()->canSee(toAvoid.lock())) return false; - Vec3 *pos = RandomPos::getPosAvoid(dynamic_pointer_cast(mob->shared_from_this()), 16, 7, Vec3::newTemp(toAvoid.lock()->x, toAvoid.lock()->y, toAvoid.lock()->z)); if (pos == NULL) return false; if (toAvoid.lock()->distanceToSqr(pos->x, pos->y, pos->z) < toAvoid.lock()->distanceToSqr(mob->shared_from_this())) return false; @@ -69,7 +80,7 @@ bool AvoidPlayerGoal::canContinueToUse() void AvoidPlayerGoal::start() { - pathNav->moveTo(path, walkSpeed); + pathNav->moveTo(path, walkSpeedModifier); path = NULL; } @@ -80,6 +91,6 @@ void AvoidPlayerGoal::stop() void AvoidPlayerGoal::tick() { - if (mob->distanceToSqr(toAvoid.lock()) < 7 * 7) mob->getNavigation()->setSpeed(sprintSpeed); - else mob->getNavigation()->setSpeed(walkSpeed); + if (mob->distanceToSqr(toAvoid.lock()) < 7 * 7) mob->getNavigation()->setSpeedModifier(sprintSpeedModifier); + else mob->getNavigation()->setSpeedModifier(walkSpeedModifier); } \ No newline at end of file diff --git a/Minecraft.World/AvoidPlayerGoal.h b/Minecraft.World/AvoidPlayerGoal.h index 0b17ee4f..267ccf7e 100644 --- a/Minecraft.World/AvoidPlayerGoal.h +++ b/Minecraft.World/AvoidPlayerGoal.h @@ -1,24 +1,38 @@ #pragma once #include "Goal.h" +#include "EntitySelector.h" class PathNavigation; class PathfinderMob; class Path; +class AvoidPlayerGoal; + +class AvoidPlayerGoalEntitySelector : public EntitySelector +{ +private: + AvoidPlayerGoal *m_parent; + +public: + AvoidPlayerGoalEntitySelector(AvoidPlayerGoal *parent); + bool matches(shared_ptr entity) const; +}; class AvoidPlayerGoal : public Goal { + friend class AvoidPlayerGoalEntitySelector; private: PathfinderMob *mob; // Owner of this goal - float walkSpeed, sprintSpeed; + double walkSpeedModifier, sprintSpeedModifier; weak_ptr toAvoid; float maxDist; Path *path; PathNavigation *pathNav; const type_info& avoidType; + EntitySelector *entitySelector; public: - AvoidPlayerGoal(PathfinderMob *mob, const type_info& avoidType, float maxDist, float walkSpeed, float sprintSpeed); + AvoidPlayerGoal(PathfinderMob *mob, const type_info& avoidType, float maxDist, double walkSpeedModifier, double sprintSpeedModifier); ~AvoidPlayerGoal(); virtual bool canUse(); diff --git a/Minecraft.World/BaseAttribute.cpp b/Minecraft.World/BaseAttribute.cpp new file mode 100644 index 00000000..ae7d32f7 --- /dev/null +++ b/Minecraft.World/BaseAttribute.cpp @@ -0,0 +1,31 @@ +#include "stdafx.h" + +#include "BaseAttribute.h" + +BaseAttribute::BaseAttribute(eATTRIBUTE_ID id, double defaultValue) +{ + this->id = id; + this->defaultValue = defaultValue; + syncable = false; +} + +eATTRIBUTE_ID BaseAttribute::getId() +{ + return id; +} + +double BaseAttribute::getDefaultValue() +{ + return defaultValue; +} + +bool BaseAttribute::isClientSyncable() +{ + return syncable; +} + +BaseAttribute *BaseAttribute::setSyncable(bool syncable) +{ + this->syncable = syncable; + return this; +} \ No newline at end of file diff --git a/Minecraft.World/BaseAttribute.h b/Minecraft.World/BaseAttribute.h new file mode 100644 index 00000000..8693daf7 --- /dev/null +++ b/Minecraft.World/BaseAttribute.h @@ -0,0 +1,20 @@ +#pragma once + +#include "Attribute.h" + +class BaseAttribute : public Attribute +{ +private: + eATTRIBUTE_ID id; + double defaultValue; + bool syncable; + +protected: + BaseAttribute(eATTRIBUTE_ID id, double defaultValue); + +public: + virtual eATTRIBUTE_ID getId(); + virtual double getDefaultValue(); + virtual bool isClientSyncable(); + virtual BaseAttribute *setSyncable(bool syncable); +}; \ No newline at end of file diff --git a/Minecraft.World/BaseAttributeMap.cpp b/Minecraft.World/BaseAttributeMap.cpp new file mode 100644 index 00000000..5a920f24 --- /dev/null +++ b/Minecraft.World/BaseAttributeMap.cpp @@ -0,0 +1,82 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.ai.attributes.h" +#include "BaseAttributeMap.h" + +BaseAttributeMap::~BaseAttributeMap() +{ + for(AUTO_VAR(it,attributesById.begin()); it != attributesById.end(); ++it) + { + delete it->second; + } +} + +AttributeInstance *BaseAttributeMap::getInstance(Attribute *attribute) +{ + return getInstance(attribute->getId()); +} + +AttributeInstance *BaseAttributeMap::getInstance(eATTRIBUTE_ID id) +{ + AUTO_VAR(it,attributesById.find(id)); + if(it != attributesById.end()) + { + return it->second; + } + else + { + return NULL; + } +} + +void BaseAttributeMap::getAttributes(vector& atts) +{ + for(AUTO_VAR(it,attributesById.begin()); it != attributesById.end(); ++it) + { + atts.push_back(it->second); + } +} + +void BaseAttributeMap::onAttributeModified(ModifiableAttributeInstance *attributeInstance) +{ +} + +void BaseAttributeMap::removeItemModifiers(shared_ptr item) +{ + attrAttrModMap *modifiers = item->getAttributeModifiers(); + + for(AUTO_VAR(it, modifiers->begin()); it != modifiers->end(); ++it) + { + AttributeInstance *attribute = getInstance(it->first); + AttributeModifier *modifier = it->second; + + if (attribute != NULL) + { + attribute->removeModifier(modifier); + } + + delete modifier; + } + + delete modifiers; +} + +void BaseAttributeMap::addItemModifiers(shared_ptr item) +{ + attrAttrModMap *modifiers = item->getAttributeModifiers(); + + for(AUTO_VAR(it, modifiers->begin()); it != modifiers->end(); ++it) + { + AttributeInstance *attribute = getInstance(it->first); + AttributeModifier *modifier = it->second; + + if (attribute != NULL) + { + attribute->removeModifier(modifier); + attribute->addModifier(new AttributeModifier(*modifier)); + } + + delete modifier; + } + + delete modifiers; +} diff --git a/Minecraft.World/BaseAttributeMap.h b/Minecraft.World/BaseAttributeMap.h new file mode 100644 index 00000000..928975b8 --- /dev/null +++ b/Minecraft.World/BaseAttributeMap.h @@ -0,0 +1,29 @@ +#pragma once + +class ModifiableAttributeInstance; + +class BaseAttributeMap +{ +protected: + //unordered_map attributesByObject; +#ifdef __ORBIS__ + unordered_map > attributesById; +#else + unordered_map attributesById; +#endif + +public : + virtual ~BaseAttributeMap(); + + virtual AttributeInstance *getInstance(Attribute *attribute); + virtual AttributeInstance *getInstance(eATTRIBUTE_ID name); + + virtual AttributeInstance *registerAttribute(Attribute *attribute) = 0; + + virtual void getAttributes(vector& atts); + virtual void onAttributeModified(ModifiableAttributeInstance *attributeInstance); + + // 4J: Changed these into specialised functions for adding/removing the modifiers of an item (it's cleaner) + virtual void removeItemModifiers(shared_ptr item); + virtual void addItemModifiers(shared_ptr item); +}; \ No newline at end of file diff --git a/Minecraft.World/BaseEntityTile.cpp b/Minecraft.World/BaseEntityTile.cpp new file mode 100644 index 00000000..2edfbf92 --- /dev/null +++ b/Minecraft.World/BaseEntityTile.cpp @@ -0,0 +1,33 @@ +#include "stdafx.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.entity.h" +#include "TileEntity.h" +#include "BaseEntityTile.h" + +BaseEntityTile::BaseEntityTile(int id, Material *material, bool isSolidRender /*= true*/) : Tile(id, material, isSolidRender) +{ + _isEntityTile = true; +} + +void BaseEntityTile::onPlace(Level *level, int x, int y, int z) +{ + Tile::onPlace(level, x, y, z); + //level->setTileEntity(x, y, z, newTileEntity(level)); +} + +void BaseEntityTile::onRemove(Level *level, int x, int y, int z, int id, int data) +{ + Tile::onRemove(level, x, y, z, id, data); + level->removeTileEntity(x, y, z); +} + +bool BaseEntityTile::triggerEvent(Level *level, int x, int y, int z, int b0, int b1) +{ + Tile::triggerEvent(level, x, y, z, b0, b1); + shared_ptr te = level->getTileEntity(x, y, z); + if (te != NULL) + { + return te->triggerEvent(b0, b1); + } + return false; +} \ No newline at end of file diff --git a/Minecraft.World/BaseEntityTile.h b/Minecraft.World/BaseEntityTile.h new file mode 100644 index 00000000..5136bab8 --- /dev/null +++ b/Minecraft.World/BaseEntityTile.h @@ -0,0 +1,15 @@ +#pragma once +#include "Tile.h" +#include "EntityTile.h" + +class TileEntity; + +class BaseEntityTile : public Tile, public EntityTile +{ +protected: + BaseEntityTile(int id, Material *material, bool isSolidRender = true); +public: + virtual void onPlace(Level *level, int x, int y, int z); + virtual void onRemove(Level *level, int x, int y, int z, int id, int data); + virtual bool triggerEvent(Level *level, int x, int y, int z, int b0, int b1); +}; \ No newline at end of file diff --git a/Minecraft.World/BaseMobSpawner.cpp b/Minecraft.World/BaseMobSpawner.cpp new file mode 100644 index 00000000..887177ed --- /dev/null +++ b/Minecraft.World/BaseMobSpawner.cpp @@ -0,0 +1,401 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.item.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.phys.h" +#include "BaseMobSpawner.h" + +BaseMobSpawner::BaseMobSpawner() +{ + spawnPotentials = NULL; + spawnDelay = 20; + entityId = L"Pig"; + nextSpawnData = NULL; + spin = oSpin = 0.0; + + minSpawnDelay = SharedConstants::TICKS_PER_SECOND * 10; + maxSpawnDelay = SharedConstants::TICKS_PER_SECOND * 40; + spawnCount = 4; + displayEntity = nullptr; + maxNearbyEntities = 6; + requiredPlayerRange = 16; + spawnRange = 4; +} + +BaseMobSpawner::~BaseMobSpawner() +{ + if(spawnPotentials) + { + for(AUTO_VAR(it,spawnPotentials->begin()); it != spawnPotentials->end(); ++it) + { + delete *it; + } + delete spawnPotentials; + } +} + +wstring BaseMobSpawner::getEntityId() +{ + if (getNextSpawnData() == NULL) + { + if (entityId.compare(L"Minecart") == 0) + { + entityId = L"MinecartRideable"; + } + return entityId; + } + else + { + return getNextSpawnData()->type; + } +} + +void BaseMobSpawner::setEntityId(const wstring &entityId) +{ + this->entityId = entityId; +} + +bool BaseMobSpawner::isNearPlayer() +{ + return getLevel()->getNearestPlayer(getX() + 0.5, getY() + 0.5, getZ() + 0.5, requiredPlayerRange) != NULL; +} + +void BaseMobSpawner::tick() +{ + if (!isNearPlayer()) + { + return; + } + + if (getLevel()->isClientSide) + { + double xP = getX() + getLevel()->random->nextFloat(); + double yP = getY() + getLevel()->random->nextFloat(); + double zP = getZ() + getLevel()->random->nextFloat(); + getLevel()->addParticle(eParticleType_smoke, xP, yP, zP, 0, 0, 0); + getLevel()->addParticle(eParticleType_flame, xP, yP, zP, 0, 0, 0); + + if (spawnDelay > 0) spawnDelay--; + oSpin = spin; + spin = (int)(spin + 1000 / (spawnDelay + 200.0f)) % 360; + } + else + { + if (spawnDelay == -1) delay(); + + if (spawnDelay > 0) + { + spawnDelay--; + return; + } + + bool _delay = false; + + for (int c = 0; c < spawnCount; c++) + { + shared_ptr entity = EntityIO::newEntity(getEntityId(), getLevel()); + if (entity == NULL) return; + + int nearBy = getLevel()->getEntitiesOfClass( typeid(entity.get()), AABB::newTemp(getX(), getY(), getZ(), getX() + 1, getY() + 1, getZ() + 1)->grow(spawnRange * 2, 4, spawnRange * 2))->size(); + if (nearBy >= maxNearbyEntities) + { + delay(); + return; + } + + double xp = getX() + (getLevel()->random->nextDouble() - getLevel()->random->nextDouble()) * spawnRange; + double yp = getY() + getLevel()->random->nextInt(3) - 1; + double zp = getZ() + (getLevel()->random->nextDouble() - getLevel()->random->nextDouble()) * spawnRange; + shared_ptr mob = entity->instanceof(eTYPE_MOB) ? dynamic_pointer_cast( entity ) : nullptr; + + entity->moveTo(xp, yp, zp, getLevel()->random->nextFloat() * 360, 0); + + if (mob == NULL || mob->canSpawn()) + { + loadDataAndAddEntity(entity); + getLevel()->levelEvent(LevelEvent::PARTICLES_MOBTILE_SPAWN, getX(), getY(), getZ(), 0); + + if (mob != NULL) + { + mob->spawnAnim(); + } + + _delay = true; + } + } + + if (_delay) delay(); + } +} + +shared_ptr BaseMobSpawner::loadDataAndAddEntity(shared_ptr entity) +{ + if (getNextSpawnData() != NULL) + { + CompoundTag *data = new CompoundTag(); + entity->save(data); + + vector *tags = getNextSpawnData()->tag->getAllTags(); + for (AUTO_VAR(it, tags->begin()); it != tags->end(); ++it) + { + Tag *tag = *it; + data->put(tag->getName(), tag->copy()); + } + delete tags; + + entity->load(data); + if (entity->level != NULL) entity->level->addEntity(entity); + + // add mounts + shared_ptr rider = entity; + while (data->contains(Entity::RIDING_TAG)) + { + CompoundTag *ridingTag = data->getCompound(Entity::RIDING_TAG); + shared_ptr mount = EntityIO::newEntity(ridingTag->getString(L"id"), entity->level); + if (mount != NULL) + { + CompoundTag *mountData = new CompoundTag(); + mount->save(mountData); + + vector *ridingTags = ridingTag->getAllTags(); + for (AUTO_VAR(it, ridingTags->begin()); it != ridingTags->end(); ++it) + { + Tag *tag = *it; + mountData->put(tag->getName(), tag->copy()); + } + delete ridingTags; + mount->load(mountData); + mount->moveTo(rider->x, rider->y, rider->z, rider->yRot, rider->xRot); + + if (entity->level != NULL) entity->level->addEntity(mount); + rider->ride(mount); + } + rider = mount; + data = ridingTag; + } + + } + else if (entity->instanceof(eTYPE_LIVINGENTITY) && entity->level != NULL) + { + dynamic_pointer_cast( entity )->finalizeMobSpawn(NULL); + getLevel()->addEntity(entity); + } + + return entity; +} + +void BaseMobSpawner::delay() +{ + if (maxSpawnDelay <= minSpawnDelay) + { + spawnDelay = minSpawnDelay; + } + else + { + spawnDelay = minSpawnDelay + getLevel()->random->nextInt(maxSpawnDelay - minSpawnDelay); + } + + if ( (spawnPotentials != NULL) && (spawnPotentials->size() > 0) ) + { + setNextSpawnData( (SpawnData*) WeighedRandom::getRandomItem((Random*)getLevel()->random, (vector*)spawnPotentials) ); + } + + broadcastEvent(EVENT_SPAWN); +} + +void BaseMobSpawner::load(CompoundTag *tag) +{ + entityId = tag->getString(L"EntityId"); + spawnDelay = tag->getShort(L"Delay"); + + if (tag->contains(L"SpawnPotentials")) + { + spawnPotentials = new vector(); + ListTag *potentials = (ListTag *) tag->getList(L"SpawnPotentials"); + + for (int i = 0; i < potentials->size(); i++) + { + spawnPotentials->push_back(new SpawnData(potentials->get(i))); + } + } + else + { + spawnPotentials = NULL; + } + + if (tag->contains(L"SpawnData")) + { + setNextSpawnData(new SpawnData(tag->getCompound(L"SpawnData"), entityId)); + } + else + { + setNextSpawnData(NULL); + } + + if (tag->contains(L"MinSpawnDelay")) + { + minSpawnDelay = tag->getShort(L"MinSpawnDelay"); + maxSpawnDelay = tag->getShort(L"MaxSpawnDelay"); + spawnCount = tag->getShort(L"SpawnCount"); + } + + if (tag->contains(L"MaxNearbyEntities")) + { + maxNearbyEntities = tag->getShort(L"MaxNearbyEntities"); + requiredPlayerRange = tag->getShort(L"RequiredPlayerRange"); + } + + if (tag->contains(L"SpawnRange")) spawnRange = tag->getShort(L"SpawnRange"); + + if (getLevel() != NULL && getLevel()->isClientSide) + { + displayEntity = nullptr; + } +} + +void BaseMobSpawner::save(CompoundTag *tag) +{ + tag->putString(L"EntityId", getEntityId()); + tag->putShort(L"Delay", (short) spawnDelay); + tag->putShort(L"MinSpawnDelay", (short) minSpawnDelay); + tag->putShort(L"MaxSpawnDelay", (short) maxSpawnDelay); + tag->putShort(L"SpawnCount", (short) spawnCount); + tag->putShort(L"MaxNearbyEntities", (short) maxNearbyEntities); + tag->putShort(L"RequiredPlayerRange", (short) requiredPlayerRange); + tag->putShort(L"SpawnRange", (short) spawnRange); + + if (getNextSpawnData() != NULL) + { + tag->putCompound(L"SpawnData", (CompoundTag *) getNextSpawnData()->tag->copy()); + } + + if (getNextSpawnData() != NULL || (spawnPotentials != NULL && spawnPotentials->size() > 0)) + { + ListTag *list = new ListTag(); + + if (spawnPotentials != NULL && spawnPotentials->size() > 0) + { + for (AUTO_VAR(it, spawnPotentials->begin()); it != spawnPotentials->end(); ++it) + { + SpawnData *data = *it; + list->add(data->save()); + } + } + else + { + list->add(getNextSpawnData()->save()); + } + + tag->put(L"SpawnPotentials", list); + } +} + +shared_ptr BaseMobSpawner::getDisplayEntity() +{ + if (displayEntity == NULL) + { + shared_ptr e = EntityIO::newEntity(getEntityId(), NULL); + e = loadDataAndAddEntity(e); + displayEntity = e; + } + + return displayEntity; +} + +bool BaseMobSpawner::onEventTriggered(int id) +{ + if (id == EVENT_SPAWN && getLevel()->isClientSide) + { + spawnDelay = minSpawnDelay; + return true; + } + return false; +} + +BaseMobSpawner::SpawnData *BaseMobSpawner::getNextSpawnData() +{ + return nextSpawnData; +} + +void BaseMobSpawner::setNextSpawnData(SpawnData *nextSpawnData) +{ + this->nextSpawnData = nextSpawnData; +} + +BaseMobSpawner::SpawnData::SpawnData(CompoundTag *base) : WeighedRandomItem(base->getInt(L"Weight")) +{ + CompoundTag *tag = base->getCompound(L"Properties"); + wstring _type = base->getString(L"Type"); + + if (_type.compare(L"Minecart") == 0) + { + if (tag != NULL) + { + switch (tag->getInt(L"Type")) + { + case Minecart::TYPE_CHEST: + type = L"MinecartChest"; + break; + case Minecart::TYPE_FURNACE: + type = L"MinecartFurnace"; + break; + case Minecart::TYPE_RIDEABLE: + type = L"MinecartRideable"; + break; + } + } + else + { + type = L"MinecartRideable"; + } + } + + this->tag = tag; + this->type = _type; +} + +BaseMobSpawner::SpawnData::SpawnData(CompoundTag *tag, wstring _type) : WeighedRandomItem(1) +{ + if (_type.compare(L"Minecart") == 0) + { + if (tag != NULL) + { + switch (tag->getInt(L"Type")) + { + case Minecart::TYPE_CHEST: + _type = L"MinecartChest"; + break; + case Minecart::TYPE_FURNACE: + _type = L"MinecartFurnace"; + break; + case Minecart::TYPE_RIDEABLE: + _type = L"MinecartRideable"; + break; + } + } + else + { + _type = L"MinecartRideable"; + } + } + + this->tag = tag; + this->type = _type; +} + +BaseMobSpawner::SpawnData::~SpawnData() +{ + delete tag; +} + +CompoundTag *BaseMobSpawner::SpawnData::save() +{ + CompoundTag *result = new CompoundTag(); + + result->putCompound(L"Properties", tag); + result->putString(L"Type", type); + result->putInt(L"Weight", randomWeight); + + return result; +} \ No newline at end of file diff --git a/Minecraft.World/BaseMobSpawner.h b/Minecraft.World/BaseMobSpawner.h new file mode 100644 index 00000000..88d820e0 --- /dev/null +++ b/Minecraft.World/BaseMobSpawner.h @@ -0,0 +1,70 @@ +#pragma once + +#include "WeighedRandom.h" + +class BaseMobSpawner +{ +public: + class SpawnData : public WeighedRandomItem + { + public: + CompoundTag *tag; + wstring type; + + SpawnData(CompoundTag *base); + SpawnData(CompoundTag *tag, wstring type); + ~SpawnData(); + + virtual CompoundTag *save(); + }; + +private: + static const int EVENT_SPAWN = 1; + +public: + int spawnDelay; + +private: + wstring entityId; + vector *spawnPotentials; + SpawnData *nextSpawnData; + +public: + double spin, oSpin; + +private: + int minSpawnDelay; + int maxSpawnDelay; + int spawnCount; + shared_ptr displayEntity; + int maxNearbyEntities; + int requiredPlayerRange; + int spawnRange; + +public: + BaseMobSpawner(); + ~BaseMobSpawner(); + + virtual wstring getEntityId(); + virtual void setEntityId(const wstring &entityId); + virtual bool isNearPlayer(); + virtual void tick(); + virtual shared_ptr loadDataAndAddEntity(shared_ptr entity); + +private: + virtual void delay(); + +public: + virtual void load(CompoundTag *tag); + virtual void save(CompoundTag *tag); + virtual shared_ptr getDisplayEntity(); + virtual bool onEventTriggered(int id); + virtual SpawnData *getNextSpawnData(); + virtual void setNextSpawnData(SpawnData *nextSpawnData); + + virtual void broadcastEvent(int id) = 0; + virtual Level *getLevel() = 0; + virtual int getX() = 0; + virtual int getY() = 0; + virtual int getZ() = 0; +}; \ No newline at end of file diff --git a/Minecraft.World/BasePressurePlateTile.cpp b/Minecraft.World/BasePressurePlateTile.cpp new file mode 100644 index 00000000..128a4216 --- /dev/null +++ b/Minecraft.World/BasePressurePlateTile.cpp @@ -0,0 +1,189 @@ +#include "stdafx.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.redstone.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.phys.h" +#include "net.minecraft.h" +#include "net.minecraft.world.h" +#include "BasePressurePlateTile.h" + +BasePressurePlateTile::BasePressurePlateTile(int id, const wstring &tex, Material *material) : Tile(id, material, isSolidRender()) +{ + texture = tex; + setTicking(true); + + // 4J Stu - Move this to derived classes + //updateShape(getDataForSignal(Redstone::SIGNAL_MAX)); +} + +void BasePressurePlateTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) +{ + updateShape(level->getData(x, y, z)); +} + +void BasePressurePlateTile::updateShape(int data) +{ + bool pressed = getSignalForData(data) > Redstone::SIGNAL_NONE; + float o = 1 / 16.0f; + + if (pressed) + { + setShape(o, 0, o, 1 - o, 0.5f / 16.0f, 1 - o); + } + else + { + setShape(o, 0, o, 1 - o, 1 / 16.0f, 1 - o); + } +} + +int BasePressurePlateTile::getTickDelay(Level *level) +{ + return SharedConstants::TICKS_PER_SECOND; +} + +AABB *BasePressurePlateTile::getAABB(Level *level, int x, int y, int z) +{ + return NULL; +} + +bool BasePressurePlateTile::isSolidRender(bool isServerLevel) +{ + return false; +} + +bool BasePressurePlateTile::blocksLight() +{ + return false; +} + +bool BasePressurePlateTile::isCubeShaped() +{ + return false; +} + +bool BasePressurePlateTile::isPathfindable(LevelSource *level, int x, int y, int z) +{ + return true; +} + +bool BasePressurePlateTile::mayPlace(Level *level, int x, int y, int z) +{ + return level->isTopSolidBlocking(x, y - 1, z) || FenceTile::isFence(level->getTile(x, y - 1, z)); +} + +void BasePressurePlateTile::neighborChanged(Level *level, int x, int y, int z, int type) +{ + bool replace = false; + + if (!level->isTopSolidBlocking(x, y - 1, z) && !FenceTile::isFence(level->getTile(x, y - 1, z))) replace = true; + + if (replace) + { + spawnResources(level, x, y, z, level->getData(x, y, z), 0); + level->removeTile(x, y, z); + } +} + +void BasePressurePlateTile::tick(Level *level, int x, int y, int z, Random *random) +{ + if (level->isClientSide) return; + int signal = getSignalForData(level->getData(x, y, z)); + if (signal > Redstone::SIGNAL_NONE) checkPressed(level, x, y, z, signal); +} + +void BasePressurePlateTile::entityInside(Level *level, int x, int y, int z, shared_ptr entity) +{ + if (level->isClientSide) return; + int signal = getSignalForData(level->getData(x, y, z)); + if (signal == Redstone::SIGNAL_NONE) checkPressed(level, x, y, z, signal); +} + +void BasePressurePlateTile::checkPressed(Level *level, int x, int y, int z, int oldSignal) +{ + int signal = getSignalStrength(level, x, y, z); + bool wasPressed = oldSignal > Redstone::SIGNAL_NONE; + bool shouldBePressed = signal > Redstone::SIGNAL_NONE; + + if (oldSignal != signal) + { + level->setData(x, y, z, getDataForSignal(signal), Tile::UPDATE_CLIENTS); + updateNeighbours(level, x, y, z); + level->setTilesDirty(x, y, z, x, y, z); + } + + if (!shouldBePressed && wasPressed) + { + level->playSound(x + 0.5, y + 0.1, z + 0.5, eSoundType_RANDOM_CLICK, 0.3f, 0.5f); + } + else if (shouldBePressed && !wasPressed) + { + level->playSound(x + 0.5, y + 0.1, z + 0.5, eSoundType_RANDOM_CLICK, 0.3f, 0.6f); + } + + if (shouldBePressed) + { + level->addToTickNextTick(x, y, z, id, getTickDelay(level)); + } +} + +AABB *BasePressurePlateTile::getSensitiveAABB(int x, int y, int z) +{ + float b = 2 / 16.0f; + return AABB::newTemp(x + b, y, z + b, x + 1 - b, y + 0.25, z + 1 - b); +} + +void BasePressurePlateTile::onRemove(Level *level, int x, int y, int z, int id, int data) +{ + if (getSignalForData(data) > 0) + { + updateNeighbours(level, x, y, z); + } + + Tile::onRemove(level, x, y, z, id, data); +} + +void BasePressurePlateTile::updateNeighbours(Level *level, int x, int y, int z) +{ + level->updateNeighborsAt(x, y, z, id); + level->updateNeighborsAt(x, y - 1, z, id); +} + +int BasePressurePlateTile::getSignal(LevelSource *level, int x, int y, int z, int dir) +{ + return getSignalForData(level->getData(x, y, z)); +} + +int BasePressurePlateTile::getDirectSignal(LevelSource *level, int x, int y, int z, int dir) +{ + if (dir == Facing::UP) + { + return getSignalForData(level->getData(x, y, z)); + } + else + { + return Redstone::SIGNAL_NONE; + } +} + +bool BasePressurePlateTile::isSignalSource() +{ + return true; +} + +void BasePressurePlateTile::updateDefaultShape() +{ + float x = 8 / 16.0f; + float y = 2 / 16.0f; + float z = 8 / 16.0f; + setShape(0.5f - x, 0.5f - y, 0.5f - z, 0.5f + x, 0.5f + y, 0.5f + z); +} + +int BasePressurePlateTile::getPistonPushReaction() +{ + return Material::PUSH_DESTROY; +} + +void BasePressurePlateTile::registerIcons(IconRegister *iconRegister) +{ + icon = iconRegister->registerIcon(texture); +} \ No newline at end of file diff --git a/Minecraft.World/BasePressurePlateTile.h b/Minecraft.World/BasePressurePlateTile.h new file mode 100644 index 00000000..c0870dab --- /dev/null +++ b/Minecraft.World/BasePressurePlateTile.h @@ -0,0 +1,55 @@ +#pragma once + +#include "Tile.h" + +class BasePressurePlateTile : public Tile +{ +private: + wstring texture; + +protected: + BasePressurePlateTile(int id, const wstring &tex, Material *material); + +public: + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); + +protected: + virtual void updateShape(int data); + +public: + virtual int getTickDelay(Level *level); + virtual AABB *getAABB(Level *level, int x, int y, int z); + virtual bool isSolidRender(bool isServerLevel = false); + virtual bool blocksLight(); + virtual bool isCubeShaped(); + virtual bool isPathfindable(LevelSource *level, int x, int y, int z); + virtual bool mayPlace(Level *level, int x, int y, int z); + virtual void neighborChanged(Level *level, int x, int y, int z, int type); + virtual void tick(Level *level, int x, int y, int z, Random *random); + virtual void entityInside(Level *level, int x, int y, int z, shared_ptr entity); + +protected: + virtual void checkPressed(Level *level, int x, int y, int z, int oldSignal); + virtual AABB *getSensitiveAABB(int x, int y, int z); + +public: + virtual void onRemove(Level *level, int x, int y, int z, int id, int data); + +protected: + virtual void updateNeighbours(Level *level, int x, int y, int z); + +public: + virtual int getSignal(LevelSource *level, int x, int y, int z, int dir); + virtual int getDirectSignal(LevelSource *level, int x, int y, int z, int dir); + virtual bool isSignalSource(); + virtual void updateDefaultShape(); + virtual int getPistonPushReaction(); + +protected: + virtual int getSignalStrength(Level *level, int x, int y, int z) = 0; + virtual int getSignalForData(int data) = 0; + virtual int getDataForSignal(int signal) = 0; + +public: + virtual void registerIcons(IconRegister *iconRegister); +}; \ No newline at end of file diff --git a/Minecraft.World/BaseRailTile.cpp b/Minecraft.World/BaseRailTile.cpp new file mode 100644 index 00000000..8ec23fd6 --- /dev/null +++ b/Minecraft.World/BaseRailTile.cpp @@ -0,0 +1,511 @@ +#include "stdafx.h" +#include "net.minecraft.world.phys.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.h" +#include "BaseRailTile.h" + +BaseRailTile::Rail::Rail(Level *level, int x, int y, int z) +{ + this->level = level; + this->x = x; + this->y = y; + this->z = z; + + int id = level->getTile(x, y, z); + + // 4J Stu - We saw a random crash near the end of development on XboxOne orignal version where the id here isn't a tile any more + // Adding this check in to avoid that crash + m_bValidRail = isRail(id); + if(m_bValidRail) + { + int direction = level->getData(x, y, z); + if (((BaseRailTile *) Tile::tiles[id])->usesDataBit) + { + usesDataBit = true; + direction = direction & ~RAIL_DATA_BIT; + } + else + { + usesDataBit = false; + } + updateConnections(direction); + } +} + +BaseRailTile::Rail::~Rail() +{ + for( int i = 0; i < connections.size(); i++ ) + { + delete connections[i]; + } +} + +void BaseRailTile::Rail::updateConnections(int direction) +{ + if(m_bValidRail) + { + for( int i = 0; i < connections.size(); i++ ) + { + delete connections[i]; + } + connections.clear(); + MemSect(50); + if (direction == DIR_FLAT_Z) + { + connections.push_back(new TilePos(x, y, z - 1)); + connections.push_back(new TilePos(x, y, z + 1)); + } else if (direction == DIR_FLAT_X) + { + connections.push_back(new TilePos(x - 1, y, z)); + connections.push_back(new TilePos(x + 1, y, z)); + } else if (direction == 2) + { + connections.push_back(new TilePos(x - 1, y, z)); + connections.push_back(new TilePos(x + 1, y + 1, z)); + } else if (direction == 3) + { + connections.push_back(new TilePos(x - 1, y + 1, z)); + connections.push_back(new TilePos(x + 1, y, z)); + } else if (direction == 4) + { + connections.push_back(new TilePos(x, y + 1, z - 1)); + connections.push_back(new TilePos(x, y, z + 1)); + } else if (direction == 5) + { + connections.push_back(new TilePos(x, y, z - 1)); + connections.push_back(new TilePos(x, y + 1, z + 1)); + } else if (direction == 6) + { + connections.push_back(new TilePos(x + 1, y, z)); + connections.push_back(new TilePos(x, y, z + 1)); + } else if (direction == 7) + { + connections.push_back(new TilePos(x - 1, y, z)); + connections.push_back(new TilePos(x, y, z + 1)); + } else if (direction == 8) + { + connections.push_back(new TilePos(x - 1, y, z)); + connections.push_back(new TilePos(x, y, z - 1)); + } else if (direction == 9) + { + connections.push_back(new TilePos(x + 1, y, z)); + connections.push_back(new TilePos(x, y, z - 1)); + } + MemSect(0); + } +} + +void BaseRailTile::Rail::removeSoftConnections() +{ + if(m_bValidRail) + { + for (unsigned int i = 0; i < connections.size(); i++) + { + Rail *rail = getRail(connections[i]); + if (rail == NULL || !rail->connectsTo(this)) + { + delete connections[i]; + connections.erase(connections.begin()+i); + i--; + } else + { + delete connections[i]; + MemSect(50); + connections[i] =new TilePos(rail->x, rail->y, rail->z); + MemSect(0); + } + delete rail; + } + } +} + +bool BaseRailTile::Rail::hasRail(int x, int y, int z) +{ + if(!m_bValidRail) return false; + if (isRail(level, x, y, z)) return true; + if (isRail(level, x, y + 1, z)) return true; + if (isRail(level, x, y - 1, z)) return true; + return false; +} + +BaseRailTile::Rail *BaseRailTile::Rail::getRail(TilePos *p) +{ + if(!m_bValidRail) return NULL; + if (isRail(level, p->x, p->y, p->z)) return new Rail(level, p->x, p->y, p->z); + if (isRail(level, p->x, p->y + 1, p->z)) return new Rail(level, p->x, p->y + 1, p->z); + if (isRail(level, p->x, p->y - 1, p->z)) return new Rail(level, p->x, p->y - 1, p->z); + return NULL; +} + + +bool BaseRailTile::Rail::connectsTo(Rail *rail) +{ + if(m_bValidRail) + { + AUTO_VAR(itEnd, connections.end()); + for (AUTO_VAR(it, connections.begin()); it != itEnd; it++) + { + TilePos *p = *it; //connections[i]; + if (p->x == rail->x && p->z == rail->z) + { + return true; + } + } + } + return false; +} + +bool BaseRailTile::Rail::hasConnection(int x, int y, int z) +{ + if(m_bValidRail) + { + AUTO_VAR(itEnd, connections.end()); + for (AUTO_VAR(it, connections.begin()); it != itEnd; it++) + { + TilePos *p = *it; //connections[i]; + if (p->x == x && p->z == z) + { + return true; + } + } + } + return false; +} + + +int BaseRailTile::Rail::countPotentialConnections() +{ + int count = 0; + + if(m_bValidRail) + { + if (hasRail(x, y, z - 1)) count++; + if (hasRail(x, y, z + 1)) count++; + if (hasRail(x - 1, y, z)) count++; + if (hasRail(x + 1, y, z)) count++; + } + + return count; +} + +bool BaseRailTile::Rail::canConnectTo(Rail *rail) +{ + if(!m_bValidRail) return false; + if (connectsTo(rail)) return true; + if (connections.size() == 2) + { + return false; + } + if (connections.empty()) + { + return true; + } + + return true; +} + +void BaseRailTile::Rail::connectTo(Rail *rail) +{ + if(m_bValidRail) + { + MemSect(50); + connections.push_back(new TilePos(rail->x, rail->y, rail->z)); + MemSect(0); + + bool n = hasConnection(x, y, z - 1); + bool s = hasConnection(x, y, z + 1); + bool w = hasConnection(x - 1, y, z); + bool e = hasConnection(x + 1, y, z); + + int dir = -1; + + if (n || s) dir = DIR_FLAT_Z; + if (w || e) dir = DIR_FLAT_X; + + if (!usesDataBit) + { + if (s && e && !n && !w) dir = 6; + if (s && w && !n && !e) dir = 7; + if (n && w && !s && !e) dir = 8; + if (n && e && !s && !w) dir = 9; + } + if (dir == DIR_FLAT_Z) + { + if (isRail(level, x, y + 1, z - 1)) dir = 4; + if (isRail(level, x, y + 1, z + 1)) dir = 5; + } + if (dir == DIR_FLAT_X) + { + if (isRail(level, x + 1, y + 1, z)) dir = 2; + if (isRail(level, x - 1, y + 1, z)) dir = 3; + } + + if (dir < 0) dir = DIR_FLAT_Z; + + int data = dir; + if (usesDataBit) + { + data = (level->getData(x, y, z) & RAIL_DATA_BIT) | dir; + } + + level->setData(x, y, z, data, Tile::UPDATE_ALL); + } +} + +bool BaseRailTile::Rail::hasNeighborRail(int x, int y, int z) +{ + if(!m_bValidRail) return false; + TilePos tp(x,y,z); + Rail *neighbor = getRail( &tp ); + if (neighbor == NULL) return false; + neighbor->removeSoftConnections(); + bool retval = neighbor->canConnectTo(this); + delete neighbor; + return retval; +} + +void BaseRailTile::Rail::place(bool hasSignal, bool first) +{ + if(m_bValidRail) + { + bool n = hasNeighborRail(x, y, z - 1); + bool s = hasNeighborRail(x, y, z + 1); + bool w = hasNeighborRail(x - 1, y, z); + bool e = hasNeighborRail(x + 1, y, z); + + int dir = -1; + + if ((n || s) && !w && !e) dir = DIR_FLAT_Z; + if ((w || e) && !n && !s) dir = DIR_FLAT_X; + + if (!usesDataBit) + { + if (s && e && !n && !w) dir = 6; + if (s && w && !n && !e) dir = 7; + if (n && w && !s && !e) dir = 8; + if (n && e && !s && !w) dir = 9; + } + if (dir == -1) + { + if (n || s) dir = DIR_FLAT_Z; + if (w || e) dir = DIR_FLAT_X; + + if (!usesDataBit) + { + if (hasSignal) + { + if (s && e) dir = 6; + if (w && s) dir = 7; + if (e && n) dir = 9; + if (n && w) dir = 8; + } else { + if (n && w) dir = 8; + if (e && n) dir = 9; + if (w && s) dir = 7; + if (s && e) dir = 6; + } + } + } + + if (dir == DIR_FLAT_Z) + { + if (isRail(level, x, y + 1, z - 1)) dir = 4; + if (isRail(level, x, y + 1, z + 1)) dir = 5; + } + if (dir == DIR_FLAT_X) + { + if (isRail(level, x + 1, y + 1, z)) dir = 2; + if (isRail(level, x - 1, y + 1, z)) dir = 3; + } + + if (dir < 0) dir = DIR_FLAT_Z; + + updateConnections(dir); + + int data = dir; + if (usesDataBit) + { + data = (level->getData(x, y, z) & RAIL_DATA_BIT) | dir; + } + + if (first || level->getData(x, y, z) != data) + { + level->setData(x, y, z, data, Tile::UPDATE_ALL); + + AUTO_VAR(itEnd, connections.end()); + for (AUTO_VAR(it, connections.begin()); it != itEnd; it++) + { + Rail *neighbor = getRail(*it); + if (neighbor == NULL) continue; + neighbor->removeSoftConnections(); + + if (neighbor->canConnectTo(this)) + { + neighbor->connectTo(this); + } + delete neighbor; + } + } + } +} + +bool BaseRailTile::isRail(Level *level, int x, int y, int z) +{ + return isRail(level->getTile(x, y, z)); +} + +bool BaseRailTile::isRail(int id) +{ + return id == Tile::rail_Id || id == Tile::goldenRail_Id || id == Tile::detectorRail_Id || id == Tile::activatorRail_Id; +} + +BaseRailTile::BaseRailTile(int id, bool usesDataBit) : Tile(id, Material::decoration, isSolidRender()) +{ + this->usesDataBit = usesDataBit; + setShape(0, 0, 0, 1, 2 / 16.0f, 1); + + iconTurn = NULL; +} + +bool BaseRailTile::isUsesDataBit() +{ + return usesDataBit; +} + +AABB *BaseRailTile::getAABB(Level *level, int x, int y, int z) +{ + return NULL; +} + +bool BaseRailTile::blocksLight() +{ + return false; +} + +bool BaseRailTile::isSolidRender(bool isServerLevel) +{ + return false; +} + +HitResult *BaseRailTile::clip(Level *level, int xt, int yt, int zt, Vec3 *a, Vec3 *b) +{ + updateShape(level, xt, yt, zt); + return Tile::clip(level, xt, yt, zt, a, b); +} + +void BaseRailTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param +{ + int data = level->getData(x, y, z); + if (data >= 2 && data <= 5) + { + setShape(0, 0, 0, 1, 2 / 16.0f + 0.5f, 1); + } else + { + setShape(0, 0, 0, 1, 2 / 16.0f, 1); + } +} + +bool BaseRailTile::isCubeShaped() +{ + return false; +} + +int BaseRailTile::getRenderShape() +{ + return Tile::SHAPE_RAIL; +} + +int BaseRailTile::getResourceCount(Random random) +{ + return 1; +} + +bool BaseRailTile::mayPlace(Level *level, int x, int y, int z) +{ + if (level->isTopSolidBlocking(x, y - 1, z)) + { + return true; + } + return false; +} + +void BaseRailTile::onPlace(Level *level, int x, int y, int z) +{ + if (!level->isClientSide) + { + updateDir(level, x, y, z, true); + + if (usesDataBit) + { + neighborChanged(level, x, y, z, id); + } + } +} + +void BaseRailTile::neighborChanged(Level *level, int x, int y, int z, int type) +{ + if (level->isClientSide) return; + + int data = level->getData(x, y, z); + int dir = data; + if (usesDataBit) { + dir = dir & RAIL_DIRECTION_MASK; + } + bool remove = false; + + if (!level->isTopSolidBlocking(x, y - 1, z)) remove = true; + if (dir == 2 && !level->isTopSolidBlocking(x + 1, y, z)) remove = true; + if (dir == 3 && !level->isTopSolidBlocking(x - 1, y, z)) remove = true; + if (dir == 4 && !level->isTopSolidBlocking(x, y, z - 1)) remove = true; + if (dir == 5 && !level->isTopSolidBlocking(x, y, z + 1)) remove = true; + + if (remove) + { + spawnResources(level, x, y, z, level->getData(x, y, z), 0); + level->removeTile(x, y, z); + } + else + { + updateState(level, x, y, z, data, dir, type); + } + +} + +void BaseRailTile::updateState(Level *level, int x, int y, int z, int data, int dir, int type) +{ +} + +void BaseRailTile::updateDir(Level *level, int x, int y, int z, bool first) +{ + if (level->isClientSide) return; + Rail *rail = new Rail(level, x, y, z); + rail->place(level->hasNeighborSignal(x, y, z), first); + delete rail; +} + +int BaseRailTile::getPistonPushReaction() +{ + // override the decoration material's reaction + return Material::PUSH_NORMAL; +} + +void BaseRailTile::onRemove(Level *level, int x, int y, int z, int id, int data) +{ + int dir = data; + if (usesDataBit) + { + dir &= RAIL_DIRECTION_MASK; + } + + Tile::onRemove(level, x, y, z, id, data); + + if (dir == 2 || dir == 3 || dir == 4 || dir == 5) + { + level->updateNeighborsAt(x, y + 1, z, id); + } + if (usesDataBit) + { + level->updateNeighborsAt(x, y, z, id); + level->updateNeighborsAt(x, y - 1, z, id); + } +} \ No newline at end of file diff --git a/Minecraft.World/BaseRailTile.h b/Minecraft.World/BaseRailTile.h new file mode 100644 index 00000000..105ddfde --- /dev/null +++ b/Minecraft.World/BaseRailTile.h @@ -0,0 +1,89 @@ +#pragma once +#include "Tile.h" +#include "TilePos.h" +#include "Definitions.h" + +class Random; +class HitResult; +class ChunkRebuildData; + +using namespace std; + +class BaseRailTile : public Tile +{ + friend class Tile; + friend class ChunkRebuildData; +public: + static const int DIR_FLAT_Z = 0; + static const int DIR_FLAT_X = 1; + // the data bit is used by boosters and detectors, so they can't turn + static const int RAIL_DATA_BIT = 8; + static const int RAIL_DIRECTION_MASK = 7; + +private: + Icon *iconTurn; + +protected: + bool usesDataBit; + + class Rail + { + friend class BaseRailTile; + friend class RailTile; + private: + Level *level; + int x, y, z; + bool usesDataBit; + vector connections; + bool m_bValidRail; // 4J added + + public: + Rail(Level *level, int x, int y, int z); + ~Rail(); + private: + void updateConnections(int direction); + void removeSoftConnections(); + bool hasRail(int x, int y, int z); + Rail *getRail(TilePos *p); + bool connectsTo(Rail *rail); + bool hasConnection(int x, int y, int z); + + protected: + int countPotentialConnections(); + + private: + bool canConnectTo(Rail *rail); + void connectTo(Rail *rail); + bool hasNeighborRail(int x, int y, int z); + public: + void place(bool hasSignal, bool first); + }; +public: + static bool isRail(Level *level, int x, int y, int z); + static bool isRail(int id); +protected: + BaseRailTile(int id, bool usesDataBit); +public: + using Tile::getResourceCount; + + bool isUsesDataBit(); + virtual AABB *getAABB(Level *level, int x, int y, int z); + virtual bool blocksLight(); + virtual bool isSolidRender(bool isServerLevel = false); + virtual HitResult *clip(Level *level, int xt, int yt, int zt, Vec3 *a, Vec3 *b); + virtual void updateShape(LevelSource *level, int x, int y, int z, int forceData = -1, shared_ptr forceEntity = shared_ptr()); // 4J added forceData, forceEntity param + virtual bool isCubeShaped(); + virtual int getRenderShape(); + virtual int getResourceCount(Random random); + virtual bool mayPlace(Level *level, int x, int y, int z); + virtual void onPlace(Level *level, int x, int y, int z); + virtual void neighborChanged(Level *level, int x, int y, int z, int type); + +protected: + virtual void updateState(Level *level, int x, int y, int z, int data, int dir, int type); + virtual void updateDir(Level *level, int x, int y, int z, bool first); + +public: + int getPistonPushReaction(); + void onRemove(Level *level, int x, int y, int z, int id, int data); +}; diff --git a/Minecraft.World/BasicTypeContainers.cpp b/Minecraft.World/BasicTypeContainers.cpp index ea9839c6..9ecc865c 100644 --- a/Minecraft.World/BasicTypeContainers.cpp +++ b/Minecraft.World/BasicTypeContainers.cpp @@ -14,6 +14,8 @@ const float Float::MAX_VALUE = FLT_MAX; const double Double::MAX_VALUE = DBL_MAX; +const double Double::MIN_NORMAL = DBL_MIN; + int Integer::parseInt(wstring &str, int radix /* = 10*/) { return wcstol( str.c_str(), NULL, radix ); diff --git a/Minecraft.World/BasicTypeContainers.h b/Minecraft.World/BasicTypeContainers.h index 094e9616..5f577a97 100644 --- a/Minecraft.World/BasicTypeContainers.h +++ b/Minecraft.World/BasicTypeContainers.h @@ -47,6 +47,7 @@ class Double { public: static const double MAX_VALUE; + static const double MIN_NORMAL; static bool isNaN( double a ) { #ifdef __PS3__ diff --git a/Minecraft.World/Bat.cpp b/Minecraft.World/Bat.cpp new file mode 100644 index 00000000..d3bd3521 --- /dev/null +++ b/Minecraft.World/Bat.cpp @@ -0,0 +1,258 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.monster.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.phys.h" +#include "Bat.h" + +Bat::Bat(Level *level) : AmbientCreature(level) +{ + // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that + // the derived version of the function is called + this->defineSynchedData(); + registerAttributes(); + setHealth(getMaxHealth()); + + targetPosition = NULL; + + setSize(.5f, .9f); + setResting(true); +} + +void Bat::defineSynchedData() +{ + AmbientCreature::defineSynchedData(); + + entityData->define(DATA_ID_FLAGS, (char) 0); +} + +float Bat::getSoundVolume() +{ + return 0.1f; +} + +float Bat::getVoicePitch() +{ + return AmbientCreature::getVoicePitch() * .95f; +} + +int Bat::getAmbientSound() +{ + if (isResting() && random->nextInt(4) != 0) + { + return -1; + } + return eSoundType_MOB_BAT_IDLE; //"mob.bat.idle"; +} + +int Bat::getHurtSound() +{ + return eSoundType_MOB_BAT_HURT; //"mob.bat.hurt"; +} + +int Bat::getDeathSound() +{ + return eSoundType_MOB_BAT_DEATH; //"mob.bat.death"; +} + +bool Bat::isPushable() +{ + // bats can't be pushed by other mobs + return false; +} + +void Bat::doPush(shared_ptr e) +{ + // bats don't push other mobs +} + +void Bat::pushEntities() +{ + // bats don't push other mobs +} + +void Bat::registerAttributes() +{ + AmbientCreature::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(6); +} + +bool Bat::isResting() +{ + return (entityData->getByte(DATA_ID_FLAGS) & FLAG_RESTING) != 0; +} + +void Bat::setResting(bool value) +{ + char current = entityData->getByte(DATA_ID_FLAGS); + if (value) + { + entityData->set(DATA_ID_FLAGS, (char) (current | FLAG_RESTING)); + } + else + { + entityData->set(DATA_ID_FLAGS, (char) (current & ~FLAG_RESTING)); + } +} + +bool Bat::useNewAi() +{ + return true; +} + +void Bat::tick() +{ + + AmbientCreature::tick(); + + if (isResting()) + { + xd = yd = zd = 0; + y = Mth::floor(y) + 1.0 - bbHeight; + } + else + { + yd *= .6f; + } + +} + +inline int signum(double x) { return (x > 0) - (x < 0); } + +void Bat::newServerAiStep() +{ + AmbientCreature::newServerAiStep(); + + if (isResting()) + { + if (!level->isSolidBlockingTile(Mth::floor(x), (int) y + 1, Mth::floor(z))) + { + setResting(false); + level->levelEvent(nullptr, LevelEvent::SOUND_BAT_LIFTOFF, (int) x, (int) y, (int) z, 0); + } + else + { + + if (random->nextInt(200) == 0) + { + yHeadRot = random->nextInt(360); + } + + if (level->getNearestPlayer(shared_from_this(), 4.0f) != NULL) + { + setResting(false); + level->levelEvent(nullptr, LevelEvent::SOUND_BAT_LIFTOFF, (int) x, (int) y, (int) z, 0); + } + } + } + else + { + + if (targetPosition != NULL && (!level->isEmptyTile(targetPosition->x, targetPosition->y, targetPosition->z) || targetPosition->y < 1)) + { + delete targetPosition; + targetPosition = NULL; + } + if (targetPosition == NULL || random->nextInt(30) == 0 || targetPosition->distSqr((int) x, (int) y, (int) z) < 4) + { + delete targetPosition; + targetPosition = new Pos((int) x + random->nextInt(7) - random->nextInt(7), (int) y + random->nextInt(6) - 2, (int) z + random->nextInt(7) - random->nextInt(7)); + } + + double dx = (targetPosition->x + .5) - x; + double dy = (targetPosition->y + .1) - y; + double dz = (targetPosition->z + .5) - z; + + xd = xd + (signum(dx) * .5f - xd) * .1f; + yd = yd + (signum(dy) * .7f - yd) * .1f; + zd = zd + (signum(dz) * .5f - zd) * .1f; + + float yRotD = (float) (atan2(zd, xd) * 180 / PI) - 90; + float rotDiff = Mth::wrapDegrees(yRotD - yRot); + yya = .5f; + yRot += rotDiff; + + if (random->nextInt(100) == 0 && level->isSolidBlockingTile(Mth::floor(x), (int) y + 1, Mth::floor(z))) + { + setResting(true); + } + + } +} + +bool Bat::makeStepSound() +{ + return false; +} + +void Bat::causeFallDamage(float distance) +{ +} + +void Bat::checkFallDamage(double ya, bool onGround) +{ + // this method is empty because flying creatures should + // not trigger the "fallOn" tile calls (such as trampling crops) +} + +bool Bat::isIgnoringTileTriggers() +{ + return true; +} + +bool Bat::hurt(DamageSource *source, float dmg) +{ + if (isInvulnerable()) return false; + if (!level->isClientSide) + { + if (isResting()) + { + setResting(false); + } + } + + return AmbientCreature::hurt(source, dmg); +} + +void Bat::readAdditionalSaveData(CompoundTag *tag) +{ + AmbientCreature::readAdditionalSaveData(tag); + + entityData->set(DATA_ID_FLAGS, tag->getByte(L"BatFlags")); +} + +void Bat::addAdditonalSaveData(CompoundTag *entityTag) +{ + AmbientCreature::addAdditonalSaveData(entityTag); + + entityTag->putByte(L"BatFlags", entityData->getByte(DATA_ID_FLAGS)); +} + + +bool Bat::canSpawn() +{ + int yt = Mth::floor(bb->y0); + if (yt >= level->seaLevel) return false; + + int xt = Mth::floor(x); + int zt = Mth::floor(z); + + int br = level->getRawBrightness(xt, yt, zt); + int maxLight = 4; + + if ((Calendar::GetDayOfMonth() + 1 == 10 && Calendar::GetDayOfMonth() >= 20) || (Calendar::GetMonth() + 1 == 11 && Calendar::GetMonth() <= 3)) + { + maxLight = 7; + } + else if (random->nextBoolean()) + { + return false; + } + + if (br > random->nextInt(maxLight)) return false; + + return AmbientCreature::canSpawn(); +} \ No newline at end of file diff --git a/Minecraft.World/Bat.h b/Minecraft.World/Bat.h new file mode 100644 index 00000000..118fc6ed --- /dev/null +++ b/Minecraft.World/Bat.h @@ -0,0 +1,58 @@ +#pragma once + +#include "AmbientCreature.h" + +class Bat : public AmbientCreature +{ +public: + eINSTANCEOF GetType() { return eTYPE_BAT; } + static Entity *create(Level *level) { return new Bat(level); } + +private: + static const int DATA_ID_FLAGS = 16; + static const int FLAG_RESTING = 1; + + Pos *targetPosition; + +public: + Bat(Level *level); + +protected: + virtual void defineSynchedData(); + virtual float getSoundVolume(); + virtual float getVoicePitch(); + virtual int getAmbientSound(); + virtual int getHurtSound(); + virtual int getDeathSound(); + +public: + virtual bool isPushable(); + +protected: + virtual void doPush(shared_ptr e); + virtual void pushEntities(); + virtual void registerAttributes(); + +public: + virtual bool isResting(); + virtual void setResting(bool value); + +protected: + virtual bool useNewAi(); + +public: + virtual void tick(); + +protected: + virtual void newServerAiStep(); + virtual bool makeStepSound(); + virtual void causeFallDamage(float distance); + virtual void checkFallDamage(double ya, bool onGround); + virtual bool isIgnoringTileTriggers(); + +public: + virtual bool hurt(DamageSource *source, float dmg); + virtual void readAdditionalSaveData(CompoundTag *tag); + virtual void addAdditonalSaveData(CompoundTag *entityTag); + virtual bool canSpawn(); +}; \ No newline at end of file diff --git a/Minecraft.World/BeachBiome.cpp b/Minecraft.World/BeachBiome.cpp index ba85908a..50e7cc1c 100644 --- a/Minecraft.World/BeachBiome.cpp +++ b/Minecraft.World/BeachBiome.cpp @@ -8,8 +8,8 @@ BeachBiome::BeachBiome(int id) : Biome(id) // remove default mob spawn settings friendlies.clear(); friendlies_chicken.clear(); // 4J added - this->topMaterial = (byte) Tile::sand_Id; - this->material = (byte) Tile::sand_Id; + topMaterial = (byte) Tile::sand_Id; + material = (byte) Tile::sand_Id; decorator->treeCount = -999; decorator->deadBushCount = 0; diff --git a/Minecraft.World/BeaconMenu.cpp b/Minecraft.World/BeaconMenu.cpp new file mode 100644 index 00000000..707e9ebf --- /dev/null +++ b/Minecraft.World/BeaconMenu.cpp @@ -0,0 +1,140 @@ +#include "stdafx.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.level.tile.entity.h" +#include "BeaconMenu.h" + +BeaconMenu::BeaconMenu(shared_ptr inventory, shared_ptr beacon) +{ + this->beacon = beacon; + + addSlot(paymentSlot = new BeaconMenu::PaymentSlot(beacon, PAYMENT_SLOT, 136, 110)); + + int xo = 36; + int yo = 137; + + for (int y = 0; y < 3; y++) + { + for (int x = 0; x < 9; x++) + { + addSlot(new Slot(inventory, x + y * 9 + 9, xo + x * 18, yo + y * 18)); + } + } + for (int x = 0; x < 9; x++) + { + addSlot(new Slot(inventory, x, xo + x * 18, 58 + yo)); + } + + levels = beacon->getLevels(); + primaryPower = beacon->getPrimaryPower(); + secondaryPower = beacon->getSecondaryPower(); +} + + +void BeaconMenu::addSlotListener(ContainerListener *listener) +{ + AbstractContainerMenu::addSlotListener(listener); + + listener->setContainerData(this, 0, levels); + listener->setContainerData(this, 1, primaryPower); + listener->setContainerData(this, 2, secondaryPower); +} + +void BeaconMenu::setData(int id, int value) +{ + if (id == 0) beacon->setLevels(value); + if (id == 1) beacon->setPrimaryPower(value); + if (id == 2) beacon->setSecondaryPower(value); +} + +shared_ptr BeaconMenu::getBeacon() +{ + return beacon; +} + +bool BeaconMenu::stillValid(shared_ptr player) +{ + return beacon->stillValid(player); +} + +shared_ptr BeaconMenu::quickMoveStack(shared_ptr player, int slotIndex) +{ + shared_ptr clicked = nullptr; + Slot *slot = slots.at(slotIndex); + if (slot != NULL && slot->hasItem()) + { + shared_ptr stack = slot->getItem(); + clicked = stack->copy(); + + if (slotIndex == PAYMENT_SLOT) + { + if (!moveItemStackTo(stack, INV_SLOT_START, USE_ROW_SLOT_END, true)) + { + return nullptr; + } + slot->onQuickCraft(stack, clicked); + } + else if (!paymentSlot->hasItem() && paymentSlot->mayPlace(stack) && stack->count == 1) + { + if (!moveItemStackTo(stack, PAYMENT_SLOT, PAYMENT_SLOT + 1, false)) + { + return nullptr; + } + } + else if (slotIndex >= INV_SLOT_START && slotIndex < INV_SLOT_END) + { + if (!moveItemStackTo(stack, USE_ROW_SLOT_START, USE_ROW_SLOT_END, false)) + { + return nullptr; + } + } + else if (slotIndex >= USE_ROW_SLOT_START && slotIndex < USE_ROW_SLOT_END) + { + if (!moveItemStackTo(stack, INV_SLOT_START, INV_SLOT_END, false)) + { + return nullptr; + } + } + else + { + if (!moveItemStackTo(stack, INV_SLOT_START, USE_ROW_SLOT_END, false)) + { + return nullptr; + } + } + if (stack->count == 0) + { + slot->set(nullptr); + } + else + { + slot->setChanged(); + } + if (stack->count == clicked->count) + { + return nullptr; + } + else + { + slot->onTake(player, stack); + } + } + return clicked; +} + +BeaconMenu::PaymentSlot::PaymentSlot(shared_ptr container, int slot, int x, int y) : Slot(container, slot, x, y) +{ +} + +bool BeaconMenu::PaymentSlot::mayPlace(shared_ptr item) +{ + if (item != NULL) + { + return (item->id == Item::emerald_Id || item->id == Item::diamond_Id || item->id == Item::goldIngot_Id || item->id == Item::ironIngot_Id); + } + return false; +} + +int BeaconMenu::PaymentSlot::getMaxStackSize() +{ + return 1; +} \ No newline at end of file diff --git a/Minecraft.World/BeaconMenu.h b/Minecraft.World/BeaconMenu.h new file mode 100644 index 00000000..8d3afba6 --- /dev/null +++ b/Minecraft.World/BeaconMenu.h @@ -0,0 +1,44 @@ +#pragma once + +#include "AbstractContainerMenu.h" +#include "Slot.h" + +class BeaconTileEntity; + +class BeaconMenu : public AbstractContainerMenu +{ +private: + class PaymentSlot : public Slot + { + public: + PaymentSlot(shared_ptr container, int slot, int x, int y); + + bool mayPlace(shared_ptr item); + int getMaxStackSize(); + }; + +public: + static const int PAYMENT_SLOT = 0; + static const int INV_SLOT_START = PAYMENT_SLOT + 1; + static const int INV_SLOT_END = INV_SLOT_START + 9 * 3; + static const int USE_ROW_SLOT_START = INV_SLOT_END; + static const int USE_ROW_SLOT_END = USE_ROW_SLOT_START + 9; + +private: + shared_ptr beacon; + PaymentSlot *paymentSlot; + + // copied values because container/client system is retarded + int levels; + int primaryPower; + int secondaryPower; + +public: + BeaconMenu(shared_ptr inventory, shared_ptr beacon); + + void addSlotListener(ContainerListener *listener); + void setData(int id, int value); + shared_ptr getBeacon(); + bool stillValid(shared_ptr player); + shared_ptr quickMoveStack(shared_ptr player, int slotIndex); +}; \ No newline at end of file diff --git a/Minecraft.World/BeaconTile.cpp b/Minecraft.World/BeaconTile.cpp new file mode 100644 index 00000000..f002cbe2 --- /dev/null +++ b/Minecraft.World/BeaconTile.cpp @@ -0,0 +1,64 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.entity.h" +#include "BeaconTile.h" + +BeaconTile::BeaconTile(int id) : BaseEntityTile(id, Material::glass, isSolidRender()) +{ + setDestroyTime(3.0f); +} + +shared_ptr BeaconTile::newTileEntity(Level *level) +{ + return shared_ptr( new BeaconTileEntity() ); +} + +bool BeaconTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly) +{ + if (level->isClientSide) return true; + + shared_ptr beacon = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + if (beacon != NULL) player->openBeacon(beacon); + + return true; +} + +bool BeaconTile::isSolidRender(bool isServerLevel) +{ + return false; +} + +bool BeaconTile::isCubeShaped() +{ + return false; +} + +bool BeaconTile::blocksLight() +{ + return false; +} + +int BeaconTile::getRenderShape() +{ + return SHAPE_BEACON; +} + +void BeaconTile::registerIcons(IconRegister *iconRegister) +{ + BaseEntityTile::registerIcons(iconRegister); +} + +void BeaconTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance) +{ + BaseEntityTile::setPlacedBy(level, x, y, z, by, itemInstance); + if (itemInstance->hasCustomHoverName()) + { + dynamic_pointer_cast( level->getTileEntity(x, y, z))->setCustomName(itemInstance->getHoverName()); + } +} + +bool BeaconTile::TestUse() +{ + return true; +} \ No newline at end of file diff --git a/Minecraft.World/BeaconTile.h b/Minecraft.World/BeaconTile.h new file mode 100644 index 00000000..d213fa3d --- /dev/null +++ b/Minecraft.World/BeaconTile.h @@ -0,0 +1,19 @@ +#pragma once + +#include "BaseEntityTile.h" + +class BeaconTile : public BaseEntityTile +{ +public: + BeaconTile(int id); + + shared_ptr newTileEntity(Level *level); + bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); + bool isSolidRender(bool isServerLevel = false); + bool isCubeShaped(); + bool blocksLight(); + int getRenderShape(); + void registerIcons(IconRegister *iconRegister); + void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance); + virtual bool TestUse(); +}; \ No newline at end of file diff --git a/Minecraft.World/BeaconTileEntity.cpp b/Minecraft.World/BeaconTileEntity.cpp new file mode 100644 index 00000000..4b9a3882 --- /dev/null +++ b/Minecraft.World/BeaconTileEntity.cpp @@ -0,0 +1,372 @@ +#include "stdafx.h" +#include "net.minecraft.network.packet.h" +#include "net.minecraft.world.effect.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.phys.h" +#include "BeaconTileEntity.h" + +shared_ptr BeaconTileEntity::clone() +{ + shared_ptr result = shared_ptr( new BeaconTileEntity() ); + TileEntity::clone(result); + + result->primaryPower = primaryPower; + result->secondaryPower = secondaryPower; + result->levels = levels; + + return result; +} + +MobEffect *BeaconTileEntity::BEACON_EFFECTS[BeaconTileEntity::BEACON_EFFECTS_TIERS][BeaconTileEntity::BEACON_EFFECTS_EFFECTS]; + +void BeaconTileEntity::staticCtor() +{ + for(unsigned int tier = 0; tier < BEACON_EFFECTS_TIERS; ++tier) + { + for(unsigned int effect = 0; effect < BEACON_EFFECTS_EFFECTS; ++effect) + { + BEACON_EFFECTS[tier][effect] = NULL; + } + } + BEACON_EFFECTS[0][0] = MobEffect::movementSpeed; + BEACON_EFFECTS[0][1] = MobEffect::digSpeed; + BEACON_EFFECTS[1][0] = MobEffect::damageResistance; + BEACON_EFFECTS[1][1] = MobEffect::jump; + BEACON_EFFECTS[2][0] = MobEffect::damageBoost; + BEACON_EFFECTS[3][0] = MobEffect::regeneration; +} + +BeaconTileEntity::BeaconTileEntity() +{ + clientSideRenderTick = 0; + clientSideRenderScale = 0.0f; + + isActive = false; + levels = -1; + + primaryPower = 0; + secondaryPower = 0; + + paymentItem = nullptr; + name = L""; +} + +void BeaconTileEntity::tick() +{ + // 4J Stu - Added levels check to force an initial tick + if ( (!level->isClientSide && levels < 0) || (level->getGameTime() % (SharedConstants::TICKS_PER_SECOND * 4)) == 0) + { + updateShape(); + applyEffects(); + } + +} + +void BeaconTileEntity::applyEffects() +{ + if (isActive && levels > 0 && !level->isClientSide && primaryPower > 0) + { + + double range = (levels * 10) + 10; + int baseAmp = 0; + if (levels >= 4 && primaryPower == secondaryPower) + { + baseAmp = 1; + } + + AABB *bb = AABB::newTemp(x, y, z, x + 1, y + 1, z + 1)->grow(range, range, range); + bb->y1 = level->getMaxBuildHeight(); + vector > *players = level->getEntitiesOfClass(typeid(Player), bb); + for (AUTO_VAR(it,players->begin()); it != players->end(); ++it) + { + shared_ptr player = dynamic_pointer_cast(*it); + player->addEffect(new MobEffectInstance(primaryPower, SharedConstants::TICKS_PER_SECOND * 9, baseAmp, true)); + } + + if (levels >= 4 && primaryPower != secondaryPower && secondaryPower > 0) + { + for (AUTO_VAR(it,players->begin()); it != players->end(); ++it) + { + shared_ptr player = dynamic_pointer_cast(*it); + player->addEffect(new MobEffectInstance(secondaryPower, SharedConstants::TICKS_PER_SECOND * 9, 0, true)); + } + } + delete players; + } +} + +void BeaconTileEntity::updateShape() +{ + + if (!level->canSeeSky(x, y + 1, z)) + { + isActive = false; + levels = 0; + } + else + { + isActive = true; + + levels = 0; + for (int step = 1; step <= 4; step++) + { + + int ly = y - step; + if (ly < 0) + { + break; + } + + bool isOk = true; + for (int lx = x - step; lx <= x + step && isOk; lx++) + { + for (int lz = z - step; lz <= z + step; lz++) + { + int tile = level->getTile(lx, ly, lz); + if (tile != Tile::emeraldBlock_Id && tile != Tile::goldBlock_Id && tile != Tile::diamondBlock_Id && tile != Tile::ironBlock_Id) + { + isOk = false; + break; + } + } + } + if (isOk) + { + levels = step; + } + else + { + break; + } + } + if (levels == 0) + { + isActive = false; + } + } + +} + +float BeaconTileEntity::getAndUpdateClientSideScale() +{ + + if (!isActive) + { + return 0; + } + + int renderDelta = (int) (level->getGameTime() - clientSideRenderTick); + clientSideRenderTick = level->getGameTime(); + if (renderDelta > 1) + { + clientSideRenderScale -= ((float) renderDelta / (float) SCALE_TIME); + + if (clientSideRenderScale < 0) + { + clientSideRenderScale = 0; + } + } + clientSideRenderScale += (1.0f / (float) SCALE_TIME); + if (clientSideRenderScale > 1) + { + clientSideRenderScale = 1; + } + return clientSideRenderScale; +} + +int BeaconTileEntity::getPrimaryPower() +{ + return primaryPower; +} + +int BeaconTileEntity::getSecondaryPower() +{ + return secondaryPower; +} + +int BeaconTileEntity::getLevels() +{ + return levels; +} + +// client-side method used by GUI +void BeaconTileEntity::setLevels(int levels) +{ + this->levels = levels; +} + +void BeaconTileEntity::setPrimaryPower(int primaryPower) +{ + this->primaryPower = 0; + + // verify power + for (int tier = 0; tier < levels && tier < 3; tier++) + { + for(unsigned int e = 0; e < BEACON_EFFECTS_EFFECTS; ++e) + { + MobEffect *effect = BEACON_EFFECTS[tier][e]; + if(effect == NULL) break; + + if (effect->id == primaryPower) + { + this->primaryPower = primaryPower; + return; + } + } + } +} + +void BeaconTileEntity::setSecondaryPower(int secondaryPower) +{ + this->secondaryPower = 0; + + // verify power + if (levels >= 4) + { + for (int tier = 0; tier < 4; tier++) + { + for(unsigned int e = 0; e < BEACON_EFFECTS_EFFECTS; ++e) + { + MobEffect *effect = BEACON_EFFECTS[tier][e]; + if(effect == NULL) break; + + if (effect->id == secondaryPower) + { + this->secondaryPower = secondaryPower; + return; + } + } + } + } +} + +shared_ptr BeaconTileEntity::getUpdatePacket() +{ + CompoundTag *tag = new CompoundTag(); + save(tag); + return shared_ptr( new TileEntityDataPacket(x, y, z, TileEntityDataPacket::TYPE_BEACON, tag) ); +} + +double BeaconTileEntity::getViewDistance() +{ + return 256 * 256; +} + +void BeaconTileEntity::load(CompoundTag *tag) +{ + TileEntity::load(tag); + + primaryPower = tag->getInt(L"Primary"); + secondaryPower = tag->getInt(L"Secondary"); + levels = tag->getInt(L"Levels"); +} + +void BeaconTileEntity::save(CompoundTag *tag) +{ + TileEntity::save(tag); + + tag->putInt(L"Primary", primaryPower); + tag->putInt(L"Secondary", secondaryPower); + // this value is re-calculated, but save it anyway to avoid update lag + tag->putInt(L"Levels", levels); +} + +unsigned int BeaconTileEntity::getContainerSize() +{ + return 1; +} + +shared_ptr BeaconTileEntity::getItem(unsigned int slot) +{ + if (slot == 0) + { + return paymentItem; + } + return nullptr; +} + +shared_ptr BeaconTileEntity::removeItem(unsigned int slot, int count) +{ + if (slot == 0 && paymentItem != NULL) + { + if (count >= paymentItem->count) + { + shared_ptr returnItem = paymentItem; + paymentItem = nullptr; + return returnItem; + } + else + { + paymentItem->count -= count; + return shared_ptr( new ItemInstance(paymentItem->id, count, paymentItem->getAuxValue()) ); + } + } + return nullptr; +} + +shared_ptr BeaconTileEntity::removeItemNoUpdate(int slot) +{ + if (slot == 0 && paymentItem != NULL) + { + shared_ptr returnItem = paymentItem; + paymentItem = nullptr; + return returnItem; + } + return nullptr; +} + +void BeaconTileEntity::setItem(unsigned int slot, shared_ptr item) +{ + if (slot == 0) + { + paymentItem = item; + } +} + +wstring BeaconTileEntity::getName() +{ + return hasCustomName() ? name : app.GetString(IDS_CONTAINER_BEACON); +} + +wstring BeaconTileEntity::getCustomName() +{ + return hasCustomName() ? name : L""; +} + +bool BeaconTileEntity::hasCustomName() +{ + return !name.empty(); +} + +void BeaconTileEntity::setCustomName(const wstring &name) +{ + this->name = name; +} + +int BeaconTileEntity::getMaxStackSize() +{ + return 1; +} + +bool BeaconTileEntity::stillValid(shared_ptr player) +{ + if (level->getTileEntity(x, y, z) != shared_from_this()) return false; + if (player->distanceToSqr(x + 0.5, y + 0.5, z + 0.5) > 8 * 8) return false; + return true; +} + +void BeaconTileEntity::startOpen() +{ +} + +void BeaconTileEntity::stopOpen() +{ +} + +bool BeaconTileEntity::canPlaceItem(int slot, shared_ptr item) +{ + return (item->id == Item::emerald_Id || item->id == Item::diamond_Id || item->id == Item::goldIngot_Id || item->id == Item::ironIngot_Id); +} \ No newline at end of file diff --git a/Minecraft.World/BeaconTileEntity.h b/Minecraft.World/BeaconTileEntity.h new file mode 100644 index 00000000..1b6067a1 --- /dev/null +++ b/Minecraft.World/BeaconTileEntity.h @@ -0,0 +1,75 @@ +#pragma once +#include "TileEntity.h" +#include "Container.h" + +class BeaconTileEntity : public TileEntity, public Container +{ +public: + eINSTANCEOF GetType() { return eTYPE_BEACONTILEENTITY; } + static TileEntity *create() { return new BeaconTileEntity(); } + // 4J Added + virtual shared_ptr clone(); + +private: + static const int SCALE_TIME = SharedConstants::TICKS_PER_SECOND * 2; + +public: + static const int BEACON_EFFECTS_TIERS = 4; + static const int BEACON_EFFECTS_EFFECTS = 3; + static MobEffect *BEACON_EFFECTS[BEACON_EFFECTS_TIERS][BEACON_EFFECTS_EFFECTS]; + + static void staticCtor(); + +private: + __int64 clientSideRenderTick; + float clientSideRenderScale; + + bool isActive; + int levels; + + int primaryPower; + int secondaryPower; + + shared_ptr paymentItem; + wstring name; + +public: + BeaconTileEntity(); + + void tick(); + +private: + void applyEffects(); + void updateShape(); + +public: + float getAndUpdateClientSideScale(); + int getPrimaryPower(); + int getSecondaryPower(); + int getLevels(); + // client-side method used by GUI + void setLevels(int levels); + void setPrimaryPower(int primaryPower); + void setSecondaryPower(int secondaryPower); + shared_ptr getUpdatePacket(); + double getViewDistance(); + void load(CompoundTag *tag); + void save(CompoundTag *tag); + unsigned int getContainerSize(); + shared_ptr getItem(unsigned int slot); + shared_ptr removeItem(unsigned int slot, int count); + shared_ptr removeItemNoUpdate(int slot); + void setItem(unsigned int slot, shared_ptr item); + wstring getName(); + wstring getCustomName(); + bool hasCustomName(); + void setCustomName(const wstring &name); + int getMaxStackSize(); + bool stillValid(shared_ptr player); + void startOpen(); + void stopOpen(); + bool canPlaceItem(int slot, shared_ptr item); + + // 4J Stu - For container + virtual void setChanged() { TileEntity::setChanged(); } +}; \ No newline at end of file diff --git a/Minecraft.World/BedItem.cpp b/Minecraft.World/BedItem.cpp index 1ff50c6c..a55f277e 100644 --- a/Minecraft.World/BedItem.cpp +++ b/Minecraft.World/BedItem.cpp @@ -14,6 +14,8 @@ BedItem::BedItem(int id) : Item( id ) bool BedItem::useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { + if (level->isClientSide) return true; + if (face != Facing::UP) { return false; @@ -33,21 +35,21 @@ bool BedItem::useOn(shared_ptr itemInstance, shared_ptr pl if (dir == Direction::NORTH) zra = -1; if (dir == Direction::EAST) xra = 1; - if (!player->mayBuild(x, y, z) || !player->mayBuild(x + xra, y, z + zra)) return false; + if (!player->mayUseItemAt(x, y, z, face, itemInstance) || !player->mayUseItemAt(x + xra, y, z + zra, face, itemInstance)) return false; if (level->isEmptyTile(x, y, z) && level->isEmptyTile(x + xra, y, z + zra) && level->isTopSolidBlocking(x, y - 1, z) && level->isTopSolidBlocking(x + xra, y - 1, z + zra)) { // 4J-PB - Adding a test only version to allow tooltips to be displayed if(!bTestUseOnOnly) { - level->setTileAndData(x, y, z, tile->id, dir); + level->setTileAndData(x, y, z, tile->id, dir, Tile::UPDATE_ALL); // double-check that the bed was successfully placed if (level->getTile(x, y, z) == tile->id) { // 4J-JEV: Hook for durango 'BlockPlaced' event. player->awardStat(GenericStats::blocksPlaced(tile->id), GenericStats::param_blocksPlaced(tile->id,itemInstance->getAuxValue(),1)); - level->setTileAndData(x + xra, y, z + zra, tile->id, dir + BedTile::HEAD_PIECE_DATA); + level->setTileAndData(x + xra, y, z + zra, tile->id, dir + BedTile::HEAD_PIECE_DATA, Tile::UPDATE_ALL); } itemInstance->count--; diff --git a/Minecraft.World/BedTile.cpp b/Minecraft.World/BedTile.cpp index 7d32c6d3..2023e23f 100644 --- a/Minecraft.World/BedTile.cpp +++ b/Minecraft.World/BedTile.cpp @@ -9,7 +9,7 @@ int BedTile::HEAD_DIRECTION_OFFSETS[4][2] = { - { 0, 1 }, { -1, 0 }, { 0, -1 }, { 1, 0 } + { 0, 1 }, { -1, 0 }, { 0, -1 }, { 1, 0 } }; BedTile::BedTile(int id) : DirectionalTile(id, Material::cloth, isSolidRender()) @@ -24,7 +24,7 @@ BedTile::BedTile(int id) : DirectionalTile(id, Material::cloth, isSolidRender()) // 4J Added override void BedTile::updateDefaultShape() { - setShape(); + setShape(); } // 4J-PB - Adding a TestUse for tooltip display @@ -68,75 +68,76 @@ bool BedTile::TestUse(Level *level, int x, int y, int z, shared_ptr play bool BedTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { if( soundOnly) return false; - if (level->isClientSide) return true; + if (level->isClientSide) return true; - int data = level->getData(x, y, z); + int data = level->getData(x, y, z); - if (!BedTile::isHeadPiece(data)) + if (!isHeadPiece(data)) { - // fetch head piece instead - int direction = getDirection(data); - x += HEAD_DIRECTION_OFFSETS[direction][0]; - z += HEAD_DIRECTION_OFFSETS[direction][1]; - if (level->getTile(x, y, z) != id) + // fetch head piece instead + int direction = getDirection(data); + x += HEAD_DIRECTION_OFFSETS[direction][0]; + z += HEAD_DIRECTION_OFFSETS[direction][1]; + if (level->getTile(x, y, z) != id) { - return true; - } - data = level->getData(x, y, z); - } + return true; + } + data = level->getData(x, y, z); + } - if (!level->dimension->mayRespawn()) + if (!level->dimension->mayRespawn() || level->getBiome(x, z) == Biome::hell) { - double xc = x + 0.5; - double yc = y + 0.5; - double zc = z + 0.5; - level->setTile(x, y, z, 0); - int direction = getDirection(data); - x += HEAD_DIRECTION_OFFSETS[direction][0]; - z += HEAD_DIRECTION_OFFSETS[direction][1]; - if (level->getTile(x, y, z) == id) { - level->setTile(x, y, z, 0); - xc = (xc + x + 0.5) / 2; - yc = (yc + y + 0.5) / 2; - zc = (zc + z + 0.5) / 2; - } - level->explode(nullptr, x + 0.5f, y + 0.5f, z + 0.5f, 5, true, true); - return true; - } + 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..55eb953f 100644 --- a/Minecraft.World/BrewingStandMenu.cpp +++ b/Minecraft.World/BrewingStandMenu.cpp @@ -41,7 +41,7 @@ void BrewingStandMenu::broadcastChanges() AbstractContainerMenu::broadcastChanges(); //for (int i = 0; i < containerListeners->size(); i++) - for(AUTO_VAR(it, containerListeners->begin()); it != containerListeners->end(); ++it) + for(AUTO_VAR(it, containerListeners.begin()); it != containerListeners.end(); ++it) { ContainerListener *listener = *it; //containerListeners.at(i); if (tc != brewingStand->getBrewTime()) @@ -65,11 +65,11 @@ bool BrewingStandMenu::stillValid(shared_ptr player) shared_ptr BrewingStandMenu::quickMoveStack(shared_ptr player, int slotIndex) { shared_ptr clicked = nullptr; - Slot *slot = slots->at(slotIndex); - Slot *IngredientSlot = slots->at(INGREDIENT_SLOT); - Slot *PotionSlot1 = slots->at(BOTTLE_SLOT_START); - Slot *PotionSlot2 = slots->at(BOTTLE_SLOT_START+1); - Slot *PotionSlot3 = slots->at(BOTTLE_SLOT_START+2); + Slot *slot = slots.at(slotIndex); + Slot *IngredientSlot = slots.at(INGREDIENT_SLOT); + Slot *PotionSlot1 = slots.at(BOTTLE_SLOT_START); + Slot *PotionSlot2 = slots.at(BOTTLE_SLOT_START+1); + Slot *PotionSlot3 = slots.at(BOTTLE_SLOT_START+2); if (slot != NULL && slot->hasItem()) { @@ -101,7 +101,7 @@ shared_ptr BrewingStandMenu::quickMoveStack(shared_ptr pla else if (slotIndex >= INV_SLOT_START && slotIndex < INV_SLOT_END) { // 4J-PB - if the item is an ingredient, quickmove it into the ingredient slot - if( (Item::items[stack->id]->hasPotionBrewingFormula() || (stack->id == Item::netherStalkSeeds_Id) ) && + if( (Item::items[stack->id]->hasPotionBrewingFormula() || (stack->id == Item::netherwart_seeds_Id) ) && (!IngredientSlot->hasItem() || (stack->id==IngredientSlot->getItem()->id) ) ) { if(!moveItemStackTo(stack, INGREDIENT_SLOT, INGREDIENT_SLOT+1, false)) @@ -125,7 +125,7 @@ shared_ptr BrewingStandMenu::quickMoveStack(shared_ptr pla else if (slotIndex >= USE_ROW_SLOT_START && slotIndex < USE_ROW_SLOT_END) { // 4J-PB - if the item is an ingredient, quickmove it into the ingredient slot - if((Item::items[stack->id]->hasPotionBrewingFormula() || (stack->id == Item::netherStalkSeeds_Id)) && + if((Item::items[stack->id]->hasPotionBrewingFormula() || (stack->id == Item::netherwart_seeds_Id)) && (!IngredientSlot->hasItem() || (stack->id==IngredientSlot->getItem()->id) )) { if(!moveItemStackTo(stack, INGREDIENT_SLOT, INGREDIENT_SLOT+1, false)) @@ -190,9 +190,7 @@ int BrewingStandMenu::PotionSlot::getMaxStackSize() void BrewingStandMenu::PotionSlot::onTake(shared_ptr player, shared_ptr carried) { - carried->onCraftedBy(this->player->level, dynamic_pointer_cast( this->player->shared_from_this() ), 1); - if (carried->id == Item::potion_Id && carried->getAuxValue() > 0) - this->player->awardStat(GenericStats::potion(),GenericStats::param_potion()); + if (carried->id == Item::potion_Id && carried->getAuxValue() > 0) this->player->awardStat(GenericStats::potion(),GenericStats::param_potion()); Slot::onTake(player, carried); } @@ -222,7 +220,7 @@ bool BrewingStandMenu::IngredientsSlot::mayPlace(shared_ptr item) } else { - return Item::items[item->id]->hasPotionBrewingFormula() || item->id == Item::netherStalkSeeds_Id || item->id == Item::bucket_water_Id; + return Item::items[item->id]->hasPotionBrewingFormula() || item->id == Item::netherwart_seeds_Id || item->id == Item::bucket_water_Id; } } return false; diff --git a/Minecraft.World/BrewingStandTile.cpp b/Minecraft.World/BrewingStandTile.cpp index 5f09ba02..1aeb52d8 100644 --- a/Minecraft.World/BrewingStandTile.cpp +++ b/Minecraft.World/BrewingStandTile.cpp @@ -5,10 +5,9 @@ #include "net.minecraft.world.item.h" #include "net.minecraft.world.entity.item.h" #include "net.minecraft.world.h" +#include "net.minecraft.world.inventory.h" -const wstring BrewingStandTile::TEXTURE_BASE = L"brewingStand_base"; - -BrewingStandTile::BrewingStandTile(int id) : EntityTile(id, Material::metal, isSolidRender()) +BrewingStandTile::BrewingStandTile(int id) : BaseEntityTile(id, Material::metal, isSolidRender()) { random = new Random(); iconBase = NULL; @@ -41,10 +40,10 @@ bool BrewingStandTile::isCubeShaped() void BrewingStandTile::addAABBs(Level *level, int x, int y, int z, AABB *box, AABBList *boxes, shared_ptr source) { - setShape(7.0f / 16.0f, 0, 7.0f / 16.0f, 9.0f / 16.0f, 14.0f / 16.0f, 9.0f / 16.0f); - EntityTile::addAABBs(level, x, y, z, box, boxes, source); - updateDefaultShape(); - EntityTile::addAABBs(level, x, y, z, box, boxes, source); + setShape(7.0f / 16.0f, 0, 7.0f / 16.0f, 9.0f / 16.0f, 14.0f / 16.0f, 9.0f / 16.0f); + BaseEntityTile::addAABBs(level, x, y, z, box, boxes, source); + updateDefaultShape(); + BaseEntityTile::addAABBs(level, x, y, z, box, boxes, source); } void BrewingStandTile::updateDefaultShape() @@ -56,62 +55,70 @@ bool BrewingStandTile::use(Level *level, int x, int y, int z, shared_ptr { if(soundOnly) return false; - if (level->isClientSide) + if (level->isClientSide) { - return true; - } - shared_ptr brewingStand = dynamic_pointer_cast(level->getTileEntity(x, y, z)); - if (brewingStand != NULL) player->openBrewingStand(brewingStand); + return true; + } + shared_ptr brewingStand = dynamic_pointer_cast(level->getTileEntity(x, y, z)); + if (brewingStand != NULL) player->openBrewingStand(brewingStand); return true; } +void BrewingStandTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance) +{ + if (itemInstance->hasCustomHoverName()) + { + dynamic_pointer_cast( level->getTileEntity(x, y, z))->setCustomName(itemInstance->getHoverName()); + } +} + void BrewingStandTile::animateTick(Level *level, int xt, int yt, int zt, Random *random) { - double x = xt + 0.4f + random->nextFloat() * 0.2f; - double y = yt + 0.7f + random->nextFloat() * 0.3f; - double z = zt + 0.4f + random->nextFloat() * 0.2f; + double x = xt + 0.4f + random->nextFloat() * 0.2f; + double y = yt + 0.7f + random->nextFloat() * 0.3f; + double z = zt + 0.4f + random->nextFloat() * 0.2f; - level->addParticle(eParticleType_smoke, x, y, z, 0, 0, 0); + level->addParticle(eParticleType_smoke, x, y, z, 0, 0, 0); } void BrewingStandTile::onRemove(Level *level, int x, int y, int z, int id, int data) { - shared_ptr tileEntity = level->getTileEntity(x, y, z); - if (tileEntity != NULL && ( dynamic_pointer_cast(tileEntity) != NULL) ) + shared_ptr tileEntity = level->getTileEntity(x, y, z); + if (tileEntity != NULL && ( dynamic_pointer_cast(tileEntity) != NULL) ) { - shared_ptr container = dynamic_pointer_cast(tileEntity); - for (int i = 0; i < container->getContainerSize(); i++) + shared_ptr container = dynamic_pointer_cast(tileEntity); + for (int i = 0; i < container->getContainerSize(); i++) { - shared_ptr item = container->getItem(i); - if (item != NULL) + shared_ptr item = container->getItem(i); + if (item != NULL) { - float xo = random->nextFloat() * 0.8f + 0.1f; - float yo = random->nextFloat() * 0.8f + 0.1f; - float zo = random->nextFloat() * 0.8f + 0.1f; + float xo = random->nextFloat() * 0.8f + 0.1f; + float yo = random->nextFloat() * 0.8f + 0.1f; + float zo = random->nextFloat() * 0.8f + 0.1f; - while (item->count > 0) + while (item->count > 0) { - int count = random->nextInt(21) + 10; - if (count > item->count) count = item->count; - item->count -= count; + 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..00170d7b 100644 --- a/Minecraft.World/BrewingStandTileEntity.cpp +++ b/Minecraft.World/BrewingStandTileEntity.cpp @@ -2,16 +2,22 @@ #include "com.mojang.nbt.h" #include "BrewingStandTileEntity.h" #include "SharedConstants.h" +#include "net.minecraft.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.item.alchemy.h" +int slotsForUp [] = { BrewingStandTileEntity::INGREDIENT_SLOT }; +int slotsForOtherFaces [] = { 0, 1, 2 }; +intArray BrewingStandTileEntity::SLOTS_FOR_UP = intArray(slotsForUp, 1); +intArray BrewingStandTileEntity::SLOTS_FOR_OTHER_FACES = intArray(slotsForOtherFaces, 3); BrewingStandTileEntity::BrewingStandTileEntity() { brewTime = 0; items = ItemInstanceArray(4); + name = L""; } BrewingStandTileEntity::~BrewingStandTileEntity() @@ -19,9 +25,24 @@ BrewingStandTileEntity::~BrewingStandTileEntity() delete [] items.data; } -int BrewingStandTileEntity::getName() +wstring BrewingStandTileEntity::getName() { - return IDS_TILE_BREWINGSTAND; + return hasCustomName() ? name : app.GetString(IDS_TILE_BREWINGSTAND); +} + +wstring BrewingStandTileEntity::getCustomName() +{ + return hasCustomName() ? name : L""; +} + +bool BrewingStandTileEntity::hasCustomName() +{ + return !name.empty(); +} + +void BrewingStandTileEntity::setCustomName(const wstring &name) +{ + this->name = name; } unsigned int BrewingStandTileEntity::getContainerSize() @@ -31,41 +52,41 @@ unsigned int BrewingStandTileEntity::getContainerSize() void BrewingStandTileEntity::tick() { - if (brewTime > 0) + if (brewTime > 0) { - brewTime--; + brewTime--; - if (brewTime == 0) + if (brewTime == 0) { - // apply ingredients to all potions - doBrew(); - setChanged(); - } + // apply ingredients to all potions + doBrew(); + setChanged(); + } else if (!isBrewable()) { - brewTime = 0; - setChanged(); - } + brewTime = 0; + setChanged(); + } else if (ingredientId != items[INGREDIENT_SLOT]->id) { - brewTime = 0; - setChanged(); - } - } + brewTime = 0; + setChanged(); + } + } else if (isBrewable()) { - brewTime = SharedConstants::TICKS_PER_SECOND * PotionBrewing::BREWING_TIME_SECONDS; - ingredientId = items[INGREDIENT_SLOT]->id; - } + brewTime = SharedConstants::TICKS_PER_SECOND * PotionBrewing::BREWING_TIME_SECONDS; + ingredientId = items[INGREDIENT_SLOT]->id; + } - int newCount = getPotionBits(); - if (newCount != lastPotionCount) + int newCount = getPotionBits(); + if (newCount != lastPotionCount) { - lastPotionCount = newCount; - level->setData(x, y, z, newCount); - } + lastPotionCount = newCount; + level->setData(x, y, z, newCount, Tile::UPDATE_CLIENTS); + } - TileEntity::tick(); + TileEntity::tick(); } int BrewingStandTileEntity::getBrewTime() @@ -75,34 +96,34 @@ int BrewingStandTileEntity::getBrewTime() bool BrewingStandTileEntity::isBrewable() { - if (items[INGREDIENT_SLOT] == NULL || items[INGREDIENT_SLOT]->count <= 0) + if (items[INGREDIENT_SLOT] == NULL || items[INGREDIENT_SLOT]->count <= 0) { - return false; - } - shared_ptr ingredient = items[INGREDIENT_SLOT]; - if (PotionBrewing::SIMPLIFIED_BREWING) + return false; + } + shared_ptr ingredient = items[INGREDIENT_SLOT]; + if (PotionBrewing::SIMPLIFIED_BREWING) { - if (!Item::items[ingredient->id]->hasPotionBrewingFormula()) + if (!Item::items[ingredient->id]->hasPotionBrewingFormula()) { - return false; - } + return false; + } - bool oneResult = false; - for (int dest = 0; dest < 3; dest++) + bool oneResult = false; + for (int dest = 0; dest < 3; dest++) { - if (items[dest] != NULL && items[dest]->id == Item::potion_Id) + if (items[dest] != NULL && items[dest]->id == Item::potion_Id) { - int currentBrew = items[dest]->getAuxValue(); - int newBrew = NORMALISE_POTION_AUXVAL( applyIngredient(currentBrew, ingredient) ); + int currentBrew = items[dest]->getAuxValue(); + int newBrew = NORMALISE_POTION_AUXVAL( applyIngredient(currentBrew, ingredient) ); - if (!PotionItem::isThrowable(currentBrew) && PotionItem::isThrowable(newBrew)) + if (!PotionItem::isThrowable(currentBrew) && PotionItem::isThrowable(newBrew)) { - oneResult = true; - break; - } + oneResult = true; + break; + } - vector *currentEffects = Item::potion->getMobEffects(currentBrew); - vector *newEffects = Item::potion->getMobEffects(newBrew); + vector *currentEffects = Item::potion->getMobEffects(currentBrew); + vector *newEffects = Item::potion->getMobEffects(newBrew); // 4J - this code replaces an expression "currentEffects.equals(newEffects)" in the java. // TODO - find out whether actually checking pointers to MobEffectInstance classes for equality @@ -119,72 +140,72 @@ bool BrewingStandTileEntity::isBrewable() } } - if ((currentBrew > 0 && currentEffects == newEffects) || + if ((currentBrew > 0 && currentEffects == newEffects) || (currentEffects != NULL && (equals || newEffects == NULL))) { - } + } else if (currentBrew != newBrew) { - oneResult = true; - break; - } - } - } - return oneResult; + oneResult = true; + break; + } + } + } + return oneResult; - } + } else { - if (!Item::items[ingredient->id]->hasPotionBrewingFormula() && ingredient->id != Item::bucket_water_Id && ingredient->id != Item::netherStalkSeeds_Id) + if (!Item::items[ingredient->id]->hasPotionBrewingFormula() && ingredient->id != Item::bucket_water_Id && ingredient->id != Item::netherwart_seeds_Id) { - return false; - } - bool isWater = ingredient->id == Item::bucket_water_Id; + return false; + } + bool isWater = ingredient->id == Item::bucket_water_Id; - // at least one destination potion must have a result - bool oneResult = false; - for (int dest = 0; dest < 3; dest++) + // at least one destination potion must have a result + bool oneResult = false; + for (int dest = 0; dest < 3; dest++) { - if (items[dest] != NULL && items[dest]->id == Item::potion_Id) + if (items[dest] != NULL && items[dest]->id == Item::potion_Id) { - int currentBrew = items[dest]->getAuxValue(); - int newBrew = NORMALISE_POTION_AUXVAL( applyIngredient(currentBrew, ingredient) ); - if (currentBrew != newBrew) + int currentBrew = items[dest]->getAuxValue(); + int newBrew = NORMALISE_POTION_AUXVAL( applyIngredient(currentBrew, ingredient) ); + if (currentBrew != newBrew) { - oneResult = true; - break; - } - } + oneResult = true; + break; + } + } else if (isWater && items[dest] != NULL && items[dest]->id == Item::glassBottle_Id) { - oneResult = true; - break; - } - } - return oneResult; - } + oneResult = true; + break; + } + } + return oneResult; + } } void BrewingStandTileEntity::doBrew() { - if (!isBrewable()) + if (!isBrewable()) { - return; - } + return; + } - shared_ptr ingredient = items[INGREDIENT_SLOT]; + shared_ptr ingredient = items[INGREDIENT_SLOT]; - if (PotionBrewing::SIMPLIFIED_BREWING) + if (PotionBrewing::SIMPLIFIED_BREWING) { - for (int dest = 0; dest < 3; dest++) + for (int dest = 0; dest < 3; dest++) { - if (items[dest] != NULL && items[dest]->id == Item::potion_Id) + if (items[dest] != NULL && items[dest]->id == Item::potion_Id) { - int currentBrew = items[dest]->getAuxValue(); - int newBrew = NORMALISE_POTION_AUXVAL( applyIngredient(currentBrew, ingredient) ); + int currentBrew = items[dest]->getAuxValue(); + int newBrew = NORMALISE_POTION_AUXVAL( applyIngredient(currentBrew, ingredient) ); - vector *currentEffects = Item::potion->getMobEffects(currentBrew); - vector *newEffects = Item::potion->getMobEffects(newBrew); + vector *currentEffects = Item::potion->getMobEffects(currentBrew); + vector *newEffects = Item::potion->getMobEffects(newBrew); // 4J - this code replaces an expression "currentEffects.equals(newEffects)" in the java. // TODO - find out whether actually checking pointers to MobEffectInstance classes for equality @@ -201,55 +222,55 @@ void BrewingStandTileEntity::doBrew() } } - if ((currentBrew > 0 && currentEffects == newEffects) || + if ((currentBrew > 0 && currentEffects == newEffects) || (currentEffects != NULL && (equals || newEffects == NULL))) { - if (!PotionItem::isThrowable(currentBrew) && PotionItem::isThrowable(newBrew)) + if (!PotionItem::isThrowable(currentBrew) && PotionItem::isThrowable(newBrew)) { - items[dest]->setAuxValue(newBrew); - } + items[dest]->setAuxValue(newBrew); + } - } + } else if (currentBrew != newBrew) { - items[dest]->setAuxValue(newBrew); - } + items[dest]->setAuxValue(newBrew); + } - } - } + } + } - } + } else { - bool isWater = ingredient->id == Item::bucket_water_Id; + bool isWater = ingredient->id == Item::bucket_water_Id; - for (int dest = 0; dest < 3; dest++) + for (int dest = 0; dest < 3; dest++) { - if (items[dest] != NULL && items[dest]->id == Item::potion_Id) + if (items[dest] != NULL && items[dest]->id == Item::potion_Id) { - int currentBrew = items[dest]->getAuxValue(); - int newBrew = NORMALISE_POTION_AUXVAL( applyIngredient(currentBrew, ingredient) ); - items[dest]->setAuxValue(newBrew); - } + int currentBrew = items[dest]->getAuxValue(); + int newBrew = NORMALISE_POTION_AUXVAL( applyIngredient(currentBrew, ingredient) ); + items[dest]->setAuxValue(newBrew); + } else if (isWater && items[dest] != NULL && items[dest]->id == Item::glassBottle_Id) { - items[dest] = shared_ptr(new ItemInstance(Item::potion)); - } - } - } + items[dest] = shared_ptr(new ItemInstance(Item::potion)); + } + } + } - if (Item::items[ingredient->id]->hasCraftingRemainingItem()) + if (Item::items[ingredient->id]->hasCraftingRemainingItem()) { - items[INGREDIENT_SLOT] = shared_ptr(new ItemInstance(Item::items[ingredient->id]->getCraftingRemainingItem())); - } + items[INGREDIENT_SLOT] = shared_ptr(new ItemInstance(Item::items[ingredient->id]->getCraftingRemainingItem())); + } else { - items[INGREDIENT_SLOT]->count--; - if (items[INGREDIENT_SLOT]->count <= 0) + items[INGREDIENT_SLOT]->count--; + if (items[INGREDIENT_SLOT]->count <= 0) { - items[INGREDIENT_SLOT] = nullptr; - } - } + items[INGREDIENT_SLOT] = nullptr; + } + } } int BrewingStandTileEntity::applyIngredient(int currentBrew, shared_ptr ingredient) @@ -266,7 +287,7 @@ int BrewingStandTileEntity::applyIngredient(int currentBrew, shared_ptrid == Item::netherStalkSeeds_Id) + if (ingredient->id == Item::netherwart_seeds_Id) { return PotionBrewing::stirr(currentBrew); } @@ -278,42 +299,44 @@ int BrewingStandTileEntity::applyIngredient(int currentBrew, shared_ptr *inventoryList = (ListTag *) base->getList(L"Items"); + ListTag *inventoryList = (ListTag *) base->getList(L"Items"); delete [] items.data; - items = ItemInstanceArray(getContainerSize()); - for (int i = 0; i < inventoryList->size(); i++) + items = ItemInstanceArray(getContainerSize()); + for (int i = 0; i < inventoryList->size(); i++) { - CompoundTag *tag = inventoryList->get(i); - int slot = tag->getByte(L"Slot"); - if (slot >= 0 && slot < items.length) items[slot] = ItemInstance::fromTag(tag); - } + CompoundTag *tag = inventoryList->get(i); + int slot = tag->getByte(L"Slot"); + if (slot >= 0 && slot < items.length) items[slot] = ItemInstance::fromTag(tag); + } - brewTime = base->getShort(L"BrewTime"); + brewTime = base->getShort(L"BrewTime"); + if (base->contains(L"CustomName")) name = base->getString(L"CustomName"); } void BrewingStandTileEntity::save(CompoundTag *base) { - TileEntity::save(base); + TileEntity::save(base); - base->putShort(L"BrewTime", (short) (brewTime)); - ListTag *listTag = new ListTag(); + base->putShort(L"BrewTime", (short) (brewTime)); + ListTag *listTag = new ListTag(); - for (int i = 0; i < items.length; i++) + for (int i = 0; i < items.length; i++) { - if (items[i] != NULL) + if (items[i] != NULL) { - CompoundTag *tag = new CompoundTag(); - tag->putByte(L"Slot", (byte) i); - items[i]->save(tag); - listTag->add(tag); - } - } - base->put(L"Items", listTag); + CompoundTag *tag = new CompoundTag(); + tag->putByte(L"Slot", (byte) i); + items[i]->save(tag); + listTag->add(tag); + } + } + base->put(L"Items", listTag); + if (hasCustomName()) base->putString(L"CustomName", name); } shared_ptr BrewingStandTileEntity::getItem(unsigned int slot) @@ -354,7 +377,7 @@ shared_ptr BrewingStandTileEntity::removeItem(unsigned int slot, i } return nullptr; } - + shared_ptr BrewingStandTileEntity::removeItemNoUpdate(int slot) { if (slot >= 0 && slot < items.length) @@ -368,22 +391,23 @@ shared_ptr BrewingStandTileEntity::removeItemNoUpdate(int slot) void BrewingStandTileEntity::setItem(unsigned int slot, shared_ptr item) { - if (slot >= 0 && slot < items.length) + if (slot >= 0 && slot < items.length) { - items[slot] = item; - } + items[slot] = item; + } } int BrewingStandTileEntity::getMaxStackSize() { - return 1; + // this value is not used for the potion slots + return 64; } bool BrewingStandTileEntity::stillValid(shared_ptr player) { - if (level->getTileEntity(x, y, z) != shared_from_this()) return false; - if (player->distanceToSqr(x + 0.5, y + 0.5, z + 0.5) > 8 * 8) return false; - return true; + if (level->getTileEntity(x, y, z) != shared_from_this()) return false; + if (player->distanceToSqr(x + 0.5, y + 0.5, z + 0.5) > 8 * 8) return false; + return true; } void BrewingStandTileEntity::startOpen() @@ -394,22 +418,59 @@ void BrewingStandTileEntity::stopOpen() { } +bool BrewingStandTileEntity::canPlaceItem(int slot, shared_ptr item) +{ + if (slot == INGREDIENT_SLOT) + { + if (PotionBrewing::SIMPLIFIED_BREWING) + { + return Item::items[item->id]->hasPotionBrewingFormula(); + } + else + { + return Item::items[item->id]->hasPotionBrewingFormula() || item->id == Item::netherwart_seeds_Id || item->id == Item::bucket_water_Id; + } + } + + return item->id == Item::potion_Id || item->id == Item::glassBottle_Id; +} + void BrewingStandTileEntity::setBrewTime(int value) { - this->brewTime = value; + brewTime = value; } int BrewingStandTileEntity::getPotionBits() { - int newCount = 0; - for (int potion = 0; potion < 3; potion++) + int newCount = 0; + for (int potion = 0; potion < 3; potion++) { - if (items[potion] != NULL) + if (items[potion] != NULL) { - newCount |= (1 << potion); - } - } - return newCount; + newCount |= (1 << potion); + } + } + return newCount; +} + +intArray BrewingStandTileEntity::getSlotsForFace(int face) +{ + if (face == Facing::UP) + { + return SLOTS_FOR_UP; + } + + return SLOTS_FOR_OTHER_FACES; +} + +bool BrewingStandTileEntity::canPlaceItemThroughFace(int slot, shared_ptr item, int face) +{ + return canPlaceItem(slot, item); +} + +bool BrewingStandTileEntity::canTakeItemThroughFace(int slot, shared_ptr item, int face) +{ + return true; } // 4J Added @@ -419,8 +480,8 @@ shared_ptr BrewingStandTileEntity::clone() TileEntity::clone(result); result->brewTime = brewTime; - result->lastPotionCount = lastPotionCount; - result->ingredientId = ingredientId; + result->lastPotionCount = lastPotionCount; + result->ingredientId = ingredientId; for (unsigned int i = 0; i < items.length; i++) { diff --git a/Minecraft.World/BrewingStandTileEntity.h b/Minecraft.World/BrewingStandTileEntity.h index 733e1073..52d3a0f1 100644 --- a/Minecraft.World/BrewingStandTileEntity.h +++ b/Minecraft.World/BrewingStandTileEntity.h @@ -1,50 +1,61 @@ #pragma once #include "TileEntity.h" -#include "Container.h" +#include "WorldlyContainer.h" -class BrewingStandTileEntity : public TileEntity, public Container +class BrewingStandTileEntity : public TileEntity, public WorldlyContainer { public: eINSTANCEOF GetType() { return eTYPE_BREWINGSTANDTILEENTITY; } static TileEntity *create() { return new BrewingStandTileEntity(); } + static const int INGREDIENT_SLOT = 3; + private: ItemInstanceArray items; - static const int INGREDIENT_SLOT = 3; + static intArray SLOTS_FOR_UP; + static intArray SLOTS_FOR_OTHER_FACES; - int brewTime; - int lastPotionCount; - int ingredientId; + int brewTime; + int lastPotionCount; + int ingredientId; + wstring name; public: BrewingStandTileEntity(); ~BrewingStandTileEntity(); - virtual int getName(); + virtual wstring getName(); + virtual wstring getCustomName(); + virtual bool hasCustomName(); + virtual void setCustomName(const wstring &name); virtual unsigned int getContainerSize(); virtual void tick(); - int getBrewTime(); + int getBrewTime(); private: bool isBrewable(); - void doBrew(); + void doBrew(); int applyIngredient(int currentBrew, shared_ptr ingredient); public: virtual void load(CompoundTag *base); - virtual void save(CompoundTag *base); - virtual shared_ptr getItem(unsigned int slot); - virtual shared_ptr removeItem(unsigned int slot, int i); + virtual void save(CompoundTag *base); + virtual shared_ptr getItem(unsigned int slot); + virtual shared_ptr removeItem(unsigned int slot, int i); virtual shared_ptr removeItemNoUpdate(int slot); - virtual void setItem(unsigned int slot, shared_ptr item); - virtual int getMaxStackSize(); - virtual bool stillValid(shared_ptr player); - virtual void startOpen(); - virtual void stopOpen(); - virtual void setBrewTime(int value); - virtual void setChanged() {} // 4J added - int getPotionBits(); + virtual void setItem(unsigned int slot, shared_ptr item); + virtual int getMaxStackSize(); + virtual bool stillValid(shared_ptr player); + virtual void startOpen(); + virtual void stopOpen(); + virtual bool canPlaceItem(int slot, shared_ptr item); + virtual void setBrewTime(int value); + virtual void setChanged() { TileEntity::setChanged(); } // 4J added + int getPotionBits(); + virtual intArray getSlotsForFace(int face); + virtual bool canPlaceItemThroughFace(int slot, shared_ptr item, int face); + virtual bool canTakeItemThroughFace(int slot, shared_ptr item, int face); // 4J Added virtual shared_ptr clone(); diff --git a/Minecraft.World/BucketItem.cpp b/Minecraft.World/BucketItem.cpp index d3570cd7..a3bd7bee 100644 --- a/Minecraft.World/BucketItem.cpp +++ b/Minecraft.World/BucketItem.cpp @@ -24,12 +24,8 @@ BucketItem::BucketItem(int id, int content) : Item( id ) this->content = content; } -bool BucketItem::TestUse(Level *level, shared_ptr player) +bool BucketItem::TestUse(shared_ptr itemInstance, Level *level, shared_ptr player) { -// double x = player->xo + (player->x - player->xo); -// double y = player->yo + (player->y - player->yo) + 1.62 - player->heightOffset; -// double z = player->zo + (player->z - player->zo); - bool pickLiquid = content == 0; HitResult *hr = getPlayerPOVHitResult(level, player, pickLiquid); if (hr == NULL) return false; @@ -48,7 +44,7 @@ bool BucketItem::TestUse(Level *level, shared_ptr player) if (content == 0) { - if (!player->mayBuild(xt, yt, zt)) return false; + if (!player->mayUseItemAt(xt, yt, zt, hr->f, itemInstance)) return false; if (level->getMaterial(xt, yt, zt) == Material::water && level->getData(xt, yt, zt) == 0) { delete hr; @@ -73,8 +69,8 @@ bool BucketItem::TestUse(Level *level, shared_ptr player) if (hr->f == 3) zt++; if (hr->f == 4) xt--; if (hr->f == 5) xt++; - - if (!player->mayBuild(xt, yt, zt)) return false; + + if (!player->mayUseItemAt(xt, yt, zt, hr->f, itemInstance)) return false; if (level->isEmptyTile(xt, yt, zt) || !level->getMaterial(xt, yt, zt)->isSolid()) { @@ -126,17 +122,17 @@ shared_ptr BucketItem::use(shared_ptr itemInstance, app.DebugPrintf("Sending ChatPacket::e_ChatCannotPlaceLava to player\n"); servPlayer->connection->send( shared_ptr( new ChatPacket(L"", ChatPacket::e_ChatCannotPlaceLava ) ) ); } - + delete hr; return itemInstance; } if (content == 0) { - if (!player->mayBuild(xt, yt, zt)) return itemInstance; + if (!player->mayUseItemAt(xt, yt, zt, hr->f, itemInstance)) return itemInstance; if (level->getMaterial(xt, yt, zt) == Material::water && level->getData(xt, yt, zt) == 0) { - level->setTile(xt, yt, zt, 0); + level->removeTile(xt, yt, zt); delete hr; if (player->abilities.instabuild) { @@ -160,11 +156,11 @@ shared_ptr BucketItem::use(shared_ptr itemInstance, { if( level->dimension->id == -1 ) player->awardStat( - GenericStats::netherLavaCollected(), - GenericStats::param_noArgs() - ); + GenericStats::netherLavaCollected(), + GenericStats::param_noArgs() + ); - level->setTile(xt, yt, zt, 0); + level->removeTile(xt, yt, zt); delete hr; if (player->abilities.instabuild) { @@ -197,65 +193,50 @@ shared_ptr BucketItem::use(shared_ptr itemInstance, if (hr->f == 3) zt++; if (hr->f == 4) xt--; if (hr->f == 5) xt++; - - if (!player->mayBuild(xt, yt, zt)) return itemInstance; + + if (!player->mayUseItemAt(xt, yt, zt, hr->f, itemInstance)) return itemInstance; - if (emptyBucket(level, x, y, z, xt, yt, zt) && !player->abilities.instabuild) + if (emptyBucket(level, xt, yt, zt) && !player->abilities.instabuild) { return shared_ptr( new ItemInstance(Item::bucket_empty) ); } } } - else - { - if (content == 0) - { - if (hr->entity->GetType() == eTYPE_COW) - { - delete hr; - if (--itemInstance->count <= 0) - { - return shared_ptr( new ItemInstance(Item::milk) ); - } - else - { - if (!player->inventory->add(shared_ptr( new ItemInstance(Item::milk)))) - { - player->drop(shared_ptr(new ItemInstance(Item::milk_Id, 1, 0))); - } - return itemInstance; - } - } - } - } delete hr; return itemInstance; } -bool BucketItem::emptyBucket(Level *level, double x, double y, double z, int xt, int yt, int zt) +bool BucketItem::emptyBucket(Level *level, int xt, int yt, int zt) { - if (content <= 0) return false; + if (content <= 0) return false; - if (level->isEmptyTile(xt, yt, zt) || !level->getMaterial(xt, yt, zt)->isSolid()) + Material *material = level->getMaterial(xt, yt, zt); + bool nonSolid = !material->isSolid(); + + if (level->isEmptyTile(xt, yt, zt) || nonSolid) { - if (level->dimension->ultraWarm && content == Tile::water_Id) + if (level->dimension->ultraWarm && content == Tile::water_Id) { - level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, eSoundType_RANDOM_FIZZ, 0.5f, 2.6f + (level->random->nextFloat() - level->random->nextFloat()) * 0.8f); + level->playSound(xt + 0.5f, yt + 0.5f, zt + 0.5f, eSoundType_RANDOM_FIZZ, 0.5f, 2.6f + (level->random->nextFloat() - level->random->nextFloat()) * 0.8f); - for (int i = 0; i < 8; i++) + for (int i = 0; i < 8; i++) { - level->addParticle(eParticleType_largesmoke, xt + Math::random(), yt + Math::random(), zt + Math::random(), 0, 0, 0); - } - } + level->addParticle(eParticleType_largesmoke, xt + Math::random(), yt + Math::random(), zt + Math::random(), 0, 0, 0); + } + } else { - level->setTileAndData(xt, yt, zt, content, 0); - } + if (!level->isClientSide && nonSolid && !material->isLiquid()) + { + level->destroyTile(xt, yt, zt, true); + } + level->setTileAndData(xt, yt, zt, content, 0, Tile::UPDATE_ALL); + } - return true; - } + return true; + } - return false; + return false; } diff --git a/Minecraft.World/BucketItem.h b/Minecraft.World/BucketItem.h index 500d19d8..0fd90e9c 100644 --- a/Minecraft.World/BucketItem.h +++ b/Minecraft.World/BucketItem.h @@ -13,19 +13,8 @@ private: public: BucketItem(int id, int content); - virtual bool TestUse(Level *level, shared_ptr player); + virtual bool TestUse(shared_ptr itemInstance, Level *level, shared_ptr player); virtual shared_ptr use(shared_ptr itemInstance, Level *level, shared_ptr player); - // TU9 - bool emptyBucket(Level *level, double x, double y, double z, int xt, int yt, int zt); - - /* - * public boolean useOn(ItemInstance instance, Player player, Level level, - * int x, int y, int z, int face) { if (content == 0) { } else { if (face == - * 0) y--; if (face == 1) y++; if (face == 2) z--; if (face == 3) z++; if - * (face == 4) x--; if (face == 5) x++; int targetType = level.getTile(x, y, - * z); if (targetType == 0) { level.setTile(x, y, z, content); } - * player->inventory.items[player->inventory.selected] = new - * ItemInstance(Item.bucket_empty); } return true; } - */ + bool emptyBucket(Level *level, int xt, int yt, int zt); }; \ No newline at end of file diff --git a/Minecraft.World/Bush.cpp b/Minecraft.World/Bush.cpp index e6cd7c85..6f8e8d91 100644 --- a/Minecraft.World/Bush.cpp +++ b/Minecraft.World/Bush.cpp @@ -5,13 +5,13 @@ void Bush::_init() { - setTicking(true); - updateDefaultShape(); + setTicking(true); + updateDefaultShape(); } Bush::Bush(int id, Material *material) : Tile(id, material, isSolidRender()) { - _init(); + _init(); } Bush::Bush(int id) : Tile(id, Material::plant, isSolidRender()) @@ -22,8 +22,8 @@ Bush::Bush(int id) : Tile(id, Material::plant, isSolidRender()) // 4J Added override void Bush::updateDefaultShape() { - float ss = 0.2f; - this->setShape(0.5f - ss, 0, 0.5f - ss, 0.5f + ss, ss * 3, 0.5f + ss); + float ss = 0.2f; + setShape(0.5f - ss, 0, 0.5f - ss, 0.5f + ss, ss * 3, 0.5f + ss); } bool Bush::mayPlace(Level *level, int x, int y, int z) @@ -49,11 +49,11 @@ void Bush::tick(Level *level, int x, int y, int z, Random *random) void Bush::checkAlive(Level *level, int x, int y, int z) { - if (!canSurvive(level, x, y, z)) + if (!canSurvive(level, x, y, z)) { - this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); - } + this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); + level->setTileAndData(x, y, z, 0, 0, UPDATE_CLIENTS); + } } bool Bush::canSurvive(Level *level, int x, int y, int z) diff --git a/Minecraft.World/ButtonTile.cpp b/Minecraft.World/ButtonTile.cpp index 16055a7e..045d5597 100644 --- a/Minecraft.World/ButtonTile.cpp +++ b/Minecraft.World/ButtonTile.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "net.minecraft.world.entity.projectile.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.redstone.h" #include "net.minecraft.world.phys.h" #include "net.minecraft.h" #include "ButtonTile.h" @@ -15,7 +16,7 @@ ButtonTile::ButtonTile(int id, bool sensitive) : Tile(id, Material::decoration,i Icon *ButtonTile::getTexture(int face, int data) { if(id == Tile::button_wood_Id) return Tile::wood->getTexture(Facing::UP); - else return Tile::rock->getTexture(Facing::UP); + else return Tile::stone->getTexture(Facing::UP); } AABB *ButtonTile::getAABB(Level *level, int x, int y, int z) @@ -23,7 +24,7 @@ AABB *ButtonTile::getAABB(Level *level, int x, int y, int z) return NULL; } -int ButtonTile::getTickDelay() +int ButtonTile::getTickDelay(Level *level) { return sensitive ? 30 : 20; } @@ -45,100 +46,100 @@ bool ButtonTile::isCubeShaped() bool ButtonTile::mayPlace(Level *level, int x, int y, int z, int face) { - if (face == 2 && level->isSolidBlockingTile(x, y, z + 1)) return true; - if (face == 3 && level->isSolidBlockingTile(x, y, z - 1)) return true; - if (face == 4 && level->isSolidBlockingTile(x + 1, y, z)) return true; - if (face == 5 && level->isSolidBlockingTile(x - 1, y, z)) return true; - return false; + if (face == 2 && level->isSolidBlockingTile(x, y, z + 1)) return true; + if (face == 3 && level->isSolidBlockingTile(x, y, z - 1)) return true; + if (face == 4 && level->isSolidBlockingTile(x + 1, y, z)) return true; + if (face == 5 && level->isSolidBlockingTile(x - 1, y, z)) return true; + return false; } bool ButtonTile::mayPlace(Level *level, int x, int y, int z) { - if (level->isSolidBlockingTile(x - 1, y, z)) + if (level->isSolidBlockingTile(x - 1, y, z)) { - return true; - } + return true; + } else if (level->isSolidBlockingTile(x + 1, y, z)) { - return true; - } + return true; + } else if (level->isSolidBlockingTile(x, y, z - 1)) { - return true; - } + return true; + } else if (level->isSolidBlockingTile(x, y, z + 1)) { - return true; - } - return false; + return true; + } + return false; } int ButtonTile::getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue) { - int dir = level->getData(x, y, z); + int dir = level->getData(x, y, z); - int oldFlip = dir & 8; - dir &= 7; + int oldFlip = dir & 8; + dir &= 7; - if (face == 2 && level->isSolidBlockingTile(x, y, z + 1)) dir = 4; - else if (face == 3 && level->isSolidBlockingTile(x, y, z - 1)) dir = 3; - else if (face == 4 && level->isSolidBlockingTile(x + 1, y, z)) dir = 2; - else if (face == 5 && level->isSolidBlockingTile(x - 1, y, z)) dir = 1; - else dir = findFace(level, x, y, z); + if (face == 2 && level->isSolidBlockingTile(x, y, z + 1)) dir = 4; + else if (face == 3 && level->isSolidBlockingTile(x, y, z - 1)) dir = 3; + else if (face == 4 && level->isSolidBlockingTile(x + 1, y, z)) dir = 2; + else if (face == 5 && level->isSolidBlockingTile(x - 1, y, z)) dir = 1; + else dir = findFace(level, x, y, z); - return dir + oldFlip; + return dir + oldFlip; } int ButtonTile::findFace(Level *level, int x, int y, int z) { - if (level->isSolidBlockingTile(x - 1, y, z)) + if (level->isSolidBlockingTile(x - 1, y, z)) { - return 1; - } + return 1; + } else if (level->isSolidBlockingTile(x + 1, y, z)) { - return 2; - } + return 2; + } else if (level->isSolidBlockingTile(x, y, z - 1)) { - return 3; - } + return 3; + } else if (level->isSolidBlockingTile(x, y, z + 1)) { - return 4; - } - return 1; + return 4; + } + return 1; } void ButtonTile::neighborChanged(Level *level, int x, int y, int z, int type) { - if (checkCanSurvive(level, x, y, z)) + if (checkCanSurvive(level, x, y, z)) { - int dir = level->getData(x, y, z) & 7; - bool replace = false; + int dir = level->getData(x, y, z) & 7; + bool replace = false; - if (!level->isSolidBlockingTile(x - 1, y, z) && dir == 1) replace = true; - if (!level->isSolidBlockingTile(x + 1, y, z) && dir == 2) replace = true; - if (!level->isSolidBlockingTile(x, y, z - 1) && dir == 3) replace = true; - if (!level->isSolidBlockingTile(x, y, z + 1) && dir == 4) replace = true; + if (!level->isSolidBlockingTile(x - 1, y, z) && dir == 1) replace = true; + if (!level->isSolidBlockingTile(x + 1, y, z) && dir == 2) replace = true; + if (!level->isSolidBlockingTile(x, y, z - 1) && dir == 3) replace = true; + if (!level->isSolidBlockingTile(x, y, z + 1) && dir == 4) replace = true; - if (replace) + if (replace) { - this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); - } - } + spawnResources(level, x, y, z, level->getData(x, y, z), 0); + level->removeTile(x, y, z); + } + } } bool ButtonTile::checkCanSurvive(Level *level, int x, int y, int z) { - if (!mayPlace(level, x, y, z)) + if (!mayPlace(level, x, y, z)) { - this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); - return false; - } - return true; + this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); + level->removeTile(x, y, z); + return false; + } + return true; } void ButtonTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param @@ -149,31 +150,31 @@ void ButtonTile::updateShape(LevelSource *level, int x, int y, int z, int forceD void ButtonTile::updateShape(int data) { - int dir = data & 7; - bool pressed = (data & 8) > 0; + int dir = data & 7; + bool pressed = (data & 8) > 0; - float h0 = 6 / 16.0f; - float h1 = 10 / 16.0f; - float r = 3 / 16.0f; - float d = 2 / 16.0f; - if (pressed) d = 1 / 16.0f; + float h0 = 6 / 16.0f; + float h1 = 10 / 16.0f; + float r = 3 / 16.0f; + float d = 2 / 16.0f; + if (pressed) d = 1 / 16.0f; - if (dir == 1) + if (dir == 1) { - setShape(0, h0, 0.5f - r, d, h1, 0.5f + r); - } + setShape(0, h0, 0.5f - r, d, h1, 0.5f + r); + } else if (dir == 2) { - setShape(1 - d, h0, 0.5f - r, 1, h1, 0.5f + r); - } + setShape(1 - d, h0, 0.5f - r, 1, h1, 0.5f + r); + } else if (dir == 3) { - setShape(0.5f - r, h0, 0, 0.5f + r, h1, d); - } + setShape(0.5f - r, h0, 0, 0.5f + r, h1, d); + } else if (dir == 4) { - setShape(0.5f - r, h0, 1 - d, 0.5f + r, h1, 1); - } + setShape(0.5f - r, h0, 1 - d, 0.5f + r, h1, 1); + } } void ButtonTile::attack(Level *level, int x, int y, int z, shared_ptr player) @@ -189,57 +190,58 @@ bool ButtonTile::TestUse() bool ButtonTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { - if( soundOnly) + if (soundOnly) { // 4J - added - just do enough to play the sound level->playSound(x + 0.5, y + 0.5, z + 0.5, eSoundType_RANDOM_CLICK, 0.3f, 0.6f); return false; } - int data = level->getData(x, y, z); - int dir = data & 7; - int open = 8 - (data & 8); - if (open == 0) return true; - level->setData(x, y, z, dir + open); - level->setTilesDirty(x, y, z, x, y, z); + int data = level->getData(x, y, z); + int dir = data & 7; + int open = 8 - (data & 8); + if (open == 0) return true; - level->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..39f957bd 100644 --- a/Minecraft.World/ChestTileEntity.cpp +++ b/Minecraft.World/ChestTileEntity.cpp @@ -1,19 +1,25 @@ -using namespace std; - #include "stdafx.h" #include "com.mojang.nbt.h" +#include "net.minecraft.world.h" #include "net.minecraft.world.level.h" #include "TileEntity.h" #include "net.minecraft.world.entity.item.h" #include "net.minecraft.world.entity.player.h" #include "net.minecraft.world.item.h" +#include "net.minecraft.world.inventory.h" #include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.phys.h" #include "ChestTileEntity.h" +#include "ContainerOpenPacket.h" #include "SoundTypes.h" +int ChestTileEntity::getContainerType() +{ + if (isBonusChest) return ContainerOpenPacket::BONUS_CHEST; + else return ContainerOpenPacket::CONTAINER; +} - -ChestTileEntity::ChestTileEntity(bool isBonusChest/* = false*/) : TileEntity() +void ChestTileEntity::_init(bool isBonusChest) { items = new ItemInstanceArray(9 * 4); @@ -24,6 +30,21 @@ ChestTileEntity::ChestTileEntity(bool isBonusChest/* = false*/) : TileEntity() oOpenness = 0.0f; openCount = 0; tickInterval = 0; + + type = -1; + name = L""; +} + +ChestTileEntity::ChestTileEntity(bool isBonusChest/* = false*/) : TileEntity() +{ + _init(isBonusChest); +} + +ChestTileEntity::ChestTileEntity(int type, bool isBonusChest/* = false*/) : TileEntity() +{ + _init(isBonusChest); + + this->type = type; } ChestTileEntity::~ChestTileEntity() @@ -50,7 +71,7 @@ shared_ptr ChestTileEntity::removeItem(unsigned int slot, int coun { shared_ptr item = items->data[slot]; items->data[slot] = nullptr; - this->setChanged(); + setChanged(); // 4J Stu - Fix for duplication glitch if(item->count <= 0) return nullptr; return item; @@ -59,7 +80,7 @@ shared_ptr ChestTileEntity::removeItem(unsigned int slot, int coun { shared_ptr i = items->data[slot]->remove(count); if (items->data[slot]->count == 0) items->data[slot] = nullptr; - this->setChanged(); + setChanged(); // 4J Stu - Fix for duplication glitch if(i->count <= 0) return nullptr; return i; @@ -86,11 +107,25 @@ void ChestTileEntity::setItem(unsigned int slot, shared_ptr item) this->setChanged(); } -int ChestTileEntity::getName() +wstring ChestTileEntity::getName() { - return 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); @@ -127,6 +163,7 @@ void ChestTileEntity::save(CompoundTag *base) } } base->put(L"Items", listTag); + if (hasCustomName()) base->putString(L"CustomName", name); base->putBoolean(L"bonus", isBonusChest); } @@ -149,127 +186,217 @@ void ChestTileEntity::setChanged() void ChestTileEntity::clearCache() { - TileEntity::clearCache(); - hasCheckedNeighbors = false; + TileEntity::clearCache(); + hasCheckedNeighbors = false; +} + +void ChestTileEntity::heyImYourNeighbor(shared_ptr neighbor, int from) +{ + if (neighbor->isRemoved()) + { + hasCheckedNeighbors = false; + } + else if (hasCheckedNeighbors) + { + switch (from) + { + case Direction::NORTH: + if (n.lock() != neighbor) hasCheckedNeighbors = false; + break; + case Direction::SOUTH: + if (s.lock() != neighbor) hasCheckedNeighbors = false; + break; + case Direction::EAST: + if (e.lock() != neighbor) hasCheckedNeighbors = false; + break; + case Direction::WEST: + if (w.lock() != neighbor) hasCheckedNeighbors = false; + break; + } + } } void ChestTileEntity::checkNeighbors() { - if (hasCheckedNeighbors) return; + if (hasCheckedNeighbors) return; - hasCheckedNeighbors = true; - n = weak_ptr(); - e = weak_ptr(); - w = weak_ptr(); - s = weak_ptr(); + hasCheckedNeighbors = true; + n = weak_ptr(); + e = weak_ptr(); + w = weak_ptr(); + s = weak_ptr(); - if (level->getTile(x - 1, y, z) == Tile::chest_Id) + if (isSameChest(x - 1, y, z)) { - w = dynamic_pointer_cast(level->getTileEntity(x - 1, y, z)); - } - if (level->getTile(x + 1, y, z) == Tile::chest_Id) + w = dynamic_pointer_cast(level->getTileEntity(x - 1, y, z)); + } + if (isSameChest(x + 1, y, z)) { - e = dynamic_pointer_cast(level->getTileEntity(x + 1, y, z)); - } - if (level->getTile(x, y, z - 1) == Tile::chest_Id) + e = dynamic_pointer_cast(level->getTileEntity(x + 1, y, z)); + } + if (isSameChest(x, y, z - 1)) { - n = dynamic_pointer_cast(level->getTileEntity(x, y, z - 1)); - } - if (level->getTile(x, y, z + 1) == Tile::chest_Id) + n = dynamic_pointer_cast(level->getTileEntity(x, y, z - 1)); + } + if (isSameChest(x, y, z + 1)) { - s = dynamic_pointer_cast(level->getTileEntity(x, y, z + 1)); - } + s = dynamic_pointer_cast(level->getTileEntity(x, y, z + 1)); + } - if (n.lock() != NULL) n.lock()->clearCache(); - if (s.lock() != NULL) s.lock()->clearCache(); - if (e.lock() != NULL) e.lock()->clearCache(); - if (w.lock() != NULL) w.lock()->clearCache(); + shared_ptr cteThis = dynamic_pointer_cast(shared_from_this()); + if (n.lock() != NULL) n.lock()->heyImYourNeighbor(cteThis, Direction::SOUTH); + if (s.lock() != NULL) s.lock()->heyImYourNeighbor(cteThis, Direction::NORTH); + if (e.lock() != NULL) e.lock()->heyImYourNeighbor(cteThis, Direction::WEST); + if (w.lock() != NULL) w.lock()->heyImYourNeighbor(cteThis, Direction::EAST); +} + +bool ChestTileEntity::isSameChest(int x, int y, int z) +{ + Tile *tile = Tile::tiles[level->getTile(x, y, z)]; + if (tile == NULL || !(dynamic_cast(tile) != NULL)) return false; + return ((ChestTile *) tile)->type == getType(); } void ChestTileEntity::tick() { - TileEntity::tick(); - checkNeighbors(); + TileEntity::tick(); + checkNeighbors(); - if (++tickInterval % 20 * 4 == 0) + ++tickInterval; + if (!level->isClientSide && openCount != 0 && (tickInterval + x + y + z) % (SharedConstants::TICKS_PER_SECOND * 10) == 0) { - //level->tileEvent(x, y, z, ChestTile::EVENT_SET_OPEN_COUNT, openCount); - } + // level.tileEvent(x, y, z, Tile.chest.id, ChestTile.EVENT_SET_OPEN_COUNT, openCount); - oOpenness = openness; + openCount = 0; - float speed = 0.10f; - if (openCount > 0 && openness == 0) - { - 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); + + 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)) + level->playSound(xc, y + 0.5, zc, eSoundType_RANDOM_CHEST_OPEN, 0.2f, level->random->nextFloat() * 0.1f + 0.9f); + } + } + if ((openCount == 0 && openness > 0) || (openCount > 0 && openness < 1)) { float oldOpen = openness; - if (openCount > 0) openness += speed; - else openness -= speed; - if (openness > 1) + if (openCount > 0) openness += speed; + else openness -= speed; + if (openness > 1) { - openness = 1; - } + openness = 1; + } float lim = 0.5f; - if (openness < lim && oldOpen >= lim) + if (openness < lim && oldOpen >= lim) { // Fix for #64546 - Customer Encountered: TU7: Chests placed by the Player are closing too fast. - //openness = 0; - if (n.lock() == NULL && w.lock() == NULL) + //openness = 0; + if (n.lock() == NULL && w.lock() == NULL) { - double xc = x + 0.5; - double zc = z + 0.5; - if (s.lock() != NULL) zc += 0.5; - if (e.lock() != NULL) xc += 0.5; + double xc = x + 0.5; + double zc = z + 0.5; + if (s.lock() != NULL) zc += 0.5; + if (e.lock() != NULL) xc += 0.5; // 4J-PB - Seems the chest open volume is much louder than other sounds from user reports. We'll tone it down a bit - level->playSound(xc, y + 0.5, zc, eSoundType_RANDOM_CHEST_CLOSE, 0.2f, level->random->nextFloat() * 0.1f + 0.9f); - } + level->playSound(xc, y + 0.5, zc, eSoundType_RANDOM_CHEST_CLOSE, 0.2f, level->random->nextFloat() * 0.1f + 0.9f); + } } - if (openness < 0) + if (openness < 0) { - openness = 0; - } - } + openness = 0; + } + } } -void ChestTileEntity::triggerEvent(int b0, int b1) +bool ChestTileEntity::triggerEvent(int b0, int b1) { - if (b0 == ChestTile::EVENT_SET_OPEN_COUNT) + if (b0 == ChestTile::EVENT_SET_OPEN_COUNT) { - openCount = b1; - } + openCount = b1; + return true; + } + return TileEntity::triggerEvent(b0, b1); } void ChestTileEntity::startOpen() { + if (openCount < 0) + { + openCount = 0; + } openCount++; - level->tileEvent(x, y, z, Tile::chest_Id, ChestTile::EVENT_SET_OPEN_COUNT, openCount); + level->tileEvent(x, y, z, getTile()->id, ChestTile::EVENT_SET_OPEN_COUNT, openCount); + level->updateNeighborsAt(x, y, z, getTile()->id); + level->updateNeighborsAt(x, y - 1, z, getTile()->id); } void ChestTileEntity::stopOpen() { + if (getTile() == NULL || !( dynamic_cast( getTile() ) != NULL)) return; openCount--; - level->tileEvent(x, y, z, Tile::chest_Id, ChestTile::EVENT_SET_OPEN_COUNT, openCount); + level->tileEvent(x, y, z, getTile()->id, ChestTile::EVENT_SET_OPEN_COUNT, openCount); + level->updateNeighborsAt(x, y, z, getTile()->id); + level->updateNeighborsAt(x, y - 1, z, getTile()->id); +} + +bool ChestTileEntity::canPlaceItem(int slot, shared_ptr item) +{ + return true; } void ChestTileEntity::setRemoved() { - clearCache(); - checkNeighbors(); - TileEntity::setRemoved(); + TileEntity::setRemoved(); + clearCache(); + checkNeighbors(); +} + +int ChestTileEntity::getType() +{ + if (type == -1) + { + if (level != NULL && dynamic_cast( getTile() ) != NULL) + { + type = ((ChestTile *) getTile())->type; + } + else + { + return ChestTile::TYPE_BASIC; + } + } + + return type; } // 4J Added diff --git a/Minecraft.World/ChestTileEntity.h b/Minecraft.World/ChestTileEntity.h index 5eeb3c44..77c11e99 100644 --- a/Minecraft.World/ChestTileEntity.h +++ b/Minecraft.World/ChestTileEntity.h @@ -16,10 +16,16 @@ public: eINSTANCEOF GetType() { return eTYPE_CHESTTILEENTITY; } static TileEntity *create() { return new ChestTileEntity(); } -using TileEntity::setChanged; + int getContainerType(); // 4J-Added; + + using TileEntity::setChanged; + +private: + void _init(bool isBonusChest); public: ChestTileEntity(bool isBonusChest = false); // 4J added param + ChestTileEntity(int type, bool isBonusChest = false); // 4J added param virtual ~ChestTileEntity(); private: @@ -28,35 +34,53 @@ private: public: bool isBonusChest; // 4J added bool hasCheckedNeighbors; - weak_ptr n; - weak_ptr e; - weak_ptr w; - weak_ptr s; + weak_ptr n; + weak_ptr e; + weak_ptr w; + weak_ptr s; float openness, oOpenness; int openCount; private: int tickInterval; + int type; + wstring name; + public: virtual unsigned int getContainerSize(); virtual shared_ptr getItem(unsigned int slot); virtual shared_ptr removeItem(unsigned int slot, int count); virtual shared_ptr removeItemNoUpdate(int slot); virtual void setItem(unsigned int slot, shared_ptr item); - virtual int getName(); + virtual wstring getName(); + virtual wstring getCustomName(); + virtual bool hasCustomName(); + virtual void setCustomName(const wstring &name); virtual void load(CompoundTag *base); virtual void save(CompoundTag *base); virtual int getMaxStackSize(); virtual bool stillValid(shared_ptr player); virtual void setChanged(); virtual void clearCache(); - virtual void checkNeighbors(); - virtual void tick(); - virtual void triggerEvent(int b0, int b1); - virtual void startOpen(); - virtual void stopOpen(); - virtual void setRemoved(); + +private: + virtual void heyImYourNeighbor(shared_ptr neighbor, int from); + +public: + virtual void checkNeighbors(); + +private: + bool isSameChest(int x, int y, int z); + +public: + virtual void tick(); + virtual bool triggerEvent(int b0, int b1); + virtual void startOpen(); + virtual void stopOpen(); + virtual bool canPlaceItem(int slot, shared_ptr item); + virtual void setRemoved(); + virtual int getType(); // 4J Added virtual shared_ptr clone(); diff --git a/Minecraft.World/Chicken.cpp b/Minecraft.World/Chicken.cpp index 0104b2bf..5f4cf2a7 100644 --- a/Minecraft.World/Chicken.cpp +++ b/Minecraft.World/Chicken.cpp @@ -1,6 +1,8 @@ #include "stdafx.h" #include "com.mojang.nbt.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.ai.goal.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.phys.h" #include "net.minecraft.world.level.h" @@ -24,22 +26,19 @@ Chicken::Chicken(Level *level) : Animal( level ) { // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called this->defineSynchedData(); - - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); + registerAttributes(); + setHealth(getMaxHealth()); _init(); - this->textureIdx = TN_MOB_CHICKEN; // 4J - was L"/mob/chicken.png"; - this->setSize(0.3f, 0.7f); // 4J Changed from 0.4 to 0.7 in 1.8.2 + setSize(0.3f, 0.7f); // 4J Changed from 0.4 to 0.7 in 1.8.2 eggTime = random->nextInt(20 * 60 * 5) + 20 * 60 * 5; - float walkSpeed = 0.25f; goalSelector.addGoal(0, new FloatGoal(this)); - goalSelector.addGoal(1, new PanicGoal(this, 0.38f)); - goalSelector.addGoal(2, new BreedGoal(this, walkSpeed)); - goalSelector.addGoal(3, new TemptGoal(this, 0.25f, Item::seeds_wheat_Id, false)); - goalSelector.addGoal(4, new FollowParentGoal(this, 0.28f)); - goalSelector.addGoal(5, new RandomStrollGoal(this, walkSpeed)); + goalSelector.addGoal(1, new PanicGoal(this, 1.4)); + goalSelector.addGoal(2, new BreedGoal(this, 1.0)); + goalSelector.addGoal(3, new TemptGoal(this, 1.0, Item::seeds_wheat_Id, false)); + goalSelector.addGoal(4, new FollowParentGoal(this, 1.1)); + goalSelector.addGoal(5, new RandomStrollGoal(this, 1.0)); goalSelector.addGoal(6, new LookAtPlayerGoal(this, typeid(Player), 6)); goalSelector.addGoal(7, new RandomLookAroundGoal(this)); } @@ -49,9 +48,12 @@ bool Chicken::useNewAi() return true; } -int Chicken::getMaxHealth() +void Chicken::registerAttributes() { - return 4; + Animal::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(4); + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.25f); } void Chicken::aiStep() @@ -79,7 +81,7 @@ void Chicken::aiStep() { if (!level->isClientSide && --eggTime <= 0) { - level->playSound(shared_from_this(), eSoundType_MOB_CHICKENPLOP, 1.0f, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f); + playSound( eSoundType_MOB_CHICKENPLOP, 1.0f, (random->nextFloat() - random->nextFloat()) * 0.2f + 1.0f); spawnAtLocation(Item::egg->id, 1); eggTime = random->nextInt(20 * 60 * 5) + 20 * 60 * 5; } @@ -107,6 +109,11 @@ int Chicken::getDeathSound() return eSoundType_MOB_CHICKEN_HURT; } +void Chicken::playStepSound(int xt, int yt, int zt, int t) +{ + playSound(eSoundType_MOB_CHICKEN_STEP, 0.15f, 1); +} + int Chicken::getDeathLoot() { return Item::feather->id; @@ -146,5 +153,5 @@ shared_ptr Chicken::getBreedOffspring(shared_ptr target) bool Chicken::isFood(shared_ptr itemInstance) { - return (itemInstance->id == Item::seeds_wheat_Id) || (itemInstance->id == Item::netherStalkSeeds_Id) || (itemInstance->id == Item::seeds_melon_Id) || (itemInstance->id == Item::seeds_pumpkin_Id); + return (itemInstance->id == Item::seeds_wheat_Id) || (itemInstance->id == Item::netherwart_seeds_Id) || (itemInstance->id == Item::seeds_melon_Id) || (itemInstance->id == Item::seeds_pumpkin_Id); } diff --git a/Minecraft.World/Chicken.h b/Minecraft.World/Chicken.h index a162a5eb..0f406219 100644 --- a/Minecraft.World/Chicken.h +++ b/Minecraft.World/Chicken.h @@ -24,7 +24,11 @@ private: public: Chicken(Level *level); virtual bool useNewAi(); - virtual int getMaxHealth(); + +protected: + void registerAttributes(); + +public: virtual void aiStep(); protected: @@ -32,6 +36,7 @@ protected: virtual int getAmbientSound(); virtual int getHurtSound(); virtual int getDeathSound(); + virtual void playStepSound(int xt, int yt, int zt, int t); virtual int getDeathLoot(); virtual void dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel); diff --git a/Minecraft.World/ChunkSource.h b/Minecraft.World/ChunkSource.h index 242f30a0..c537651c 100644 --- a/Minecraft.World/ChunkSource.h +++ b/Minecraft.World/ChunkSource.h @@ -8,16 +8,30 @@ class TilePos; #ifdef _LARGE_WORLDS // 4J Stu - Our default map (at zoom level 3) is 1024x1024 blocks (or 64 chunks) #define LEVEL_MAX_WIDTH (5*64) //(6*54) + +#define LEVEL_WIDTH_CLASSIC 54 +#define LEVEL_WIDTH_SMALL 64 +#define LEVEL_WIDTH_MEDIUM (3*64) +#define LEVEL_WIDTH_LARGE (5*64) + #else #define LEVEL_MAX_WIDTH 54 #endif #define LEVEL_MIN_WIDTH 54 #define LEVEL_LEGACY_WIDTH 54 + + // Scale was 8 in the Java game, but that would make our nether tiny // Every 1 block you move in the nether maps to HELL_LEVEL_SCALE blocks in the overworld #ifdef _LARGE_WORLDS #define HELL_LEVEL_MAX_SCALE 8 + +#define HELL_LEVEL_SCALE_CLASSIC 3 +#define HELL_LEVEL_SCALE_SMALL 3 +#define HELL_LEVEL_SCALE_MEDIUM 6 +#define HELL_LEVEL_SCALE_LARGE 8 + #else #define HELL_LEVEL_MAX_SCALE 3 #endif @@ -39,29 +53,42 @@ class ChunkSource public: // 4J Added so that we can store the maximum dimensions of this world int m_XZSize; +#ifdef _LARGE_WORLDS + bool m_classicEdgeMoat; + bool m_smallEdgeMoat; + bool m_mediumEdgeMoat; +#endif public: virtual ~ChunkSource() {} - virtual bool hasChunk(int x, int y) = 0; + virtual bool hasChunk(int x, int y) = 0; virtual bool reallyHasChunk(int x, int y) { return hasChunk(x,y); } // 4J added - virtual LevelChunk *getChunk(int x, int z) = 0; + virtual LevelChunk *getChunk(int x, int z) = 0; virtual void lightChunk(LevelChunk *lc) {} // 4J added - virtual LevelChunk *create(int x, int z) = 0; - virtual void postProcess(ChunkSource *parent, int x, int z) = 0; + virtual LevelChunk *create(int x, int z) = 0; + virtual void postProcess(ChunkSource *parent, int x, int z) = 0; virtual bool saveAllEntities() { return false; } // 4J Added - virtual bool save(bool force, ProgressListener *progressListener) = 0; - virtual bool tick() = 0; - virtual bool shouldSave() = 0; + virtual bool save(bool force, ProgressListener *progressListener) = 0; + virtual bool tick() = 0; + virtual bool shouldSave() = 0; virtual LevelChunk **getCache() { return NULL; } // 4J added virtual void dataReceived(int x, int z) {} // 4J added - /** - * Returns some stats that are rendered when the user holds F3. - */ - virtual wstring gatherStats() = 0; + /** + * Returns some stats that are rendered when the user holds F3. + */ + virtual wstring gatherStats() = 0; virtual vector *getMobsAt(MobCategory *mobCategory, int x, int y, int z) = 0; - virtual TilePos *findNearestMapFeature(Level *level, const wstring& featureName, int x, int y, int z) = 0; + virtual TilePos *findNearestMapFeature(Level *level, const wstring& featureName, int x, int y, int z) = 0; + + /** + * Recreates "logic structures" for a chunk that has been loaded from disk. + * For example, fortress bridges in the Nether. + */ + virtual void recreateLogicStructuresForChunk(int chunkX, int chunkZ) = 0; + + // virtual void flushSave() = 0; // 4J removed }; diff --git a/Minecraft.World/Class.h b/Minecraft.World/Class.h index 5dbbf965..31fc4dad 100644 --- a/Minecraft.World/Class.h +++ b/Minecraft.World/Class.h @@ -7,117 +7,244 @@ class InputStream; // simplify declaring classes with this added functionality. +// 0b FFFF CCCC CCCC CCCC CCCC CCCC CCEE EEEE +// |||| |||| |||| |||| |||| |||| |||| |||| +// |||| |||| |||| |||| |||| |||| |||| |||\- BIT00: ENUM: +// |||| |||| |||| |||| |||| |||| |||| ||\-- BIT01: ENUM: +// |||| |||| |||| |||| |||| |||| |||| |\--- BIT02: ENUM: +// |||| |||| |||| |||| |||| |||| |||| \---- BIT03: ENUM: +// |||| |||| |||| |||| |||| |||| |||| +// |||| |||| |||| |||| |||| |||| |||\------ BIT04: ENUM: +// |||| |||| |||| |||| |||| |||| ||\------- BIT05: ENUM: +// |||| |||| |||| |||| |||| |||| |\-------- BIT06: CLASS: WATER_MOB +// |||| |||| |||| |||| |||| |||| \--------- BIT07: CLASS: AMBIENT_MOB +// |||| |||| |||| |||| |||| |||| +// |||| |||| |||| |||| |||| |||\----------- BIT08: CLASS: !ENTITY (so we can hide TILE_ENTITY and DISPENSER_TILE_ENTITY bits which aren't relevant for entities) +// |||| |||| |||| |||| |||| ||\------------ BIT09: CLASS: MINECART_CONTAINER +// |||| |||| |||| |||| |||| |\------------- BIT10: CLASS: SLIME +// |||| |||| |||| |||| |||| \-------------- BIT11: CLASS: ZOMBIE +// |||| |||| |||| |||| |||| +// |||| |||| |||| |||| |||\---------------- BIT12: CLASS: SPIDER +// |||| |||| |||| |||| ||\----------------- BIT13: CLASS: COW +// |||| |||| |||| |||| |\------------------ BIT14: CLASS: TAMABLE +// |||| |||| |||| |||| \------------------- BIT15: CLASS: ANIMAL +// |||| |||| |||| |||| +// |||| |||| |||| |||\--------------------- BIT16: CLASS: MONSTER +// |||| |||| |||| ||\---------------------- BIT17: CLASS: GOLEM +// |||| |||| |||| |\----------------------- BIT18: CLASS: AGABLE_MOB +// |||| |||| |||| \------------------------ BIT19: CLASS: PATHFINDER_MOB +// |||| |||| |||| +// |||| |||| |||\-------------------------- BIT20: CLASS: PLAYER +// |||| |||| ||\--------------------------- BIT21: CLASS: MOB +// |||| |||| |\---------------------------- BIT22: CLASS: HANGING_ENTITY +// |||| |||| \----------------------------- BIT23: CLASS: THROWABLE +// |||| |||| +// |||| |||\------------------------------- BIT24: CLASS: FIREBALL +// |||| ||\-------------------------------- BIT25: CLASS: MINECART +// |||| |\--------------------------------- BIT26: CLASS: LIVING_ENTITY +// |||| \---------------------------------- BIT27: CLASS: ENTITY +// |||| +// |||\------------------------------------ BIT28: FLAGS: valid in spawner flag +// ||\------------------------------------- BIT29: FLAGS: Spawnlimitcheck +// |\-------------------------------------- BIT30: FLAGS: Enemy +// \--------------------------------------- BIT31: FLAGS: projectile + + +#define Bit(a) ((1)<<(a)) + +const unsigned int BIT_NOT_LIVING_ENTITY = Bit(25); + +// Classes + +const unsigned int BIT_FLYING_MOB = Bit( 9); +const unsigned int BIT_WATER_MOB = Bit(10); +const unsigned int BIT_AMBIENT_MOB = Bit(11); + +const unsigned int BIT_NOT_ENTITY = Bit(12); +const unsigned int BIT_SLIME = Bit(13); +const unsigned int BIT_ZOMBIE = Bit(14); +const unsigned int BIT_SPIDER = Bit(15); + +const unsigned int BIT_COW = Bit(16); +const unsigned int BIT_TAMABLE = Bit(17); +const unsigned int BIT_ANIMAL = Bit(18); +const unsigned int BIT_MONSTER = Bit(19); const unsigned int BIT_MINECART_CONTAINER = Bit(19) | BIT_NOT_LIVING_ENTITY; + +const unsigned int BIT_GOLEM = Bit(20); const unsigned int BIT_HANGING_ENTITY = Bit(20) | BIT_NOT_LIVING_ENTITY; +const unsigned int BIT_AGABLE_MOB = Bit(21); const unsigned int BIT_THROWABLE = Bit(21) | BIT_NOT_LIVING_ENTITY; +const unsigned int BIT_PATHFINDER_MOB = Bit(22); const unsigned int BIT_FIREBALL = Bit(22) | BIT_NOT_LIVING_ENTITY; +const unsigned int BIT_PLAYER = Bit(23); const unsigned int BIT_MINECART = Bit(23) | BIT_NOT_LIVING_ENTITY; + +const unsigned int BIT_MOB = Bit(24); const unsigned int BIT_GLOBAL_ENTITY = Bit(24) | BIT_NOT_LIVING_ENTITY; +//const unsigned int BIT_NOT_LIVING_ENTITY = Bit(25); +const unsigned int BIT_LIVING_ENTITY = Bit(26); +const unsigned int BIT_ENTITY = Bit(27); + +// Flags +const unsigned int BIT_VALID_IN_SPAWNER = Bit(28); +const unsigned int BIT_ANIMALS_SPAWN_LIMIT_CHECK = Bit(29); +const unsigned int BIT_ENEMY = Bit(30); +const unsigned int BIT_PROJECTILE = Bit(31U); + +// Tile Entities +const unsigned int BIT_TILE_ENTITY = Bit(24) | BIT_NOT_ENTITY; +const unsigned int BIT_DISPENSERTILEENTITY = Bit(25) | BIT_NOT_ENTITY; +const unsigned int BIT_OTHER_NOT_ENTITIES = Bit(26) | BIT_NOT_ENTITY; + + +// 4J-JEV: These abstract classes only have one subclass, so ignore them. +//const unsigned int BIT_WATER_MOB = Bit(15); +//const unsigned int BIT_FLYING_MOB = Bit(17); +//const unsigned int BIT_AMBIENT_MOB = Bit(18); +//const unsigned int BIT_GLOBAL_ENTITY = Bit(); + +// #define ETYPE(a,b,c) ( (a) | (b) | (c) ) + // 4J Stu - This Enum can be used as a more lightweight version of the above, without having do dynamic casts // 4J-PB - for replacement of instanceof enum eINSTANCEOF { eTYPE_NOTSET=0, + + // Flags. + eTYPE_VALID_IN_SPAWNER_FLAG = BIT_VALID_IN_SPAWNER, + eTYPE_ANIMALS_SPAWN_LIMIT_CHECK = BIT_ANIMALS_SPAWN_LIMIT_CHECK, + eTYPE_ENEMY = BIT_ENEMY, + eTYPE_PROJECTILE = BIT_PROJECTILE, - // 4J-RR arranging these pathfinder types in a bitfield fashion so that a single and can determine whether they are derived from - // the 3 subclasses of pathfinders (water animals, animals, and monsters) that the mob spawner uses - eTYPE_WATERANIMAL = 0x100, - eTYPE_SQUID = 0x101, + eTYPE_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..674f15db 100644 --- a/Minecraft.World/CompoundContainer.cpp +++ b/Minecraft.World/CompoundContainer.cpp @@ -1,6 +1,6 @@ #include "stdafx.h" #include "net.minecraft.world.entity.player.h" - +#include "ContainerOpenPacket.h" #include "CompoundContainer.h" CompoundContainer::CompoundContainer(int name, shared_ptr c1, shared_ptr c2) @@ -12,14 +12,38 @@ CompoundContainer::CompoundContainer(int name, shared_ptr c1, shared_ this->c2 = c2; } +int CompoundContainer::getContainerType() +{ + return ContainerOpenPacket::LARGE_CHEST; +} + unsigned int CompoundContainer::getContainerSize() { return c1->getContainerSize() + c2->getContainerSize(); } -int CompoundContainer::getName() +bool CompoundContainer::contains(shared_ptr c) { - return 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) @@ -72,4 +96,9 @@ void CompoundContainer::stopOpen() { c1->stopOpen(); c2->stopOpen(); +} + +bool CompoundContainer::canPlaceItem(int slot, shared_ptr item) +{ + return true; } \ No newline at end of file diff --git a/Minecraft.World/CompoundContainer.h b/Minecraft.World/CompoundContainer.h index b0b8b934..126a712a 100644 --- a/Minecraft.World/CompoundContainer.h +++ b/Minecraft.World/CompoundContainer.h @@ -14,23 +14,21 @@ private: public: CompoundContainer(int name, shared_ptr c1, shared_ptr c2); - unsigned int getContainerSize(); - - int getName(); - - shared_ptr getItem(unsigned int slot); - - shared_ptr removeItem(unsigned int slot, int i); - shared_ptr removeItemNoUpdate(int slot); - - void setItem(unsigned int slot, shared_ptr item); - - int getMaxStackSize(); - - void setChanged(); - - bool stillValid(shared_ptr player); + virtual int getContainerType(); + virtual unsigned int getContainerSize(); + virtual bool contains(shared_ptr c); + virtual wstring getName(); + virtual wstring getCustomName(); + virtual bool hasCustomName(); + virtual shared_ptr getItem(unsigned int slot); + virtual shared_ptr removeItem(unsigned int slot, int i); + virtual shared_ptr removeItemNoUpdate(int slot); + virtual void setItem(unsigned int slot, shared_ptr item); + virtual int getMaxStackSize(); + virtual void setChanged(); + virtual bool stillValid(shared_ptr player); virtual void startOpen(); virtual void stopOpen(); + virtual bool canPlaceItem(int slot, shared_ptr item); }; \ No newline at end of file diff --git a/Minecraft.World/CompoundTag.h b/Minecraft.World/CompoundTag.h index 32c31583..29d35041 100644 --- a/Minecraft.World/CompoundTag.h +++ b/Minecraft.World/CompoundTag.h @@ -20,7 +20,7 @@ public: CompoundTag() : Tag(L"") {} CompoundTag(const wstring &name) : Tag(name) {} - void write(DataOutput *dos) + void write(DataOutput *dos) { AUTO_VAR(itEnd, tags.end()); for( unordered_map::iterator it = tags.begin(); it != itEnd; it++ ) @@ -28,180 +28,188 @@ public: Tag::writeNamedTag(it->second, dos); } dos->writeByte(Tag::TAG_End); - } + } - void load(DataInput *dis) + void load(DataInput *dis, int tagDepth) { - tags.clear(); - Tag *tag; - while ((tag = Tag::readNamedTag(dis))->getId() != Tag::TAG_End) + if(tagDepth > MAX_DEPTH) + { +#ifndef _CONTENT_PACKAGE + printf("Tried to read NBT tag with too high complexity, depth > %d" , MAX_DEPTH); + __debugbreak(); +#endif + return; + } + tags.clear(); + Tag *tag; + while ((tag = Tag::readNamedTag(dis))->getId() != Tag::TAG_End) { tags[tag->getName()] = tag; - } + } delete tag; - } + } - vector *getAllTags() // 4J - was collection + vector *getAllTags() // 4J - was collection { // 4J - was return tags.values(); vector *ret = new vector; - + AUTO_VAR(itEnd, tags.end()); for( unordered_map::iterator it = tags.begin(); it != itEnd; it++ ) { ret->push_back(it->second); } - return ret; - } + return ret; + } - byte getId() + byte getId() { - return TAG_Compound; - } + return TAG_Compound; + } - void put(wchar_t *name, Tag *tag) + void put(const wstring &name, Tag *tag) { - tags[name] = tag->setName(wstring( name )); - } + tags[name] = tag->setName(name); + } - void putByte(wchar_t * name, byte value) + void putByte(const wstring &name, byte value) { - tags[name] = (new ByteTag(name,value)); - } + tags[name] = (new ByteTag(name,value)); + } - void putShort(wchar_t * name, short value) + void putShort(const wstring &name, short value) { - tags[name] = (new ShortTag(name,value)); - } + tags[name] = (new ShortTag(name,value)); + } - void putInt(wchar_t * name, int value) + void putInt(const wstring &name, int value) { - tags[name] = (new IntTag(name,value)); - } + tags[name] = (new IntTag(name,value)); + } - void putLong(wchar_t * name, __int64 value) + void putLong(const wstring &name, __int64 value) { - tags[name] = (new LongTag(name,value)); - } + tags[name] = (new LongTag(name,value)); + } - void putFloat(wchar_t * name, float value) + void putFloat(const wstring &name, float value) { - tags[name] = (new FloatTag(name,value)); - } + tags[name] = (new FloatTag(name,value)); + } - void putDouble(wchar_t * name, double value) + void putDouble(const wstring &name, double value) { - tags[name] = (new DoubleTag(name,value)); - } + tags[name] = (new DoubleTag(name,value)); + } - void putString(wchar_t *name, const wstring& value) + void putString(const wstring &name, const wstring& value) { - tags[name] = (new StringTag(name,value)); - } + tags[name] = (new StringTag(name,value)); + } - void putByteArray(wchar_t * name, byteArray value) + void putByteArray(const wstring &name, byteArray value) { - tags[name] = (new ByteArrayTag(name,value)); - } + tags[name] = (new ByteArrayTag(name,value)); + } - void putIntArray(wchar_t * name, intArray value) + void putIntArray(const wstring &name, intArray value) { tags[name] = (new IntArrayTag(name, value)); } - void putCompound(wchar_t * name, CompoundTag *value) + void putCompound(const wstring &name, CompoundTag *value) { - tags[name] = value->setName( wstring( name ) ); - } + tags[name] = value->setName( wstring( name ) ); + } - void putBoolean(wchar_t * string, bool val) + void putBoolean(const wstring &name, bool val) { - putByte(string, val?(byte)1:0); - } + putByte(name, val?(byte)1:0); + } - Tag *get(wchar_t *name) + Tag *get(const wstring &name) { AUTO_VAR(it, tags.find(name)); if(it != tags.end()) return it->second; return NULL; - } - - bool contains(wchar_t * name) + } + + bool contains(const wstring &name) { return tags.find(name) != tags.end(); - } + } - byte getByte(wchar_t * name) + byte getByte(const wstring &name) { - if (tags.find(name) == tags.end()) return (byte)0; - return ((ByteTag *) tags[name])->data; - } + if (tags.find(name) == tags.end()) return (byte)0; + return ((ByteTag *) tags[name])->data; + } - short getShort(wchar_t * name) + short getShort(const wstring &name) { - if (tags.find(name) == tags.end()) return (short)0; - return ((ShortTag *) tags[name])->data; - } + if (tags.find(name) == tags.end()) return (short)0; + return ((ShortTag *) tags[name])->data; + } - int getInt(wchar_t * name) + int getInt(const wstring &name) { - if (tags.find(name) == tags.end()) return (int)0; - return ((IntTag *) tags[name])->data; - } + if (tags.find(name) == tags.end()) return (int)0; + return ((IntTag *) tags[name])->data; + } - __int64 getLong(wchar_t * name) + __int64 getLong(const wstring &name) { - if (tags.find(name) == tags.end()) return (__int64)0; - return ((LongTag *) tags[name])->data; - } + if (tags.find(name) == tags.end()) return (__int64)0; + return ((LongTag *) tags[name])->data; + } - float getFloat(wchar_t * name) + float getFloat(const wstring &name) { - if (tags.find(name) == tags.end()) return (float)0; - return ((FloatTag *) tags[name])->data; - } + if (tags.find(name) == tags.end()) return (float)0; + return ((FloatTag *) tags[name])->data; + } - double getDouble(wchar_t * name) + double getDouble(const wstring &name) { - if (tags.find(name) == tags.end()) return (double)0; - return ((DoubleTag *) tags[name])->data; - } + if (tags.find(name) == tags.end()) return (double)0; + return ((DoubleTag *) tags[name])->data; + } - wstring getString(wchar_t * name) + wstring getString(const wstring &name) { - if (tags.find(name) == tags.end()) return wstring( L"" ); - return ((StringTag *) tags[name])->data; - } + if (tags.find(name) == tags.end()) return wstring( L"" ); + return ((StringTag *) tags[name])->data; + } - byteArray getByteArray(wchar_t * name) + byteArray getByteArray(const wstring &name) { - if (tags.find(name) == tags.end()) return byteArray(); - return ((ByteArrayTag *) tags[name])->data; - } + if (tags.find(name) == tags.end()) return byteArray(); + return ((ByteArrayTag *) tags[name])->data; + } - intArray getIntArray(wchar_t * name) + intArray getIntArray(const wstring &name) { - if (tags.find(name) == tags.end()) return intArray(0); + if (tags.find(name) == tags.end()) return intArray(); return ((IntArrayTag *) tags[name])->data; } - CompoundTag *getCompound(wchar_t * name) + CompoundTag *getCompound(const wstring &name) { - if (tags.find(name) == tags.end()) return new CompoundTag(name); - return (CompoundTag *) tags[name]; - } + if (tags.find(name) == tags.end()) return new CompoundTag(name); + return (CompoundTag *) tags[name]; + } - ListTag *getList(wchar_t * name) + ListTag *getList(const wstring &name) { - if (tags.find(name) == tags.end()) return new ListTag(name); - return (ListTag *) tags[name]; - } + if (tags.find(name) == tags.end()) return new ListTag(name); + return (ListTag *) tags[name]; + } - bool getBoolean(wchar_t *string) + bool getBoolean(const wstring &string) { - return getByte(string)!=0; - } + return getByte(string)!=0; + } void remove(const wstring &name) { @@ -210,38 +218,38 @@ public: //tags.remove(name); } - wstring toString() + wstring toString() { static const int bufSize = 32; static wchar_t buf[bufSize]; swprintf(buf,bufSize,L"%d entries",tags.size()); return wstring( buf ); - } + } - void print(char *prefix, ostream out) + void print(char *prefix, ostream out) { /* - Tag::print(prefix, out); + Tag::print(prefix, out); out << prefix << "{" << endl; char *newPrefix = new char[ strlen(prefix) + 4 ]; strcpy( newPrefix, prefix); strcat( newPrefix, " "); - + AUTO_VAR(itEnd, tags.end()); for( unordered_map::iterator it = tags.begin(); it != itEnd; it++ ) { - it->second->print(newPrefix, out); + it->second->print(newPrefix, out); } delete[] newPrefix; out << prefix << "}" << endl; */ - } + } - bool isEmpty() + bool isEmpty() { return tags.empty(); - } + } virtual ~CompoundTag() { @@ -255,7 +263,7 @@ public: Tag *copy() { CompoundTag *tag = new CompoundTag(getName()); - + AUTO_VAR(itEnd, tags.end()); for( AUTO_VAR(it, tags.begin()); it != itEnd; it++ ) { diff --git a/Minecraft.World/CompressedTileStorage.cpp b/Minecraft.World/CompressedTileStorage.cpp index 896bd58d..12c1ba3b 100644 --- a/Minecraft.World/CompressedTileStorage.cpp +++ b/Minecraft.World/CompressedTileStorage.cpp @@ -11,6 +11,7 @@ static const int sc_maxCompressTiles = 64; static CompressedTileStorage_compress_dataIn g_compressTileDataIn[sc_maxCompressTiles] __attribute__((__aligned__(16))); static int g_currentCompressTiles = 0; +//#define DISABLE_SPU_CODE #endif //__PS3__ // Note: See header for an overview of this class diff --git a/Minecraft.World/Connection.cpp b/Minecraft.World/Connection.cpp index 4392fe54..09f72be0 100644 --- a/Minecraft.World/Connection.cpp +++ b/Minecraft.World/Connection.cpp @@ -174,8 +174,10 @@ void Connection::send(shared_ptr packet) void Connection::queueSend(shared_ptr packet) { if (quitting) return; + EnterCriticalSection(&writeLock); estimatedRemaining += packet->getEstimatedSize() + 1; outgoing_slow.push(packet); + LeaveCriticalSection(&writeLock); } bool Connection::writeTick() @@ -204,8 +206,20 @@ bool Connection::writeTick() #ifndef _CONTENT_PACKAGE // 4J Added for debugging + int playerId = 0; if( !socket->isLocal() ) - Packet::recordOutgoingPacket(packet); + { + Socket *socket = getSocket(); + if( socket ) + { + INetworkPlayer *player = socket->getPlayer(); + if( player ) + { + playerId = player->GetSmallId(); + } + } + Packet::recordOutgoingPacket(packet,playerId); + } #endif // 4J Stu - Changed this so that rather than writing to the network stream through a buffered stream we want to: @@ -241,7 +255,11 @@ bool Connection::writeTick() // 4J Stu - Changed this so that rather than writing to the network stream through a buffered stream we want to: // a) Only push whole "game" packets to QNet, rather than amalgamated chunks of data that may include many packets, and partial packets // b) To be able to change the priority and queue of a packet if required +#ifdef _XBOX int flags = QNET_SENDDATA_LOW_PRIORITY | QNET_SENDDATA_SECONDARY; +#else + int flags = NON_QNET_SENDDATA_ACK_REQUIRED; +#endif sos->writeWithFlags( baos->buf, 0, baos->size(), flags ); baos->reset(); } @@ -253,7 +271,22 @@ bool Connection::writeTick() #ifndef _CONTENT_PACKAGE // 4J Added for debugging if( !socket->isLocal() ) - Packet::recordOutgoingPacket(packet); + { + int playerId = 0; + if( !socket->isLocal() ) + { + Socket *socket = getSocket(); + if( socket ) + { + INetworkPlayer *player = socket->getPlayer(); + if( player ) + { + playerId = player->GetSmallId(); + } + } + Packet::recordOutgoingPacket(packet,playerId); + } + } #endif writeSizes[packet->getId()] += packet->getEstimatedSize() + 1; diff --git a/Minecraft.World/ConsoleSaveFileConverter.cpp b/Minecraft.World/ConsoleSaveFileConverter.cpp index 9a3d572d..16b025a5 100644 --- a/Minecraft.World/ConsoleSaveFileConverter.cpp +++ b/Minecraft.World/ConsoleSaveFileConverter.cpp @@ -133,7 +133,9 @@ void ConsoleSaveFileConverter::ConvertSave(ConsoleSaveFile *sourceSave, ConsoleS if(progress) { +#ifndef _WINDOWS64 progress->progressStage(IDS_SAVETRANSFER_STAGE_CONVERTING); +#endif } // Overworld @@ -167,10 +169,11 @@ void ConsoleSaveFileConverter::ConvertSave(ConsoleSaveFile *sourceSave, ConsoleS bos.flush(); dos->close(); dos->deleteChildStream(); - delete dos; + delete dos; + dis->deleteChildStream(); + delete dis; } - delete dis; ++currentProgress; if(progress) progress->progressStagePercentage( (currentProgress*100)/progressTarget); @@ -212,9 +215,10 @@ void ConsoleSaveFileConverter::ConvertSave(ConsoleSaveFile *sourceSave, ConsoleS dos->close(); dos->deleteChildStream(); delete dos; + dis->deleteChildStream(); + delete dis; } - delete dis; ++currentProgress; if(progress) progress->progressStagePercentage((currentProgress*100)/progressTarget); @@ -254,9 +258,10 @@ void ConsoleSaveFileConverter::ConvertSave(ConsoleSaveFile *sourceSave, ConsoleS dos->close(); dos->deleteChildStream(); delete dos; + dis->deleteChildStream(); + delete dis; } - delete dis; ++currentProgress; if(progress) progress->progressStagePercentage((currentProgress*100)/progressTarget); diff --git a/Minecraft.World/ConsoleSaveFileOriginal.cpp b/Minecraft.World/ConsoleSaveFileOriginal.cpp index 139d99ac..c07808d4 100644 --- a/Minecraft.World/ConsoleSaveFileOriginal.cpp +++ b/Minecraft.World/ConsoleSaveFileOriginal.cpp @@ -637,6 +637,15 @@ void ConsoleSaveFileOriginal::Flush(bool autosave, bool updateThumbnail ) { LockSaveAccess(); +#ifdef __PSVITA__ + // On Vita we've had problems with saves being corrupted on rapid save/save-exiting so seems prudent to wait for idle + while( StorageManager.GetSaveState() != C4JStorage::ESaveGame_Idle ) + { + app.DebugPrintf("Flush wait\n"); + Sleep(10); + } +#endif + finalizeWrite(); // Get the frequency of the timer diff --git a/Minecraft.World/ConsoleSaveFileSplit.cpp b/Minecraft.World/ConsoleSaveFileSplit.cpp deleted file mode 100644 index 2d83f217..00000000 --- a/Minecraft.World/ConsoleSaveFileSplit.cpp +++ /dev/null @@ -1,1711 +0,0 @@ -#include "stdafx.h" -#include "StringHelpers.h" -#include "ConsoleSaveFileSplit.h" -#include "ConsoleSaveFileConverter.h" -#include "File.h" -#include -#include "compression.h" -#include "..\Minecraft.Client\Minecraft.h" -#include "..\Minecraft.Client\MinecraftServer.h" -#include "..\Minecraft.Client\ServerLevel.h" -#include "..\Minecraft.World\net.minecraft.world.level.h" -#include "..\Minecraft.World\LevelData.h" -#include "..\Minecraft.Client\Common\GameRules\LevelGenerationOptions.h" -#include "..\Minecraft.World\net.minecraft.world.level.chunk.storage.h" - -#define RESERVE_ALLOCATION MEM_RESERVE -#define COMMIT_ALLOCATION MEM_COMMIT - -unsigned int ConsoleSaveFileSplit::pagesCommitted = 0; -void *ConsoleSaveFileSplit::pvHeap = NULL; - -ConsoleSaveFileSplit::RegionFileReference::RegionFileReference(int index, unsigned int regionIndex, unsigned int length/*=0*/, unsigned char *data/*=NULL*/) -{ - fileEntry = new FileEntry(); - fileEntry->currentFilePointer = 0; - fileEntry->data.length = 0; - fileEntry->data.regionIndex = regionIndex; - this->data = 0; - this->index = index; - this->dirty = false; - this->dataCompressed = data; - this->dataCompressedSize = length; - this->lastWritten = 0; -} - -ConsoleSaveFileSplit::RegionFileReference::~RegionFileReference() -{ - free(data); - delete fileEntry; -} - -// Compress from data to dataCompressed. Uses a special compression method that is designed just to efficiently store runs of zeros, with little overhead on other stuff. -// Compresed format is a 4 byte uncompressed size, followed by data as follows: -// -// Byte value Meaning -// -// 1 - 255 Normal data -// 0 followed by 1 - 255 Run of 1 - 255 0s -// 0 followed by 0, followed by 256 to 65791 (as 2 bytes) Run of 256 to 65791 zeros - -void ConsoleSaveFileSplit::RegionFileReference::Compress() -{ - unsigned char *dataIn = data; - unsigned char *dataInLast = data + fileEntry->data.length; - -// int64_t startTime = System::currentTimeMillis(); - - // One pass through to work out storage space required for compressed data - unsigned int outputSize = 4; // 4 bytes required to store the uncompressed size for faster decompression - unsigned int runLength = 0; - while( dataIn != dataInLast ) - { - unsigned char thisByte = *dataIn++; - if( ( thisByte != 0 ) || ( runLength == ( 65535 + 256 ) ) ) - { - // We've got a non-zero value, or we've hit our maximum run length. - // If there was a preceeding run of zeros, encode that nwo - if( runLength != 0 ) - { - if( runLength < 256 ) - { - // Runs of 1 to 255 encoded as 0 followed by one byte of run length - outputSize += 2; - } - else - { - // Runs of 256 to 65791 encoded as two 0s followed by two bytes of run length - 256 - outputSize += 4; - } - // Run is now processed - runLength = 0; - } - // Now handle the current byte - if( thisByte == 0 ) - { - runLength++; - } - else - { - // Non-zero, just copy over to output - outputSize++; - } - } - else - { - // It's a zero - keep counting size of the run - runLength++; - } - } - // Handle any outstanding run - if ( runLength != 0 ) - { - if( runLength < 256 ) - { - // Runs of 1 to 255 encoded as 0 followed by one byte of run length - outputSize += 2; - } - else - { - // Runs of 256 to 65791 encoded as two 0s followed by two bytes of run length - 256 - outputSize += 4; - } - // Run is now processed - runLength = 0; - } - - // Now actually allocate & write the compress data. First 4 bytes store the uncompressed size - dataCompressed = (unsigned char *)malloc(outputSize); - *((unsigned int *)dataCompressed) = fileEntry->data.length; - unsigned char *dataOut = dataCompressed + 4; - dataIn = data; - - // Now same process as before, but actually writing - while( dataIn != dataInLast ) - { - unsigned char thisByte = *dataIn++; - if( ( thisByte != 0 ) || ( runLength == ( 65535 + 256 ) ) ) - { - // We've got a non-zero value, or we've hit our maximum run length. - // If there was a preceeding run of zeros, encode that nwo - if( runLength != 0 ) - { - if( runLength < 256 ) - { - // Runs of 1 to 255 encoded as 0 followed by one byte of run length - *dataOut++ = 0; - *dataOut++ = runLength; - } - else - { - // Runs of 256 to 65791 encoded as two 0s followed by two bytes of run length - 256 - *dataOut++ = 0; - *dataOut++ = 0; - unsigned int largeRunLength = runLength - 256; - *dataOut++ = ( largeRunLength >> 8 ) & 0xff; - *dataOut++ = ( largeRunLength ) & 0xff; - } - // Run is now processed - runLength = 0; - } - // Now handle the current byte - if( thisByte == 0 ) - { - runLength++; - } - else - { - // Non-zero, just copy over to output - *dataOut++ = thisByte; - } - } - else - { - // It's a zero - keep counting size of the run - runLength++; - } - } - // Handle any outstanding run - if( runLength != 0 ) - { - if( runLength < 256 ) - { - // Runs of 1 to 255 encoded as 0 followed by one byte of run length - *dataOut++ = 0; - *dataOut++ = runLength; - } - else - { - // Runs of 256 to 65791 encoded as two 0s followed by two bytes of run length - 256 - *dataOut++ = 0; - *dataOut++ = 0; - unsigned int largeRunLength = runLength - 256; - *dataOut++ = ( largeRunLength >> 8 ) & 0xff; - *dataOut++ = ( largeRunLength ) & 0xff; - } - // Run is now processed - runLength = 0; - } - assert(( dataOut - dataCompressed ) == outputSize ); - dataCompressedSize = outputSize; -// int64_t endTime = System::currentTimeMillis(); -// app.DebugPrintf("Compressing region file 0x%.8x from %d to %d bytes - %dms\n", fileEntry->data.regionIndex, fileEntry->data.length, dataCompressedSize, endTime - startTime); -} - -// Decompress from dataCompressed -> data. See comment in Compress method for format -void ConsoleSaveFileSplit::RegionFileReference::Decompress() -{ -// int64_t startTime = System::currentTimeMillis(); - fileEntry->data.length = *((unsigned int *)dataCompressed); - - // If this is unusually large, then test how big it would be when expanded before trying to allocate. Matching the expanded size - // is (currently) our means of knowing that this file is ok - if( fileEntry->data.length > 1 * 1024 * 1024 ) - { - unsigned int uncompressedSize = 0; - unsigned char *dataIn = dataCompressed + 4; - unsigned char *dataInLast = dataCompressed + dataCompressedSize; - - while (dataIn != dataInLast) - { - unsigned char thisByte = *dataIn++; - if( thisByte == 0 ) - { - thisByte = *dataIn++; - if( thisByte == 0 ) - { - unsigned int runLength = (*dataIn++) << 8; - runLength |= (*dataIn++); - runLength += 256; - uncompressedSize += runLength; - } - else - { - unsigned int runLength = thisByte; - uncompressedSize += runLength; - } - } - else - { - uncompressedSize++; - } - } - - if( fileEntry->data.length != uncompressedSize ) - { - // Treat as if it was an empty region file - fileEntry->data.length = 0; - assert(0); - return; - } - } - - - data = (unsigned char *)malloc(fileEntry->data.length); - unsigned char *dataIn = dataCompressed + 4; - unsigned char *dataInLast = dataCompressed + dataCompressedSize; - unsigned char *dataOut = data; - - while (dataIn != dataInLast) - { - unsigned char thisByte = *dataIn++; - if( thisByte == 0 ) - { - thisByte = *dataIn++; - if( thisByte == 0 ) - { - unsigned int runLength = (*dataIn++) << 8; - runLength |= (*dataIn++); - runLength += 256; - for( unsigned int i = 0; i < runLength; i++ ) - { - *dataOut++ = 0; - } - } - else - { - unsigned int runLength = thisByte; - for( unsigned int i = 0; i < runLength; i++ ) - { - *dataOut++ = 0; - } - } - } - else - { - *dataOut++ = thisByte; - } - } - // If we failed to correctly decompress, then treat as if it was an empty region file - if( ( dataOut - data ) != fileEntry->data.length ) - { - free(data); - fileEntry->data.length = 0; - data = NULL; - assert(0); - } -// int64_t endTime = System::currentTimeMillis(); -// app.DebugPrintf("Decompressing region file from 0x%.8x %d to %d bytes - %dms\n", fileEntry->data.regionIndex, dataCompressedSize, fileEntry->data.length, endTime - startTime);// -} - -unsigned int ConsoleSaveFileSplit::RegionFileReference::GetCompressedSize() -{ - unsigned char *dataIn = data; - unsigned char *dataInLast = data + fileEntry->data.length; - - unsigned int outputSize = 4; // 4 bytes required to store the uncompressed size for faster decompression - unsigned int runLength = 0; - while( dataIn != dataInLast ) - { - unsigned char thisByte = *dataIn++; - if( ( thisByte != 0 ) || ( runLength == ( 65535 + 256 ) ) ) - { - // We've got a non-zero value, or we've hit our maximum run length. - // If there was a preceeding run of zeros, encode that nwo - if( runLength != 0 ) - { - if( runLength < 256 ) - { - // Runs of 1 to 255 encoded as 0 followed by one byte of run length - outputSize += 2; - } - else - { - // Runs of 256 to 65791 encoded as two 0s followed by two bytes of run length - 256 - outputSize += 4; - } - // Run is now processed - runLength = 0; - } - // Now handle the current byte - if( thisByte == 0 ) - { - runLength++; - } - else - { - // Non-zero, just copy over to output - outputSize++; - } - } - else - { - // It's a zero - keep counting size of the run - runLength++; - } - } - // Handle any outstanding run - if ( runLength != 0 ) - { - if( runLength < 256 ) - { - // Runs of 1 to 255 encoded as 0 followed by one byte of run length - outputSize += 2; - } - else - { - // Runs of 256 to 65791 encoded as two 0s followed by two bytes of run length - 256 - outputSize += 4; - } - // Run is now processed - runLength = 0; - } - return outputSize; -} - -// Release dataCompressed -void ConsoleSaveFileSplit::RegionFileReference::ReleaseCompressed() -{ -// app.DebugPrintf("Releasing compressed data for region file from 0x%.8x\n", fileEntry->data.regionIndex ); - free(dataCompressed); - dataCompressed = NULL; - dataCompressedSize = NULL; -} - -FileEntry *ConsoleSaveFileSplit::GetRegionFileEntry(unsigned int regionIndex) -{ - // Is a region file - determine if we've got it as a separate file - AUTO_VAR(it, regionFiles.find(regionIndex) ); - if( it != regionFiles.end() ) - { - // Already got it - return it->second->fileEntry; - } - - int index = StorageManager.AddSubfile(regionIndex); - RegionFileReference *newRef = new RegionFileReference(index, regionIndex); - regionFiles[regionIndex] = newRef; - - return newRef->fileEntry; -} - -ConsoleSaveFileSplit::ConsoleSaveFileSplit(const wstring &fileName, LPVOID pvSaveData /*= NULL*/, DWORD dFileSize /*= 0*/, bool forceCleanSave /*= false*/, ESavePlatform plat /*= SAVE_FILE_PLATFORM_LOCAL*/) -{ - DWORD fileSize = dFileSize; - - // Load a save from the game rules - bool bLevelGenBaseSave = false; - LevelGenerationOptions *levelGen = app.getLevelGenerationOptions(); - if( pvSaveData == NULL && levelGen != NULL && levelGen->requiresBaseSave()) - { - pvSaveData = levelGen->getBaseSaveData(fileSize); - if(pvSaveData && fileSize != 0) bLevelGenBaseSave = true; - } - - if( pvSaveData == NULL || fileSize == 0) - fileSize = StorageManager.GetSaveSize(); - - if( forceCleanSave ) - fileSize = 0; - - _init(fileName, pvSaveData, fileSize, plat); - - if(bLevelGenBaseSave) - { - levelGen->deleteBaseSaveData(); - } -} - -ConsoleSaveFileSplit::ConsoleSaveFileSplit(ConsoleSaveFile *sourceSave, bool alreadySmallRegions, ProgressListener *progress) -{ - _init(sourceSave->getFilename(), NULL, 0, sourceSave->getSavePlatform()); - - header.setOriginalSaveVersion(sourceSave->getOriginalSaveVersion()); - header.setSaveVersion(sourceSave->getSaveVersion()); - - if(alreadySmallRegions) - { - - vector *sourceFiles = sourceSave->getFilesWithPrefix(L""); - - DWORD bytesWritten; - for(AUTO_VAR(it, sourceFiles->begin()); it != sourceFiles->end(); ++it) - { - FileEntry *sourceEntry = *it; - sourceSave->setFilePointer(sourceEntry,0,NULL,FILE_BEGIN); - - FileEntry *targetEntry = createFile(ConsoleSavePath(sourceEntry->data.filename)); - - writeFile(targetEntry, sourceSave->getWritePointer(sourceEntry), sourceEntry->getFileSize(), &bytesWritten); - } - - delete sourceFiles; - } - else - { - ConsoleSaveFileConverter::ConvertSave(sourceSave, this, progress); - } -} - -void ConsoleSaveFileSplit::_init(const wstring &fileName, LPVOID pvSaveData, DWORD fileSize, ESavePlatform plat) -{ - InitializeCriticalSectionAndSpinCount(&m_lock,5120); - - m_lastTickTime = 0; - - // One time initialise of static stuff required for our storage - if( pvHeap == NULL ) - { - // Reserve a chunk of 64MB of virtual address space for our saves, using 64KB pages. - // We'll only be committing these as required to grow the storage we need, which will - // the storage to grow without having to use realloc. - pvHeap = VirtualAlloc(NULL, MAX_PAGE_COUNT * CSF_PAGE_SIZE, RESERVE_ALLOCATION, PAGE_READWRITE ); - } - - pvSaveMem = pvHeap; - m_fileName = fileName; - - // Get details of region files. From this point on we are responsible for the memory that the storage manager initially allocated for them - unsigned int regionCount = StorageManager.GetSubfileCount(); - for( unsigned int i = 0; i < regionCount; i++ ) - { - unsigned int regionIndex; - unsigned char *regionDataCompressed; - unsigned int regionSizeCompressed; - - StorageManager.GetSubfileDetails(i, ®ionIndex, ®ionDataCompressed, ®ionSizeCompressed); - - RegionFileReference *regionFileRef = new RegionFileReference(i, regionIndex, regionSizeCompressed, regionDataCompressed); - if( regionSizeCompressed > 0 ) - { - regionFileRef->Decompress(); - } - else - { - regionFileRef->fileEntry->data.length = 0; - } - regionFileRef->ReleaseCompressed(); - regionFiles[regionIndex] = regionFileRef; - } - - DWORD heapSize = max( fileSize, (DWORD)(1024 * 1024 * 2)); // 4J Stu - Our files are going to be bigger than 2MB so allocate high to start with - - // Initially committ enough room to store headSize bytes (using CSF_PAGE_SIZE pages, so rounding up here). We should only ever have one save file at a time, - // and the pages should be decommitted in the dtor, so pages committed should always be zero at this point. - if( pagesCommitted != 0 ) - { -#ifndef _CONTENT_PACKAGE - __debugbreak(); -#endif - } - - unsigned int pagesRequired = ( heapSize + (CSF_PAGE_SIZE - 1 ) ) / CSF_PAGE_SIZE; - - void *pvRet = VirtualAlloc(pvHeap, pagesRequired * CSF_PAGE_SIZE, COMMIT_ALLOCATION, PAGE_READWRITE); - if( pvRet == NULL ) - { -#ifndef _CONTENT_PACKAGE - // Out of physical memory - __debugbreak(); -#endif - } - pagesCommitted = pagesRequired; - - if( fileSize > 0) - { - if(pvSaveData != NULL) - { - memcpy(pvSaveMem, pvSaveData, fileSize); - } - else - { - unsigned int storageLength; - StorageManager.GetSaveData( pvSaveMem, &storageLength ); - app.DebugPrintf("Filesize - %d, Adjusted size - %d\n",fileSize,storageLength); - fileSize = storageLength; - } - - int compressed = *(int*)pvSaveMem; - if( compressed == 0 ) - { - unsigned int decompSize = *( (int*)pvSaveMem+1 ); - - // An invalid save, so clear the memory and start from scratch - if(decompSize == 0) - { - // 4J Stu - Saves created between 2/12/2011 and 7/12/2011 will have this problem - app.DebugPrintf("Invalid save data format\n"); - ZeroMemory( pvSaveMem, fileSize ); - // Clear the first 8 bytes that reference the header - header.WriteHeader( pvSaveMem ); - } - else - { - unsigned char *buf = new unsigned char[decompSize]; - - if( Compression::getCompression()->Decompress(buf, &decompSize, (unsigned char *)pvSaveMem+8, fileSize-8 ) == S_OK) - { - - // Only ReAlloc if we need to (we might already have enough) and align to 512 byte boundaries - DWORD currentHeapSize = pagesCommitted * CSF_PAGE_SIZE; - - DWORD desiredSize = decompSize; - - if( desiredSize > currentHeapSize ) - { - unsigned int pagesRequired = ( desiredSize + (CSF_PAGE_SIZE - 1 ) ) / CSF_PAGE_SIZE; - void *pvRet = VirtualAlloc(pvHeap, pagesRequired * CSF_PAGE_SIZE, COMMIT_ALLOCATION, PAGE_READWRITE); - if( pvRet == NULL ) - { - // Out of physical memory - __debugbreak(); - } - pagesCommitted = pagesRequired; - } - - memcpy(pvSaveMem, buf, decompSize); - } - else - { - // Corrupt save, although most of the terrain should actually be ok - app.DebugPrintf("Failed to decompress save data!\n"); -#ifndef _CONTENT_PACKAGE - __debugbreak(); -#endif - ZeroMemory( pvSaveMem, fileSize ); - // Clear the first 8 bytes that reference the header - header.WriteHeader( pvSaveMem ); - } - - delete[] buf; - } - } - - header.ReadHeader( pvSaveMem, plat ); - - } - else - { - // Clear the first 8 bytes that reference the header - header.WriteHeader( pvSaveMem ); - } -} - -ConsoleSaveFileSplit::~ConsoleSaveFileSplit() -{ - VirtualFree( pvHeap, MAX_PAGE_COUNT * CSF_PAGE_SIZE, MEM_DECOMMIT ); - pagesCommitted = 0; - // Make sure we don't have any thumbnail data still waiting round - we can't need it now we've destroyed the save file anyway -#if defined _XBOX - app.GetSaveThumbnail(NULL,NULL); -#elif defined __PS3__ - app.GetSaveThumbnail(NULL,NULL, NULL,NULL); -#endif - - for(AUTO_VAR(it,regionFiles.begin()); it != regionFiles.end(); it++ ) - { - delete it->second; - } - - StorageManager.ResetSubfiles(); - DeleteCriticalSection(&m_lock); -} - -// Add the file to our table of internal files if not already there -// Open our actual save file ready for reading/writing, and the set the file pointer to the start of this file -FileEntry *ConsoleSaveFileSplit::createFile( const ConsoleSavePath &fileName ) -{ - LockSaveAccess(); - - // Determine if the file is a region file that should be split off into its own file - unsigned int regionFileIndex; - bool isRegionFile = GetNumericIdentifierFromName(fileName.getName(), ®ionFileIndex); - if( isRegionFile ) - { - // First, for backwards compatibility, check if it is already in the main file - will just use that if so - if( !header.fileExists( fileName.getName() ) ) - { - // Find or create a new region file - FileEntry *file = GetRegionFileEntry(regionFileIndex); - ReleaseSaveAccess(); - return file; - } - } - - FileEntry *file = header.AddFile( fileName.getName() ); - ReleaseSaveAccess(); - - return file; -} - -void ConsoleSaveFileSplit::deleteFile( FileEntry *file ) -{ - if( file == NULL ) return; - - assert( file->isRegionFile() == false ); - - LockSaveAccess(); - - DWORD numberOfBytesRead = 0; - DWORD numberOfBytesWritten = 0; - - const int bufferSize = 4096; - int amountToRead = bufferSize; - byte buffer[bufferSize]; - DWORD bufferDataSize = 0; - - - char *readStartOffset = (char *)pvSaveMem + file->data.startOffset + file->getFileSize(); - - char *writeStartOffset = (char *)pvSaveMem + file->data.startOffset; - - char *endOfDataOffset = (char *)pvSaveMem + header.GetStartOfNextData(); - - while(true) - { - // Fill buffer from file - if( readStartOffset + bufferSize > endOfDataOffset ) - { - amountToRead = (int)(endOfDataOffset - readStartOffset); - } - else - { - amountToRead = bufferSize; - } - - if( amountToRead == 0 ) - break; - - memcpy( buffer, readStartOffset, amountToRead ); - numberOfBytesRead = amountToRead; - - bufferDataSize = amountToRead; - readStartOffset += numberOfBytesRead; - - // Write buffer to file - memcpy( (void *)writeStartOffset, buffer, bufferDataSize ); - numberOfBytesWritten = bufferDataSize; - - writeStartOffset += numberOfBytesWritten; - } - - header.RemoveFile( file ); - - finalizeWrite(); - - ReleaseSaveAccess(); -} - -void ConsoleSaveFileSplit::setFilePointer(FileEntry *file,LONG lDistanceToMove,PLONG lpDistanceToMoveHigh,DWORD dwMoveMethod) -{ - LockSaveAccess(); - - if( file->isRegionFile() ) - { - file->currentFilePointer = lDistanceToMove; - } - else - { - file->currentFilePointer = file->data.startOffset + lDistanceToMove; - } - - if( dwMoveMethod == FILE_END) - { - file->currentFilePointer += file->getFileSize(); - } - - ReleaseSaveAccess(); -} - -// If this file needs to grow, move the data after along -void ConsoleSaveFileSplit::PrepareForWrite( FileEntry *file, DWORD nNumberOfBytesToWrite ) -{ - int bytesToGrowBy = ( (file->currentFilePointer - file->data.startOffset) + nNumberOfBytesToWrite) - file->getFileSize(); - if( bytesToGrowBy <= 0 ) - return; - - // 4J Stu - Not forcing a minimum size, it is up to the caller to write data in sensible amounts - // This lets us keep some of the smaller files small - //if( bytesToGrowBy < 1024 ) - // bytesToGrowBy = 1024; - - // Move all the data beyond us - PIXBeginNamedEvent(0,"Growing file by %d bytes", bytesToGrowBy); - MoveDataBeyond(file, bytesToGrowBy); - PIXEndNamedEvent(); - - // Update our length - if( file->data.length < 0 ) - file->data.length = 0; - file->data.length += bytesToGrowBy; - - // Write the header with the updated data - finalizeWrite(); -} - -BOOL ConsoleSaveFileSplit::writeFile(FileEntry *file,LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten) -{ - assert( pvSaveMem != NULL ); - if( pvSaveMem == NULL ) - { - return 0; - } - - LockSaveAccess(); - - if( file->isRegionFile() ) - { - unsigned int sizeRequired = file->currentFilePointer + nNumberOfBytesToWrite; - RegionFileReference *fileRef = regionFiles[file->data.regionIndex]; - if( sizeRequired > file->getFileSize() ) - { - fileRef->data = (unsigned char *)realloc(fileRef->data, sizeRequired); - file->data.length = sizeRequired; - } - - memcpy( fileRef->data + file->currentFilePointer, lpBuffer, nNumberOfBytesToWrite ); - -// app.DebugPrintf(">>>>>>>>>>>>>> writing a region file's data 0x%.8x, 0x%x offset %d of %d bytes (writing %d bytes)\n",file->data.regionIndex,fileRef->data,file->currentFilePointer, file->getFileSize(), nNumberOfBytesToWrite); - - file->currentFilePointer += nNumberOfBytesToWrite; - file->updateLastModifiedTime(); - fileRef->dirty = true; - } - else - { - PrepareForWrite( file, nNumberOfBytesToWrite ); - - char *writeStartOffset = (char *)pvSaveMem + file->currentFilePointer; - //printf("Write: pvSaveMem = %0xd, currentFilePointer = %d, writeStartOffset = %0xd\n", pvSaveMem, file->currentFilePointer, writeStartOffset); - - memcpy( (void *)writeStartOffset, lpBuffer, nNumberOfBytesToWrite ); - *lpNumberOfBytesWritten = nNumberOfBytesToWrite; - - if(file->data.length < 0) - file->data.length = 0; - - file->currentFilePointer += *lpNumberOfBytesWritten; - - //wprintf(L"Wrote %d bytes to %s, new file pointer is %I64d\n", *lpNumberOfBytesWritten, file->data.filename, file->currentFilePointer); - - file->updateLastModifiedTime(); - } - - ReleaseSaveAccess(); - - return 1; -} - -BOOL ConsoleSaveFileSplit::zeroFile(FileEntry *file, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten) -{ - assert( pvSaveMem != NULL ); - if( pvSaveMem == NULL ) - { - return 0; - } - - LockSaveAccess(); - - if( file->isRegionFile() ) - { - unsigned int sizeRequired = file->currentFilePointer + nNumberOfBytesToWrite; - RegionFileReference *fileRef = regionFiles[file->data.regionIndex]; - if( sizeRequired > file->getFileSize() ) - { - fileRef->data = (unsigned char *)realloc(fileRef->data, sizeRequired); - file->data.length = sizeRequired; - } - - memset( fileRef->data + file->currentFilePointer, 0, nNumberOfBytesToWrite ); - -// app.DebugPrintf(">>>>>>>>>>>>>> writing a region file's data 0x%.8x, 0x%x offset %d of %d bytes (writing %d bytes)\n",file->data.regionIndex,fileRef->data,file->currentFilePointer, file->getFileSize(), nNumberOfBytesToWrite); - - file->currentFilePointer += nNumberOfBytesToWrite; - file->updateLastModifiedTime(); - fileRef->dirty = true; - } - else - { - PrepareForWrite( file, nNumberOfBytesToWrite ); - - char *writeStartOffset = (char *)pvSaveMem + file->currentFilePointer; - //printf("Write: pvSaveMem = %0xd, currentFilePointer = %d, writeStartOffset = %0xd\n", pvSaveMem, file->currentFilePointer, writeStartOffset); - - memset( (void *)writeStartOffset, 0, nNumberOfBytesToWrite ); - *lpNumberOfBytesWritten = nNumberOfBytesToWrite; - - if(file->data.length < 0) - file->data.length = 0; - - file->currentFilePointer += *lpNumberOfBytesWritten; - - //wprintf(L"Wrote %d bytes to %s, new file pointer is %I64d\n", *lpNumberOfBytesWritten, file->data.filename, file->currentFilePointer); - - file->updateLastModifiedTime(); - } - - ReleaseSaveAccess(); - - return 1; -} - -BOOL ConsoleSaveFileSplit::readFile( FileEntry *file, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead) -{ - DWORD actualBytesToRead; - assert( pvSaveMem != NULL ); - if( pvSaveMem == NULL ) - { - return 0; - } - - LockSaveAccess(); - - if( file->isRegionFile() ) - { - actualBytesToRead = nNumberOfBytesToRead; - if( file->currentFilePointer + nNumberOfBytesToRead > file->data.length ) - { - actualBytesToRead = file->data.length - file->currentFilePointer; - } - RegionFileReference *fileRef = regionFiles[file->data.regionIndex]; - memcpy( lpBuffer, fileRef->data + file->currentFilePointer, actualBytesToRead ); - *lpNumberOfBytesRead = actualBytesToRead; - - file->currentFilePointer += actualBytesToRead; - } - else - { - char *readStartOffset = (char *)pvSaveMem + file->currentFilePointer; - //printf("Read: pvSaveMem = %0xd, currentFilePointer = %d, readStartOffset = %0xd\n", pvSaveMem, file->currentFilePointer, readStartOffset); - - assert( nNumberOfBytesToRead <= file->getFileSize() ); - - actualBytesToRead = nNumberOfBytesToRead; - if( file->currentFilePointer + nNumberOfBytesToRead > file->data.startOffset + file->data.length ) - { - actualBytesToRead = (file->data.startOffset + file->data.length) - file->currentFilePointer; - } - - memcpy( lpBuffer, readStartOffset, actualBytesToRead ); - *lpNumberOfBytesRead = actualBytesToRead; - - file->currentFilePointer += *lpNumberOfBytesRead; - - //wprintf(L"Read %d bytes from %s, new file pointer is %I64d\n", *lpNumberOfBytesRead, file->data.filename, file->currentFilePointer); - } - - - - ReleaseSaveAccess(); - - return 1; -} - -BOOL ConsoleSaveFileSplit::closeHandle( FileEntry *file ) -{ - LockSaveAccess(); - finalizeWrite(); - ReleaseSaveAccess(); - - return TRUE; -} - -// In this method, attempt to write any dirty region files, subject to maintaining a maximum write output rate. Writing is prioritised by time since the region was last written. -void ConsoleSaveFileSplit::tick() -{ - int64_t currentTime = System::currentTimeMillis(); - - // Don't do anything if the save system is up to something... - if( StorageManager.GetSaveState() != C4JStorage::ESaveGame_Idle ) - { - return; - } - - // ...or we shouldn't be saving... - if( StorageManager.GetSaveDisabled() ) - { - return; - } - - // ... or we haven't passed the required time since last assessing what to do - if( ( currentTime - m_lastTickTime ) < WRITE_TICK_RATE_MS ) - { - return; - } - - LockSaveAccess(); - - m_lastTickTime = currentTime; - - // Get total amount of data written over the time period we are interested in averaging over. Remove any older data. - unsigned int bytesWritten = 0; - for( AUTO_VAR(it, writeHistory.begin()); it != writeHistory.end(); ) - { - if( ( currentTime - it->writeTime ) > ( WRITE_BANDWIDTH_MEASUREMENT_PERIOD_SECONDS * 1000 ) ) - { - it = writeHistory.erase(it); - } - else - { - bytesWritten += it->writeSize; - it++; - } - } - - // Compile a vector of dirty regions. - vector dirtyRegions; - for( AUTO_VAR(it, regionFiles.begin()); it != regionFiles.end(); it++ ) - { - DirtyRegionFile dirtyRegion; - - if( it->second->dirty ) - { - dirtyRegion.fileRef = it->second->fileEntry->getRegionFileIndex(); - dirtyRegion.lastWritten = it->second->lastWritten; - dirtyRegions.push_back( dirtyRegion ); - } - } - - // Sort into ascending order, by lastWritten time. First elements will therefore be the ones least recently saved - std::sort( dirtyRegions.begin(), dirtyRegions.end() ); - - bool writeRequired = false; - unsigned int bytesInTimePeriod = bytesWritten; - unsigned int bytesAddedThisTick = 0; - for( int i = 0; i < dirtyRegions.size(); i++ ) - { - RegionFileReference *regionRef = regionFiles[dirtyRegions[i].fileRef]; - unsigned int compressedSize = regionRef->GetCompressedSize(); - bytesInTimePeriod += compressedSize; - bytesAddedThisTick += compressedSize; - - // Always consider at least one item for writing, even if it breaks the rule on the maximum number of bytes we would like to send per tick - if( ( i > 0 ) && ( bytesAddedThisTick > WRITE_MAX_WRITE_PER_TICK ) ) - { - break; - } - - // Could we add this without breaking our bytes per second cap? - if ( ( bytesInTimePeriod / WRITE_BANDWIDTH_MEASUREMENT_PERIOD_SECONDS ) > WRITE_BANDWIDTH_BYTESPERSECOND ) - { - break; - } - - // Can add for writing - WriteHistory writeEvent; - writeEvent.writeSize = compressedSize; - writeEvent.writeTime = System::currentTimeMillis(); - writeHistory.push_back(writeEvent); - - regionRef->Compress(); -// app.DebugPrintf("Tick: Writing region 0x%.8x, compressed as %d bytes\n",regionRef->fileEntry->getRegionFileIndex(), regionRef->dataCompressedSize); - StorageManager.UpdateSubfile(regionRef->index, regionRef->dataCompressed, regionRef->dataCompressedSize); - regionRef->dirty = false; - regionRef->lastWritten = System::currentTimeMillis(); - - writeRequired = true; - } -#ifndef _CONTENT_PACKAGE - { - unsigned int totalDirty = 0; - unsigned int totalDirtyBytes = 0; - __int64 oldestDirty = currentTime; - for( AUTO_VAR(it, regionFiles.begin()); it != regionFiles.end(); it++ ) - { - if( it->second->dirty ) - { - if( it->second->lastWritten < oldestDirty ) - { - oldestDirty = it->second->lastWritten; - } - totalDirty++; - totalDirtyBytes += it->second->fileEntry->getFileSize(); - } - } -#ifdef _DURANGO - PIXReportCounter(L"Dirty regions", (float)totalDirty); - PIXReportCounter(L"Dirty MB", (float)totalDirtyBytes / ( 1024 * 1024) ); - PIXReportCounter(L"Dirty oldest age", ((float) currentTime - oldestDirty ) ); - PIXReportCounter(L"Region writing bandwidth",((float)bytesInTimePeriod/ WRITE_BANDWIDTH_MEASUREMENT_PERIOD_SECONDS) / ( 1024 * 1024)); -#endif - } -#endif - - if( writeRequired ) - { - StorageManager.SaveSubfiles(SaveRegionFilesCallback, this); - } - - ReleaseSaveAccess(); -} - -void ConsoleSaveFileSplit::finalizeWrite() -{ - LockSaveAccess(); - header.WriteHeader( pvSaveMem ); - ReleaseSaveAccess(); -} - -void ConsoleSaveFileSplit::MoveDataBeyond(FileEntry *file, DWORD nNumberOfBytesToWrite) -{ - DWORD numberOfBytesRead = 0; - DWORD numberOfBytesWritten = 0; - - const DWORD bufferSize = 4096; - DWORD amountToRead = bufferSize; - //assert( nNumberOfBytesToWrite <= bufferSize ); - static byte buffer1[bufferSize]; - static byte buffer2[bufferSize]; - DWORD buffer1Size = 0; - DWORD buffer2Size = 0; - - // Only ReAlloc if we need to (we might already have enough) and align to 512 byte boundaries - DWORD currentHeapSize = pagesCommitted * CSF_PAGE_SIZE; - - DWORD desiredSize = header.GetFileSize() + nNumberOfBytesToWrite; - - if( desiredSize > currentHeapSize ) - { - unsigned int pagesRequired = ( desiredSize + (CSF_PAGE_SIZE - 1 ) ) / CSF_PAGE_SIZE; - void *pvRet = VirtualAlloc(pvHeap, pagesRequired * CSF_PAGE_SIZE, COMMIT_ALLOCATION, PAGE_READWRITE); - if( pvRet == NULL ) - { - // Out of physical memory - __debugbreak(); - } - pagesCommitted = pagesRequired; - } - - // This is the start of where we want the space to be, and the start of the data that we need to move - char *spaceStartOffset = (char *)pvSaveMem + file->data.startOffset + file->getFileSize(); - - // This is the end of where we want the space to be - char *spaceEndOffset = spaceStartOffset + nNumberOfBytesToWrite; - - // This is the current end of the data that we want to move - char *beginEndOfDataOffset = (char *)pvSaveMem + header.GetStartOfNextData(); - - // This is where the end of the data is going to be - char *finishEndOfDataOffset = beginEndOfDataOffset + nNumberOfBytesToWrite; - - // This is where we are going to read from (with the amount we want to read subtracted before we read) - char *readStartOffset = beginEndOfDataOffset; - - // This is where we can safely write to (with the amount we want write subtracted before we write) - char *writeStartOffset = finishEndOfDataOffset; - - //printf("\n******* MOVEDATABEYOND *******\n"); - //printf("Space start: %d, space end: %d\n", spaceStartOffset - (char *)pvSaveMem, spaceEndOffset - (char *)pvSaveMem); - //printf("Current end of data: %d, new end of data: %d\n", beginEndOfDataOffset - (char *)pvSaveMem, finishEndOfDataOffset - (char *)pvSaveMem); - - // Optimisation for things that are being moved in whole region file sector (4K chunks). We could generalise this a bit more but seems safest at the moment to identify this particular type - // of move and code explicitly for this situation - if( ( nNumberOfBytesToWrite & 4095 ) == 0 ) - { - if( nNumberOfBytesToWrite > 0 ) - { - // Get addresses for start & end of the region we are copying from as uintptr_t, for easier maths - uintptr_t uiFromStart = (uintptr_t)spaceStartOffset; - uintptr_t uiFromEnd = (uintptr_t)beginEndOfDataOffset; - - // Round both of these values to get 4096 byte chunks that we will need to at least partially move - uintptr_t uiFromStartChunk = uiFromStart & ~((uintptr_t)4095); - uintptr_t uiFromEndChunk = (uiFromEnd - 1 ) & ~((uintptr_t)4095); - - // Loop through all the affected source 4096 chunks, going backwards so we don't overwrite anything we'll need in the future - for( uintptr_t uiCurrentChunk = uiFromEndChunk; uiCurrentChunk >= uiFromStartChunk; uiCurrentChunk -= 4096 ) - { - // Establish chunk we'll need to copy - uintptr_t uiCopyStart = uiCurrentChunk; - uintptr_t uiCopyEnd = uiCurrentChunk + 4096; - // Clamp chunk to the bounds of the full region we are trying to copy - if( uiCopyStart < uiFromStart ) - { - // Needs to be clampged against the start of our region - uiCopyStart = uiFromStart; - } - if ( uiCopyEnd > uiFromEnd ) - { - // Needs to be clamped to the end of our region - uiCopyEnd = uiFromEnd; - } - XMemCpy( (void *)(uiCopyStart + nNumberOfBytesToWrite), ( void *)uiCopyStart, uiCopyEnd - uiCopyStart ); - } - } - } - else - { - while(true) - { - // Copy buffer 1 to buffer 2 - memcpy( buffer2, buffer1, buffer1Size); - buffer2Size = buffer1Size; - - // Fill buffer 1 from file - if( (readStartOffset - bufferSize) < spaceStartOffset ) - { - amountToRead = (DWORD)(readStartOffset - spaceStartOffset); - } - else - { - amountToRead = bufferSize; - } - - // Push the read point back by the amount of bytes that we are going to read - readStartOffset -= amountToRead; - - //printf("About to read %u from %d\n", amountToRead, readStartOffset - (char *)pvSaveMem ); - - memcpy( buffer1, readStartOffset, amountToRead ); - numberOfBytesRead = amountToRead; - - buffer1Size = amountToRead; - - // Move back the write pointer by the amount of bytes we are going to write - writeStartOffset -= buffer2Size; - - // Write buffer 2 to file - if( (writeStartOffset + buffer2Size) <= finishEndOfDataOffset) - { - //printf("About to write %u to %d\n", buffer2Size, writeStartOffset - (char *)pvSaveMem ); - memcpy( (void *)writeStartOffset, buffer2, buffer2Size ); - numberOfBytesWritten = buffer2Size; - } - else - { - assert((writeStartOffset + buffer2Size) <= finishEndOfDataOffset); - numberOfBytesWritten = 0; - } - - if( numberOfBytesRead == 0 ) - { - //printf("\n************** MOVE COMPLETED *************** \n\n"); - assert( writeStartOffset == spaceEndOffset ); - break; - } - } - } - - header.AdjustStartOffsets( file, nNumberOfBytesToWrite ); -} - -// Attempt to convert a filename into a numeric identifier, which we use for region files. File names supported are of the form: -// -// Filename Encoded as -// -// r.x.z.mcr 00 00 xx zz -// DIM-1r.x.z.mcr 00 01 xx zz -// DIM1/r.x.z.mcr 00 02 xx zz - -bool ConsoleSaveFileSplit::GetNumericIdentifierFromName(const wstring &fileName, unsigned int *idOut) -{ - // Determine whether it is one of our region file names if the file extension is ".mbr" - if( fileName.length() < 4 ) return false; - wstring extension = fileName.substr(fileName.length()-4,4); - if( extension != wstring(L".mcr") ) return false; - - unsigned int id = 0; - int x, z; - - const wchar_t *cstr = fileName.c_str(); - const wchar_t *body = cstr + 2; - - // If this filename starts with a "r" then assume it is of the format "r.x.z.mcr" - don't do anything as default value we've set are correct - if( cstr[0] != L'r' ) - { - // Must be prefixed by "DIM-1r." or "DIM1/r." - body = cstr + 7; - // Differentiate between these 2 options - if( cstr[3] == L'-' ) - { - // "DIM-1r." - id = 0x00010000; - } - else - { - // "DIM/1r." - id = 0x00020000; - } - } - // Get x/z coords - swscanf_s(body, L"%d.%d.mcr", &x, &z ); - - // Pack full id - id |= ( ( x << 8 ) & 0x0000ff00 ); - id |= ( z & 0x000000ff ); - - *idOut = id; - - return true; -} - -// Convert a numeric file identifier (for region files) back into a normal filename. See comment above. - -wstring ConsoleSaveFileSplit::GetNameFromNumericIdentifier(unsigned int idIn) -{ - wstring prefix; - - switch(idIn & 0x00ff0000 ) - { - case 0: - prefix = L""; - break; - case 1: - prefix = L"DIM-1"; - break; - case 2: - prefix = L"DIM1/"; - break; - } - signed char regionX = ( idIn >> 8 ) & 255; - signed char regionZ = idIn & 255; - wstring region = ( prefix + wstring(L"r.") + _toString(regionX) + L"." + _toString(regionZ) + L".mcr" ); - - return region; -} - -// Compress any dirty region files, and tell the storage manager about them so that it will process them when we ask it to save sub files -void ConsoleSaveFileSplit::processSubfilesForWrite() -{ -#if 0 - // 4J Stu - There are debug reasons where we want to force a save of all regions - StorageManager.ResetSubfiles(); - for(AUTO_VAR(it,regionFiles.begin()); it != regionFiles.end(); it++ ) - { - RegionFileReference* region = it->second; - int index = StorageManager.AddSubfile(region->fileEntry->data.regionIndex); - //if( region->dirty ) - { - region->Compress(); - StorageManager.UpdateSubfile(index, region->dataCompressed, region->dataCompressedSize); - region->dirty = false; - region->lastWritten = System::currentTimeMillis(); - } - } -#else - for(AUTO_VAR(it,regionFiles.begin()); it != regionFiles.end(); it++ ) - { - RegionFileReference* region = it->second; - if( region->dirty ) - { - region->Compress(); - StorageManager.UpdateSubfile(region->index, region->dataCompressed, region->dataCompressedSize); - region->dirty = false; - region->lastWritten = System::currentTimeMillis(); - } - } -#endif -} - -// Clean up any memory allocated for compressed data when we have finished writing -void ConsoleSaveFileSplit::processSubfilesAfterWrite() -{ - // This is called from the StorageManager.Tick() which should always be on the main thread - for(AUTO_VAR(it,regionFiles.begin()); it != regionFiles.end(); it++ ) - { - RegionFileReference* region = it->second; - region->ReleaseCompressed(); - } -} - -bool ConsoleSaveFileSplit::doesFileExist(ConsoleSavePath file) -{ - LockSaveAccess(); - bool exists = header.fileExists( file.getName() ); - ReleaseSaveAccess(); - - return exists; -} - -void ConsoleSaveFileSplit::Flush(bool autosave, bool updateThumbnail) -{ - LockSaveAccess(); - -#ifdef _XBOX_ONE - MinecraftServer *server = MinecraftServer::getInstance(); -#endif - - // The storage manage might potentially be busy doing a sub-file write initiated from the tick. Wait until this is totally processed. - while( StorageManager.GetSaveState() != C4JStorage::ESaveGame_Idle ) - { -#ifdef _XBOX_ONE - if (server && server->IsSuspending()) - { - // If the server is mid-suspend we need to tick the storage manager ourselves - StorageManager.Tick(); - } -#endif - - app.DebugPrintf("Flush wait\n"); - Sleep(10); - } - - finalizeWrite(); - - m_autosave = autosave; - if(!m_autosave) processSubfilesForWrite(); - - // Get the frequency of the timer - LARGE_INTEGER qwTicksPerSec, qwTime, qwNewTime, qwDeltaTime; - float fElapsedTime = 0.0f; - QueryPerformanceFrequency( &qwTicksPerSec ); - float fSecsPerTick = 1.0f / (float)qwTicksPerSec.QuadPart; - - unsigned int fileSize = header.GetFileSize(); - - // Assume that the compression will make it smaller so initially attempt to allocate the current file size - // We add 4 bytes to the start so that we can signal compressed data - // And another 4 bytes to store the decompressed data size - unsigned int compLength = fileSize+8; - - // 4J Stu - Added TU-1 interim - - // Attempt to allocate the required memory - // We do not own this, it belongs to the StorageManager - byte *compData = (byte *)StorageManager.AllocateSaveData( compLength ); - - // If we failed to allocate then compData will be NULL - // Pre-calculate the compressed data size so that we can attempt to allocate a smaller buffer - if(compData == NULL) - { - // Length should be 0 here so that the compression call knows that we want to know the length back - compLength = 0; - - // Pre-calculate the buffer size required for the compressed data - PIXBeginNamedEvent(0,"Pre-calc save compression"); - // Save the start time - QueryPerformanceCounter( &qwTime ); - Compression::getCompression()->Compress(NULL,&compLength,pvSaveMem,fileSize); - QueryPerformanceCounter( &qwNewTime ); - - qwDeltaTime.QuadPart = qwNewTime.QuadPart - qwTime.QuadPart; - fElapsedTime = fSecsPerTick * ((FLOAT)(qwDeltaTime.QuadPart)); - - app.DebugPrintf("Check buffer size: Elapsed time %f\n", fElapsedTime); - PIXEndNamedEvent(); - - // We add 4 bytes to the start so that we can signal compressed data - // And another 4 bytes to store the decompressed data size - compLength = compLength+8; - - // Attempt to allocate the required memory - compData = (byte *)StorageManager.AllocateSaveData( compLength ); - } - - if(compData != NULL) - { - // Re-compress all save data before we save it to disk - PIXBeginNamedEvent(0,"Actual save compression"); - // Save the start time - QueryPerformanceCounter( &qwTime ); - Compression::getCompression()->Compress(compData+8,&compLength,pvSaveMem,fileSize); - QueryPerformanceCounter( &qwNewTime ); - - qwDeltaTime.QuadPart = qwNewTime.QuadPart - qwTime.QuadPart; - fElapsedTime = fSecsPerTick * ((FLOAT)(qwDeltaTime.QuadPart)); - - app.DebugPrintf("Compress: Elapsed time %f\n", fElapsedTime); - PIXEndNamedEvent(); - - ZeroMemory(compData,8); - int saveVer = 0; - memcpy( compData, &saveVer, sizeof(int) ); - memcpy( compData+4, &fileSize, sizeof(int) ); - - app.DebugPrintf("Save data compressed from %d to %d\n", fileSize, compLength); - - if(updateThumbnail) - { - PBYTE pbThumbnailData=NULL; - DWORD dwThumbnailDataSize=0; - - PBYTE pbDataSaveImage=NULL; - DWORD dwDataSizeSaveImage=0; - -#if ( defined _XBOX || defined _DURANGO ) - app.GetSaveThumbnail(&pbThumbnailData,&dwThumbnailDataSize); -#elif ( defined __PS3__ || defined __ORBIS__ ) - app.GetSaveThumbnail(&pbThumbnailData,&dwThumbnailDataSize,&pbDataSaveImage,&dwDataSizeSaveImage); -#endif - - BYTE bTextMetadata[88]; - ZeroMemory(bTextMetadata,88); - - __int64 seed = 0; - bool hasSeed = false; - if(MinecraftServer::getInstance()!= NULL && MinecraftServer::getInstance()->levels[0]!=NULL) - { - seed = MinecraftServer::getInstance()->levels[0]->getLevelData()->getSeed(); - hasSeed = true; - } - - int iTextMetadataBytes = app.CreateImageTextData(bTextMetadata, seed, hasSeed, app.GetGameHostOption(eGameHostOption_All), Minecraft::GetInstance()->getCurrentTexturePackId()); - - // set the icon and save image - StorageManager.SetSaveImages(pbThumbnailData,dwThumbnailDataSize,pbDataSaveImage,dwDataSizeSaveImage,bTextMetadata,iTextMetadataBytes); - app.DebugPrintf("Save thumbnail size %d\n",dwThumbnailDataSize); - - } - - INT saveOrCheckpointId = 0; - bool validSave = StorageManager.GetSaveUniqueNumber(&saveOrCheckpointId); - TelemetryManager->RecordLevelSaveOrCheckpoint(ProfileManager.GetPrimaryPad(), saveOrCheckpointId, compLength+8); - - // save the data - StorageManager.SaveSaveData( &ConsoleSaveFileSplit::SaveSaveDataCallback, this ); -#ifndef _CONTENT_PACKAGE - if( app.DebugSettingsOn()) - { - if(app.GetWriteSavesToFolderEnabled() ) - { - DebugFlushToFile(compData, compLength+8); - } - } -#endif - ReleaseSaveAccess(); - } -} - -int ConsoleSaveFileSplit::SaveSaveDataCallback(LPVOID lpParam,bool bRes) -{ - ConsoleSaveFileSplit *pClass=(ConsoleSaveFileSplit *)lpParam; - - // Don't save sub files on autosave (their always being saved anyway) - if (!pClass->m_autosave) - { - // This is called from the StorageManager.Tick() which should always be on the main thread - StorageManager.SaveSubfiles(SaveRegionFilesCallback, pClass); - } - return 0; -} - -int ConsoleSaveFileSplit::SaveRegionFilesCallback(LPVOID lpParam,bool bRes) -{ - ConsoleSaveFileSplit *pClass=(ConsoleSaveFileSplit *)lpParam; - - // This is called from the StorageManager.Tick() which should always be on the main thread - pClass->processSubfilesAfterWrite(); - - return 0; -} - -#ifndef _CONTENT_PACKAGE -void ConsoleSaveFileSplit::DebugFlushToFile(void *compressedData /*= NULL*/, unsigned int compressedDataSize /*= 0*/) -{ - LockSaveAccess(); - - finalizeWrite(); - - unsigned int fileSize = header.GetFileSize(); - - DWORD numberOfBytesWritten = 0; - - File targetFileDir(L"Saves"); - - if(!targetFileDir.exists()) - targetFileDir.mkdir(); - - wchar_t *fileName = new wchar_t[XCONTENT_MAX_FILENAME_LENGTH+1]; - - SYSTEMTIME t; - GetSystemTime( &t ); - - //14 chars for the digits - //11 chars for the separators + suffix - //25 chars total - wstring cutFileName = m_fileName; - if(m_fileName.length() > XCONTENT_MAX_FILENAME_LENGTH - 25) - { - cutFileName = m_fileName.substr(0, XCONTENT_MAX_FILENAME_LENGTH - 25); - } - swprintf(fileName, XCONTENT_MAX_FILENAME_LENGTH+1, L"\\v%04d-%ls%02d.%02d.%02d.%02d.%02d.mcs",VER_PRODUCTBUILD,cutFileName.c_str(), t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond); - -#ifdef _UNICODE - wstring wtemp = targetFileDir.getPath() + wstring(fileName); - LPCWSTR lpFileName = wtemp.c_str(); -#else - LPCSTR lpFileName = wstringtofilename( targetFileDir.getPath() + wstring(fileName) ); -#endif - - HANDLE hSaveFile = CreateFile( lpFileName, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_FLAG_RANDOM_ACCESS, NULL); - - if(compressedData != NULL && compressedDataSize > 0) - { - WriteFile(hSaveFile,compressedData,compressedDataSize,&numberOfBytesWritten,NULL); - assert(numberOfBytesWritten == compressedDataSize); - } - else - { - WriteFile(hSaveFile,pvSaveMem,fileSize,&numberOfBytesWritten,NULL); - assert(numberOfBytesWritten == fileSize); - } - CloseHandle( hSaveFile ); - - delete[] fileName; - - ReleaseSaveAccess(); -} -#endif - -unsigned int ConsoleSaveFileSplit::getSizeOnDisk() -{ - return header.GetFileSize(); -} - -wstring ConsoleSaveFileSplit::getFilename() -{ - return m_fileName; -} - -vector *ConsoleSaveFileSplit::getFilesWithPrefix(const wstring &prefix) -{ - return header.getFilesWithPrefix( prefix ); -} - -vector *ConsoleSaveFileSplit::getRegionFilesByDimension(unsigned int dimensionIndex) -{ - vector *files = NULL; - - for( AUTO_VAR(it,regionFiles.begin()); it != regionFiles.end(); ++it ) - { - unsigned int entryDimension = ( (it->first) >> 16) & 0xFF; - - if(entryDimension == dimensionIndex) - { - if( files == NULL ) - { - files = new vector(); - } - - files->push_back(it->second->fileEntry); - } - } - - return files; -} - -#if defined(__PS3__) || defined(__ORBIS__) -wstring ConsoleSaveFileSplit::getPlayerDataFilenameForLoad(const PlayerUID& pUID) -{ - return header.getPlayerDataFilenameForLoad( pUID ); -} -wstring ConsoleSaveFileSplit::getPlayerDataFilenameForSave(const PlayerUID& pUID) -{ - return header.getPlayerDataFilenameForSave( pUID ); -} -vector *ConsoleSaveFileSplit::getValidPlayerDatFiles() -{ - return header.getValidPlayerDatFiles(); -} -#endif - -int ConsoleSaveFileSplit::getSaveVersion() -{ - return header.getSaveVersion(); -} - -int ConsoleSaveFileSplit::getOriginalSaveVersion() -{ - return header.getOriginalSaveVersion(); -} - -void ConsoleSaveFileSplit::LockSaveAccess() -{ - EnterCriticalSection(&m_lock); -} - -void ConsoleSaveFileSplit::ReleaseSaveAccess() -{ - LeaveCriticalSection(&m_lock); -} - -ESavePlatform ConsoleSaveFileSplit::getSavePlatform() -{ - return header.getSavePlatform(); -} - -bool ConsoleSaveFileSplit::isSaveEndianDifferent() -{ - return header.isSaveEndianDifferent(); -} - -void ConsoleSaveFileSplit::setLocalPlatform() -{ - header.setLocalPlatform(); -} - -void ConsoleSaveFileSplit::setPlatform(ESavePlatform plat) -{ - header.setPlatform(plat); -} - -ByteOrder ConsoleSaveFileSplit::getSaveEndian() -{ - return header.getSaveEndian(); -} - -ByteOrder ConsoleSaveFileSplit::getLocalEndian() -{ - return header.getLocalEndian(); -} - -void ConsoleSaveFileSplit::setEndian(ByteOrder endian) -{ - header.setEndian(endian); -} - -void ConsoleSaveFileSplit::ConvertRegionFile(File sourceFile) -{ - DWORD numberOfBytesWritten = 0; - DWORD numberOfBytesRead = 0; - - RegionFile sourceRegionFile(this, &sourceFile); - - for(unsigned int x = 0; x < 32; ++x) - { - for(unsigned int z = 0; z < 32; ++z) - { - DataInputStream *dis = sourceRegionFile.getChunkDataInputStream(x,z); - - if(dis) - { - byteArray inData(1024*1024); - int read = dis->read(inData); - dis->close(); - dis->deleteChildStream(); - delete dis; - - DataOutputStream *dos = sourceRegionFile.getChunkDataOutputStream(x,z); - dos->write(inData, 0, read); - - - dos->close(); - dos->deleteChildStream(); - delete dos; - delete inData.data; - - } - - } - } - sourceRegionFile.writeAllOffsets(); // saves all the endian swapped offsets back out to the file (not all of these are written in the above processing). - -} - -void ConsoleSaveFileSplit::ConvertToLocalPlatform() -{ - if(getSavePlatform() == SAVE_FILE_PLATFORM_LOCAL) - { - // already in the correct format - return; - } - // convert each of the region files to the local platform - vector *allFilesInSave = getFilesWithPrefix(wstring(L"")); - for(AUTO_VAR(it, allFilesInSave->begin()); it < allFilesInSave->end(); ++it) - { - FileEntry *fe = *it; - wstring fName( fe->data.filename ); - wstring suffix(L".mcr"); - if( fName.compare(fName.length() - suffix.length(), suffix.length(), suffix) == 0 ) - { - app.DebugPrintf("Processing a region file: %ls\n",fName.c_str()); - ConvertRegionFile(File(fe->data.filename) ); - } - else - { - app.DebugPrintf("%ls is not a region file, ignoring\n", fName.c_str()); - } - } - - setLocalPlatform(); // set the platform of this save to the local platform, now that it's been coverted -} diff --git a/Minecraft.World/ConsoleSaveFileSplit.h b/Minecraft.World/ConsoleSaveFileSplit.h deleted file mode 100644 index 0b2017a2..00000000 --- a/Minecraft.World/ConsoleSaveFileSplit.h +++ /dev/null @@ -1,143 +0,0 @@ -#pragma once - -#include "FileHeader.h" -#include "ConsoleSavePath.h" -#include "ConsoleSaveFile.h" - -class ProgressRenderer; - -class ConsoleSaveFileSplit : public ConsoleSaveFile -{ -private: - FileHeader header; - - static const int WRITE_BANDWIDTH_BYTESPERSECOND = 1048576; // Average bytes per second we will cap to when writing region files during the tick() method - static const int WRITE_BANDWIDTH_MEASUREMENT_PERIOD_SECONDS = 10; // Time period over which the bytes per second average is calculated - static const int WRITE_TICK_RATE_MS = 500; // Time between attempts to work out which regions we should write during the tick - static const int WRITE_MAX_WRITE_PER_TICK = WRITE_BANDWIDTH_BYTESPERSECOND; // Maximum number of bytes we can add in a single tick - - class WriteHistory - { - public: - int64_t writeTime; - unsigned int writeSize; - } ; - - class DirtyRegionFile - { - public: - int64_t lastWritten; - unsigned int fileRef; - bool operator<(const DirtyRegionFile& rhs) { return lastWritten < rhs.lastWritten; } - }; - - class RegionFileReference - { - public: - RegionFileReference(int index, unsigned int regionIndex, unsigned int length = 0, unsigned char *data = NULL); - ~RegionFileReference(); - void Compress(); // Compress from data to dataCompressed - void Decompress(); // Decompress from dataCompressed -> data - unsigned int GetCompressedSize(); // Gets byte size for what this region will compress to - void ReleaseCompressed(); // Release dataCompressed - FileEntry *fileEntry; - unsigned char *data; - unsigned char *dataCompressed; - unsigned int dataCompressedSize; - int index; - bool dirty; - int64_t lastWritten; - }; - unordered_map regionFiles; - vector writeHistory; - int64_t m_lastTickTime; - - FileEntry *GetRegionFileEntry(unsigned int regionIndex); - - wstring m_fileName; - bool m_autosave; - -// HANDLE hHeap; - static void *pvHeap; - static unsigned int pagesCommitted; -#ifdef _LARGE_WORLDS - static const unsigned int CSF_PAGE_SIZE = 64 * 1024; - static const unsigned int MAX_PAGE_COUNT = 32 * 1024; // 2GB virtual allocation -#else - static const unsigned int CSF_PAGE_SIZE = 64 * 1024; - static const unsigned int MAX_PAGE_COUNT = 1024; -#endif - LPVOID pvSaveMem; - - CRITICAL_SECTION m_lock; - - void PrepareForWrite( FileEntry *file, DWORD nNumberOfBytesToWrite ); - void MoveDataBeyond(FileEntry *file, DWORD nNumberOfBytesToWrite); - - bool GetNumericIdentifierFromName(const wstring &fileName, unsigned int *idOut); - wstring GetNameFromNumericIdentifier(unsigned int idIn); - void processSubfilesForWrite(); - void processSubfilesAfterWrite(); -public: - static int SaveSaveDataCallback(LPVOID lpParam,bool bRes); - static int SaveRegionFilesCallback(LPVOID lpParam,bool bRes); - -private: - void _init(const wstring &fileName, LPVOID pvSaveData, DWORD fileSize, ESavePlatform plat); - -public: - ConsoleSaveFileSplit(const wstring &fileName, LPVOID pvSaveData = NULL, DWORD fileSize = 0, bool forceCleanSave = false, ESavePlatform plat = SAVE_FILE_PLATFORM_LOCAL); - ConsoleSaveFileSplit(ConsoleSaveFile *sourceSave, bool alreadySmallRegions = true, ProgressListener *progress = NULL); - virtual ~ConsoleSaveFileSplit(); - - // 4J Stu - Initial implementation is intended to have a similar interface to the standard Xbox file access functions - - virtual FileEntry *createFile( const ConsoleSavePath &fileName ); - virtual void deleteFile( FileEntry *file ); - - virtual void setFilePointer(FileEntry *file,LONG lDistanceToMove,PLONG lpDistanceToMoveHigh,DWORD dwMoveMethod); - virtual BOOL writeFile( FileEntry *file, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten ); - virtual BOOL zeroFile(FileEntry *file, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten); - virtual BOOL readFile( FileEntry *file, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead ); - virtual BOOL closeHandle( FileEntry *file ); - - virtual void finalizeWrite(); - virtual void tick(); - - virtual bool doesFileExist(ConsoleSavePath file); - - virtual void Flush(bool autosave, bool updateThumbnail = true); - -#ifndef _CONTENT_PACKAGE - virtual void DebugFlushToFile(void *compressedData = NULL, unsigned int compressedDataSize = 0); -#endif - virtual unsigned int getSizeOnDisk(); - - virtual wstring getFilename(); - - virtual vector *getFilesWithPrefix(const wstring &prefix); - virtual vector *getRegionFilesByDimension(unsigned int dimensionIndex); - -#if defined(__PS3__) || defined(__ORBIS__) - virtual wstring getPlayerDataFilenameForLoad(const PlayerUID& pUID); - virtual wstring getPlayerDataFilenameForSave(const PlayerUID& pUID); - virtual vector *getValidPlayerDatFiles(); -#endif //__PS3__ - - virtual int getSaveVersion(); - virtual int getOriginalSaveVersion(); - - virtual void LockSaveAccess(); - virtual void ReleaseSaveAccess(); - - virtual ESavePlatform getSavePlatform(); - virtual bool isSaveEndianDifferent(); - virtual void setLocalPlatform(); - virtual void setPlatform(ESavePlatform plat); - virtual ByteOrder getSaveEndian(); - virtual ByteOrder getLocalEndian(); - virtual void setEndian(ByteOrder endian); - - virtual void ConvertRegionFile(File sourceFile); - virtual void ConvertToLocalPlatform(); -}; \ No newline at end of file diff --git a/Minecraft.World/Container.h b/Minecraft.World/Container.h index 7aa63728..8fa21345 100644 --- a/Minecraft.World/Container.h +++ b/Minecraft.World/Container.h @@ -7,17 +7,23 @@ class Player; class Container { public: - static const int LARGE_MAX_STACK_SIZE = 64; + static const int LARGE_MAX_STACK_SIZE = 64; - virtual unsigned int getContainerSize() = 0; - virtual shared_ptr getItem(unsigned int slot) = 0; - virtual shared_ptr removeItem(unsigned int slot, int count) = 0; + // 4J-JEV: Added to distinguish between ender, bonus, small and large chests + virtual int getContainerType() { return -1; } + + virtual unsigned int getContainerSize() = 0; + virtual shared_ptr getItem(unsigned int slot) = 0; + virtual shared_ptr removeItem(unsigned int slot, int count) = 0; virtual shared_ptr removeItemNoUpdate(int slot) = 0; - virtual void setItem(unsigned int slot, shared_ptr item) = 0; - virtual int getName() = 0; - virtual int getMaxStackSize() = 0; - virtual void setChanged() = 0; - virtual bool stillValid(shared_ptr player) = 0; + virtual void setItem(unsigned int slot, shared_ptr item) = 0; + virtual wstring getName() = 0; + virtual wstring getCustomName() = 0; // 4J Stu added for sending over the network + virtual bool hasCustomName() = 0; + virtual int getMaxStackSize() = 0; + virtual void setChanged() = 0; + virtual bool stillValid(shared_ptr player) = 0; virtual void startOpen() = 0; virtual void stopOpen() = 0; + virtual bool canPlaceItem(int slot, shared_ptr item) = 0; }; \ No newline at end of file diff --git a/Minecraft.World/ContainerClickPacket.cpp b/Minecraft.World/ContainerClickPacket.cpp index 5b3ca24f..a9712183 100644 --- a/Minecraft.World/ContainerClickPacket.cpp +++ b/Minecraft.World/ContainerClickPacket.cpp @@ -18,16 +18,16 @@ ContainerClickPacket::ContainerClickPacket() buttonNum = 0; uid = 0; item = nullptr; - quickKey = false; + clickType = 0; } -ContainerClickPacket::ContainerClickPacket(int containerId, int slotNum, int buttonNum, bool quickKey, shared_ptr item, short uid) +ContainerClickPacket::ContainerClickPacket(int containerId, int slotNum, int buttonNum, int clickType, shared_ptr item, short uid) { this->containerId = containerId; this->slotNum = slotNum; this->buttonNum = buttonNum; this->uid = uid; - this->quickKey = quickKey; + this->clickType = clickType; // 4J - make a copy of the relevant bits of this item, as we want our packets to have full ownership of any data they reference this->item = item ? item->copy() : nullptr; } @@ -43,7 +43,7 @@ void ContainerClickPacket::read(DataInputStream *dis) //throws IOException slotNum = dis->readShort(); buttonNum = dis->readByte(); uid = dis->readShort(); - quickKey = dis->readBoolean(); + clickType = dis->readByte(); item = readItem(dis); } @@ -54,7 +54,7 @@ void ContainerClickPacket::write(DataOutputStream *dos) // throws IOException dos->writeShort(slotNum); dos->writeByte(buttonNum); dos->writeShort(uid); - dos->writeBoolean(quickKey); + dos->writeByte(clickType); writeItem(item, dos); } diff --git a/Minecraft.World/ContainerClickPacket.h b/Minecraft.World/ContainerClickPacket.h index 8bea7da5..51686166 100644 --- a/Minecraft.World/ContainerClickPacket.h +++ b/Minecraft.World/ContainerClickPacket.h @@ -11,11 +11,11 @@ public: int buttonNum; short uid; shared_ptr item; - bool quickKey; + int clickType; ContainerClickPacket(); ~ContainerClickPacket(); - ContainerClickPacket(int containerId, int slotNum, int buttonNum, bool quickKey, shared_ptr item, short uid); + ContainerClickPacket(int containerId, int slotNum, int buttonNum, int clickType, shared_ptr item, short uid); virtual void handle(PacketListener *listener); virtual void read(DataInputStream *dis); diff --git a/Minecraft.World/ContainerMenu.cpp b/Minecraft.World/ContainerMenu.cpp index 57190024..b1fd4d6b 100644 --- a/Minecraft.World/ContainerMenu.cpp +++ b/Minecraft.World/ContainerMenu.cpp @@ -11,7 +11,7 @@ ContainerMenu::ContainerMenu(shared_ptr inventory, shared_ptr container) : AbstractContainerMenu() { this->container = container; - this->containerRows = container->getContainerSize() / 9; + containerRows = container->getContainerSize() / 9; container->startOpen(); int yo = (containerRows - 4) * 18; @@ -45,7 +45,7 @@ bool ContainerMenu::stillValid(shared_ptr player) shared_ptr ContainerMenu::quickMoveStack(shared_ptr player, int slotIndex) { shared_ptr clicked = nullptr; - Slot *slot = slots->at(slotIndex); + Slot *slot = slots.at(slotIndex); if (slot != NULL && slot->hasItem()) { shared_ptr stack = slot->getItem(); @@ -53,7 +53,7 @@ shared_ptr ContainerMenu::quickMoveStack(shared_ptr player if (slotIndex < containerRows * 9) { - if(!moveItemStackTo(stack, containerRows * 9, (int)slots->size(), true)) + if(!moveItemStackTo(stack, containerRows * 9, (int)slots.size(), true)) { // 4J Stu - Brought forward from 1.2 return nullptr; @@ -85,9 +85,14 @@ void ContainerMenu::removed(shared_ptr player) container->stopOpen(); } -shared_ptr ContainerMenu::clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player) +shared_ptr ContainerMenu::getContainer() { - shared_ptr out = AbstractContainerMenu::clicked(slotIndex, buttonNum, clickType, player); + return container; +} + +shared_ptr ContainerMenu::clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player, bool looped) // 4J Added looped param +{ + shared_ptr out = AbstractContainerMenu::clicked(slotIndex, buttonNum, clickType, player, looped); #ifdef _EXTENDED_ACHIEVEMENTS shared_ptr localPlayer = dynamic_pointer_cast(player); @@ -98,7 +103,7 @@ shared_ptr ContainerMenu::clicked(int slotIndex, int buttonNum, in for (int i = 0; i < container->getContainerSize(); i++) { shared_ptr item = container->getItem(i); - if ( (item != nullptr) && (item->id == Tile::stoneBrick_Id) ) + if ( (item != nullptr) && (item->id == Tile::cobblestone_Id) ) { cobblecount += item->GetCount(); } @@ -107,7 +112,7 @@ shared_ptr ContainerMenu::clicked(int slotIndex, int buttonNum, in // 4J-JEV: This check performed on XboxOne servers, for other platforms check here. #ifndef _DURANGO StatsCounter *sc = Minecraft::GetInstance()->stats[localPlayer->GetXboxPad()]; - int minedCount = sc->getTotalValue(GenericStats::blocksMined(Tile::rock_Id)) + sc->getTotalValue(GenericStats::blocksMined(Tile::stoneBrick_Id)); + int minedCount = sc->getTotalValue(GenericStats::blocksMined(Tile::stone_Id)) + sc->getTotalValue(GenericStats::blocksMined(Tile::cobblestone_Id)); if (cobblecount >= 1728 && minedCount >= 1728 ) #endif { diff --git a/Minecraft.World/ContainerMenu.h b/Minecraft.World/ContainerMenu.h index e6da0782..5d70ecc5 100644 --- a/Minecraft.World/ContainerMenu.h +++ b/Minecraft.World/ContainerMenu.h @@ -15,8 +15,9 @@ public: virtual bool stillValid(shared_ptr player); virtual shared_ptr quickMoveStack(shared_ptr player, int slotIndex); - void removed(shared_ptr player); + virtual void removed(shared_ptr player); + virtual shared_ptr getContainer(); // 4J ADDED, - virtual shared_ptr clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player); + virtual shared_ptr clicked(int slotIndex, int buttonNum, int clickType, shared_ptr player, bool looped = false); }; diff --git a/Minecraft.World/ContainerOpenPacket.cpp b/Minecraft.World/ContainerOpenPacket.cpp index 7cb530cf..d5268922 100644 --- a/Minecraft.World/ContainerOpenPacket.cpp +++ b/Minecraft.World/ContainerOpenPacket.cpp @@ -4,20 +4,30 @@ #include "PacketListener.h" #include "ContainerOpenPacket.h" -ContainerOpenPacket::ContainerOpenPacket() -{ - containerId = 0; - type = 0; - title = 0; - size = 0; -} - -ContainerOpenPacket::ContainerOpenPacket(int containerId, int type, int title, int size) +void ContainerOpenPacket::_init(int containerId, int type, const wstring &title, int size, bool customName, int entityId) { this->containerId = containerId; this->type = type; this->title = title; this->size = size; + this->customName = customName; + this->entityId = entityId; +} + +ContainerOpenPacket::ContainerOpenPacket() +{ + _init(0, 0, L"", 0, false, 0); + +} + +ContainerOpenPacket::ContainerOpenPacket(int containerId, int type, const wstring &title, int size, bool customName) +{ + _init(containerId, type, title, size, customName, 0); +} + +ContainerOpenPacket::ContainerOpenPacket(int containerId, int type, const wstring &title, int size, bool customName, int entityId) +{ + _init(containerId, type, title, size, customName, entityId); } void ContainerOpenPacket::handle(PacketListener *listener) @@ -30,19 +40,39 @@ void ContainerOpenPacket::read(DataInputStream *dis) //throws IOException { containerId = dis->readByte() & 0xff; type = dis->readByte() & 0xff; - title = dis->readShort(); size = dis->readByte() & 0xff; + customName = dis->readBoolean(); + if (type == HORSE) + { + entityId = dis->readInt(); + } + if(customName) + { + title = readUtf(dis,64); + } } void ContainerOpenPacket::write(DataOutputStream *dos) //throws IOException { dos->writeByte(containerId & 0xff); dos->writeByte(type & 0xff); - dos->writeShort(title & 0xffff); dos->writeByte(size & 0xff); + dos->writeBoolean(customName); + if (type == HORSE) + { + dos->writeInt(entityId); + } + if(customName) + { + writeUtf(title, dos); + } } int ContainerOpenPacket::getEstimatedSize() { - return 5; + if (type == HORSE) + { + return 10; + } + return 6; } diff --git a/Minecraft.World/ContainerOpenPacket.h b/Minecraft.World/ContainerOpenPacket.h index dbc65b9a..896b7dd9 100644 --- a/Minecraft.World/ContainerOpenPacket.h +++ b/Minecraft.World/ContainerOpenPacket.h @@ -15,14 +15,30 @@ public: static const int TRADER_NPC = 6; static const int BEACON = 7; static const int REPAIR_TABLE = 8; + static const int HOPPER = 9; + static const int DROPPER = 10; + static const int HORSE = 11; + static const int FIREWORKS = 12; // 4J Added + static const int BONUS_CHEST = 13; // 4J Added + static const int LARGE_CHEST = 14; // 4J Added + static const int ENDER_CHEST = 15; // 4J Added + static const int MINECART_CHEST = 16; // 4J Added + static const int MINECART_HOPPER = 17; // 4J Added int containerId; int type; - int title; // 4J Stu - Changed from string int size; + bool customName; + wstring title; + int entityId; +private: + void _init(int containerId, int type, const wstring &title, int size, bool customName, int entityId); + +public: ContainerOpenPacket(); - ContainerOpenPacket(int containerId, int type, int title, int size); + ContainerOpenPacket(int containerId, int type, const wstring &title, int size, bool customName); + ContainerOpenPacket(int containerId, int type, const wstring &title, int size, bool customName, int entityId); virtual void handle(PacketListener *listener); virtual void read(DataInputStream *dis); diff --git a/Minecraft.World/ControlledByPlayerGoal.cpp b/Minecraft.World/ControlledByPlayerGoal.cpp index 1e035494..cea227cd 100644 --- a/Minecraft.World/ControlledByPlayerGoal.cpp +++ b/Minecraft.World/ControlledByPlayerGoal.cpp @@ -36,8 +36,7 @@ void ControlledByPlayerGoal::stop() bool ControlledByPlayerGoal::canUse() { - shared_ptr player = dynamic_pointer_cast( mob->rider.lock() ); - return mob->isAlive() && player && (boosting || mob->canBeControlledByRider()); + return mob->isAlive() && mob->rider.lock() != NULL && mob->rider.lock()->instanceof(eTYPE_PLAYER) && (boosting || mob->canBeControlledByRider()); } void ControlledByPlayerGoal::tick() @@ -120,7 +119,7 @@ void ControlledByPlayerGoal::tick() if (carriedItem != NULL && carriedItem->id == Item::carrotOnAStick_Id) { - carriedItem->hurt(1, player); + carriedItem->hurtAndBreak(1, player); if (carriedItem->count == 0) { @@ -134,6 +133,11 @@ void ControlledByPlayerGoal::tick() mob->travel(0, moveSpeed); } +bool ControlledByPlayerGoal::isNoJumpTile(int tile) +{ + return Tile::tiles[tile] != NULL && (Tile::tiles[tile]->getRenderShape() == Tile::SHAPE_STAIRS || (dynamic_cast(Tile::tiles[tile]) != NULL) ); +} + bool ControlledByPlayerGoal::isBoosting() { return boosting; diff --git a/Minecraft.World/ControlledByPlayerGoal.h b/Minecraft.World/ControlledByPlayerGoal.h index f49eaaf1..25bd579c 100644 --- a/Minecraft.World/ControlledByPlayerGoal.h +++ b/Minecraft.World/ControlledByPlayerGoal.h @@ -26,6 +26,11 @@ public: void stop(); bool canUse(); void tick(); + +private: + bool isNoJumpTile(int tile); + +public: bool isBoosting(); void boost(); bool canBoost(); diff --git a/Minecraft.World/Cow.cpp b/Minecraft.World/Cow.cpp index c259183e..05e70102 100644 --- a/Minecraft.World/Cow.cpp +++ b/Minecraft.World/Cow.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "com.mojang.nbt.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.ai.navigation.h" #include "net.minecraft.world.entity.ai.goal.h" #include "net.minecraft.world.level.tile.h" @@ -7,6 +8,7 @@ #include "net.minecraft.world.level.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.stats.h" #include "Cow.h" #include "..\Minecraft.Client\Textures.h" @@ -19,20 +21,18 @@ Cow::Cow(Level *level) : Animal( level ) // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); + registerAttributes(); + setHealth(getMaxHealth()); - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); - - this->textureIdx = TN_MOB_COW; // 4J was L"/mob/cow.png"; this->setSize(0.9f, 1.3f); getNavigation()->setAvoidWater(true); goalSelector.addGoal(0, new FloatGoal(this)); - goalSelector.addGoal(1, new PanicGoal(this, 0.38f)); - goalSelector.addGoal(2, new BreedGoal(this, 0.2f)); - goalSelector.addGoal(3, new TemptGoal(this, 0.25f, Item::wheat_Id, false)); - goalSelector.addGoal(4, new FollowParentGoal(this, 0.25f)); - goalSelector.addGoal(5, new RandomStrollGoal(this, 0.2f)); + goalSelector.addGoal(1, new PanicGoal(this, 2.0f)); + goalSelector.addGoal(2, new BreedGoal(this, 1.0f)); + goalSelector.addGoal(3, new TemptGoal(this, 1.25f, Item::wheat_Id, false)); + goalSelector.addGoal(4, new FollowParentGoal(this, 1.25f)); + goalSelector.addGoal(5, new RandomStrollGoal(this, 1.0f)); goalSelector.addGoal(6, new LookAtPlayerGoal(this, typeid(Player), 6)); goalSelector.addGoal(7, new RandomLookAroundGoal(this)); } @@ -42,9 +42,12 @@ bool Cow::useNewAi() return true; } -int Cow::getMaxHealth() +void Cow::registerAttributes() { - return 10; + Animal::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(10); + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.2f); } int Cow::getAmbientSound() @@ -62,6 +65,11 @@ int Cow::getDeathSound() return eSoundType_MOB_COW_HURT; } +void Cow::playStepSound(int xt, int yt, int zt, int t) +{ + playSound(eSoundType_MOB_COW_STEP, 0.15f, 1); +} + float Cow::getSoundVolume() { return 0.4f; @@ -95,25 +103,25 @@ void Cow::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) } } -bool Cow::interact(shared_ptr player) +bool Cow::mobInteract(shared_ptr player) { shared_ptr item = player->inventory->getSelected(); - if (item != NULL && item->id == Item::bucket_empty->id) + if (item != NULL && item->id == Item::bucket_empty->id && !player->abilities.instabuild) { player->awardStat(GenericStats::cowsMilked(),GenericStats::param_cowsMilked()); - if (--item->count <= 0) + if (item->count-- == 0) { - player->inventory->setItem(player->inventory->selected, shared_ptr( new ItemInstance(Item::milk) ) ); + player->inventory->setItem(player->inventory->selected, shared_ptr( new ItemInstance(Item::bucket_milk) ) ); } - else if (!player->inventory->add(shared_ptr( new ItemInstance(Item::milk) ))) + else if (!player->inventory->add(shared_ptr( new ItemInstance(Item::bucket_milk) ))) { - player->drop(shared_ptr( new ItemInstance(Item::milk) )); + player->drop(shared_ptr( new ItemInstance(Item::bucket_milk) )); } return true; } - return Animal::interact(player); + return Animal::mobInteract(player); } shared_ptr Cow::getBreedOffspring(shared_ptr target) diff --git a/Minecraft.World/Cow.h b/Minecraft.World/Cow.h index a1a91aba..24210631 100644 --- a/Minecraft.World/Cow.h +++ b/Minecraft.World/Cow.h @@ -16,17 +16,18 @@ public: public: Cow(Level *level); virtual bool useNewAi(); - virtual int getMaxHealth(); protected: + virtual void registerAttributes(); virtual int getAmbientSound(); virtual int getHurtSound(); virtual int getDeathSound(); virtual float getSoundVolume(); virtual int getDeathLoot(); + virtual void playStepSound(int xt, int yt, int zt, int t); virtual void dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel); public: - virtual bool interact(shared_ptr player); + virtual bool mobInteract(shared_ptr player); virtual shared_ptr getBreedOffspring(shared_ptr target); }; diff --git a/Minecraft.World/CraftingContainer.cpp b/Minecraft.World/CraftingContainer.cpp index fbcc5678..7057edfe 100644 --- a/Minecraft.World/CraftingContainer.cpp +++ b/Minecraft.World/CraftingContainer.cpp @@ -41,9 +41,19 @@ shared_ptr CraftingContainer::getItem(unsigned int x, unsigned int return getItem(pos); } -int CraftingContainer::getName() +wstring CraftingContainer::getName() { - return 0; + return L""; +} + +wstring CraftingContainer::getCustomName() +{ + return L""; +} + +bool CraftingContainer::hasCustomName() +{ + return false; } shared_ptr CraftingContainer::removeItemNoUpdate(int slot) @@ -95,6 +105,11 @@ void CraftingContainer::setChanged() } bool CraftingContainer::stillValid(shared_ptr player) +{ + return true; +} + +bool CraftingContainer::canPlaceItem(int slot, shared_ptr item) { return true; } \ No newline at end of file diff --git a/Minecraft.World/CraftingContainer.h b/Minecraft.World/CraftingContainer.h index 863249a2..fc8c2967 100644 --- a/Minecraft.World/CraftingContainer.h +++ b/Minecraft.World/CraftingContainer.h @@ -18,7 +18,9 @@ public: virtual unsigned int getContainerSize(); virtual shared_ptr getItem(unsigned int slot); shared_ptr getItem(unsigned int x, unsigned int y); - virtual int getName(); + virtual wstring getName(); + virtual wstring getCustomName(); + virtual bool hasCustomName(); virtual shared_ptr removeItemNoUpdate(int slot); virtual shared_ptr removeItem(unsigned int slot, int count); virtual void setItem(unsigned int slot, shared_ptr item); @@ -29,4 +31,5 @@ public: void startOpen() { } // TODO Auto-generated method stub void stopOpen() { } // TODO Auto-generated method stub + virtual bool canPlaceItem(int slot, shared_ptr item); }; \ No newline at end of file diff --git a/Minecraft.World/CraftingMenu.cpp b/Minecraft.World/CraftingMenu.cpp index eeb2a6e3..c104bbec 100644 --- a/Minecraft.World/CraftingMenu.cpp +++ b/Minecraft.World/CraftingMenu.cpp @@ -23,9 +23,9 @@ CraftingMenu::CraftingMenu(shared_ptr inventory, Level *level, int xt resultSlots = shared_ptr( new ResultContainer() ); this->level = level; - this->x = xt; - this->y = yt; - this->z = zt; + x = xt; + y = yt; + z = zt; addSlot(new ResultSlot( inventory->player, craftSlots, resultSlots, 0, 120 + 4, 31 + 4)); for (int y = 0; y < 3; y++) @@ -81,7 +81,7 @@ bool CraftingMenu::stillValid(shared_ptr player) shared_ptr CraftingMenu::quickMoveStack(shared_ptr player, int slotIndex) { shared_ptr clicked = nullptr; - Slot *slot = slots->at(slotIndex); + Slot *slot = slots.at(slotIndex); if (slot != NULL && slot->hasItem()) { shared_ptr stack = slot->getItem(); @@ -135,4 +135,9 @@ shared_ptr CraftingMenu::quickMoveStack(shared_ptr player, } } return clicked; +} + +bool CraftingMenu::canTakeItemForPickAll(shared_ptr carried, Slot *target) +{ + return target->container != resultSlots && AbstractContainerMenu::canTakeItemForPickAll(carried, target); } \ No newline at end of file diff --git a/Minecraft.World/CraftingMenu.h b/Minecraft.World/CraftingMenu.h index 0452eccc..b10344c0 100644 --- a/Minecraft.World/CraftingMenu.h +++ b/Minecraft.World/CraftingMenu.h @@ -32,4 +32,9 @@ public: virtual void removed(shared_ptr player); virtual bool stillValid(shared_ptr player); virtual shared_ptr quickMoveStack(shared_ptr player, int slotIndex); + virtual bool canTakeItemForPickAll(shared_ptr carried, Slot *target); + + int getX() { return x; } + int getY() { return y; } + int getZ() { return z; } }; \ No newline at end of file diff --git a/Minecraft.World/Creeper.cpp b/Minecraft.World/Creeper.cpp index 3f6c66a7..29be2c0c 100644 --- a/Minecraft.World/Creeper.cpp +++ b/Minecraft.World/Creeper.cpp @@ -3,11 +3,13 @@ #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.ai.goal.h" #include "net.minecraft.world.entity.ai.goal.target.h" #include "net.minecraft.world.entity.ai.navigation.h" #include "net.minecraft.world.entity.animal.h" #include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.damagesource.h" #include "GeneralStat.h" #include "Skeleton.h" @@ -22,6 +24,8 @@ void Creeper::_init() { swell = 0; oldSwell = 0; + maxSwell = 30; + explosionRadius = 3; } Creeper::Creeper(Level *level) : Monster( level ) @@ -29,105 +33,124 @@ Creeper::Creeper(Level *level) : Monster( level ) // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); - - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); + registerAttributes(); + setHealth(getMaxHealth()); _init(); - - this->textureIdx = TN_MOB_CREEPER; // 4J was L"/mob/creeper.png"; goalSelector.addGoal(1, new FloatGoal(this)); goalSelector.addGoal(2, new SwellGoal(this)); - goalSelector.addGoal(3, new AvoidPlayerGoal(this, typeid(Ozelot), 6, 0.25f, 0.30f)); - goalSelector.addGoal(4, new MeleeAttackGoal(this, 0.25f, false)); - goalSelector.addGoal(5, new RandomStrollGoal(this, 0.20f)); + goalSelector.addGoal(3, new AvoidPlayerGoal(this, typeid(Ocelot), 6, 1.0, 1.2)); + goalSelector.addGoal(4, new MeleeAttackGoal(this, 1.0, false)); + goalSelector.addGoal(5, new RandomStrollGoal(this, 0.8)); goalSelector.addGoal(6, new LookAtPlayerGoal(this, typeid(Player), 8)); goalSelector.addGoal(6, new RandomLookAroundGoal(this)); - targetSelector.addGoal(1, new NearestAttackableTargetGoal(this, typeid(Player), 16, 0, true)); + targetSelector.addGoal(1, new NearestAttackableTargetGoal(this, typeid(Player), 0, true)); targetSelector.addGoal(2, new HurtByTargetGoal(this, false)); } +void Creeper::registerAttributes() +{ + Monster::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.25f); +} + bool Creeper::useNewAi() { return true; } -int Creeper::getMaxHealth() +int Creeper::getMaxFallDistance() { - 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..b087e535 100644 --- a/Minecraft.World/DispenserTileEntity.cpp +++ b/Minecraft.World/DispenserTileEntity.cpp @@ -1,5 +1,3 @@ -using namespace std; - #include "stdafx.h" #include "com.mojang.nbt.h" #include "TileEntity.h" @@ -13,14 +11,14 @@ using namespace std; DispenserTileEntity::DispenserTileEntity() : TileEntity() { - items = new ItemInstanceArray(9); + items = ItemInstanceArray(9); random = new Random(); + name = L""; } DispenserTileEntity::~DispenserTileEntity() { - delete[] items->data; - delete items; + delete[] items.data; delete random; } @@ -32,27 +30,27 @@ unsigned int DispenserTileEntity::getContainerSize() shared_ptr DispenserTileEntity::getItem(unsigned int slot) { - return items->data[slot]; + return items[slot]; } shared_ptr DispenserTileEntity::removeItem(unsigned int slot, int count) { - if (items->data[slot] != NULL) + if (items[slot] != NULL) { - if (items->data[slot]->count <= count) + if (items[slot]->count <= count) { - shared_ptr item = items->data[slot]; - items->data[slot] = nullptr; - this->setChanged(); + shared_ptr item = items[slot]; + items[slot] = nullptr; + setChanged(); // 4J Stu - Fix for duplication glitch if(item->count <= 0) return nullptr; return item; } else { - shared_ptr i = items->data[slot]->remove(count); - if (items->data[slot]->count == 0) items->data[slot] = nullptr; - this->setChanged(); + shared_ptr i = items[slot]->remove(count); + if (items[slot]->count == 0) items[slot] = nullptr; + setChanged(); // 4J Stu - Fix for duplication glitch if(i->count <= 0) return nullptr; return i; @@ -63,10 +61,10 @@ shared_ptr DispenserTileEntity::removeItem(unsigned int slot, int shared_ptr DispenserTileEntity::removeItemNoUpdate(int slot) { - if (items->data[slot] != NULL) + if (items[slot] != NULL) { - shared_ptr item = items->data[slot]; - items->data[slot] = nullptr; + shared_ptr item = items[slot]; + items[slot] = nullptr; return item; } return nullptr; @@ -75,20 +73,20 @@ shared_ptr DispenserTileEntity::removeItemNoUpdate(int slot) // 4J-PB added for spawn eggs not being useable due to limits, so add them in again void DispenserTileEntity::AddItemBack(shared_ptritem, unsigned int slot) { - if (items->data[slot] != NULL) + if (items[slot] != NULL) { // just increment the count of the items - if(item->id==items->data[slot]->id) + if(item->id==items[slot]->id) { - items->data[slot]->count++; - this->setChanged(); + items[slot]->count++; + setChanged(); } } else { - items->data[slot] = item; + items[slot] = item; if (item != NULL && item->count > getMaxStackSize()) item->count = getMaxStackSize(); - this->setChanged(); + setChanged(); } } /** @@ -99,9 +97,9 @@ void DispenserTileEntity::AddItemBack(shared_ptritem, unsigned int */ bool DispenserTileEntity::removeProjectile(int itemId) { - for (unsigned int i = 0; i < items->length; i++) + for (unsigned int i = 0; i < items.length; i++) { - if (items->data[i] != NULL && items->data[i]->id == itemId) + if (items[i] != NULL && items[i]->id == itemId) { shared_ptr removedItem = removeItem(i, 1); return removedItem != NULL; @@ -114,9 +112,9 @@ int DispenserTileEntity::getRandomSlot() { int replaceSlot = -1; int replaceOdds = 1; - for (unsigned int i = 0; i < items->length; i++) + for (unsigned int i = 0; i < items.length; i++) { - if (items->data[i] != NULL && random->nextInt(replaceOdds++) == 0) + if (items[i] != NULL && random->nextInt(replaceOdds++) == 0) { replaceSlot = i; } @@ -127,18 +125,18 @@ int DispenserTileEntity::getRandomSlot() void DispenserTileEntity::setItem(unsigned int slot, shared_ptr item) { - items->data[slot] = item; + items[slot] = item; if (item != NULL && item->count > getMaxStackSize()) item->count = getMaxStackSize(); - this->setChanged(); + setChanged(); } int DispenserTileEntity::addItem(shared_ptr item) { - for (int i = 0; i < items->length; i++) + for (int i = 0; i < items.length; i++) { - if ((*items)[i] == NULL || (*items)[i]->id == 0) + if (items[i] == NULL || items[i]->id == 0) { - (*items)[i] = item; + setItem(i, item); return i; } } @@ -146,22 +144,39 @@ int DispenserTileEntity::addItem(shared_ptr item) return -1; } -int DispenserTileEntity::getName() +wstring DispenserTileEntity::getName() { - return 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,17 +184,18 @@ void DispenserTileEntity::save(CompoundTag *base) TileEntity::save(base); ListTag *listTag = new ListTag; - for (unsigned int i = 0; i < items->length; i++) + for (unsigned int i = 0; i < items.length; i++) { - if (items->data[i] != NULL) + if (items[i] != NULL) { CompoundTag *tag = new CompoundTag(); tag->putByte(L"Slot", (byte) i); - items->data[i]->save(tag); + items[i]->save(tag); listTag->add(tag); } } base->put(L"Items", listTag); + if (hasCustomName()) base->putString(L"CustomName", name); } int DispenserTileEntity::getMaxStackSize() @@ -207,17 +223,22 @@ void DispenserTileEntity::stopOpen() { } +bool DispenserTileEntity::canPlaceItem(int slot, shared_ptr item) +{ + return true; +} + // 4J Added shared_ptr DispenserTileEntity::clone() { shared_ptr result = shared_ptr( new DispenserTileEntity() ); TileEntity::clone(result); - for (unsigned int i = 0; i < items->length; i++) + for (unsigned int i = 0; i < items.length; i++) { - if (items->data[i] != NULL) + if (items[i] != NULL) { - result->items->data[i] = ItemInstance::clone(items->data[i]); + result->items[i] = ItemInstance::clone(items[i]); } } return result; diff --git a/Minecraft.World/DispenserTileEntity.h b/Minecraft.World/DispenserTileEntity.h index 8519ad54..fc0c1f39 100644 --- a/Minecraft.World/DispenserTileEntity.h +++ b/Minecraft.World/DispenserTileEntity.h @@ -18,12 +18,15 @@ public: static TileEntity *create() { return new DispenserTileEntity(); } -using TileEntity::setChanged; + using TileEntity::setChanged; private: - ItemInstanceArray *items; + ItemInstanceArray items; Random *random; +protected: + wstring name; + public: DispenserTileEntity(); virtual ~DispenserTileEntity(); @@ -31,20 +34,24 @@ public: virtual unsigned int getContainerSize(); virtual shared_ptr getItem(unsigned int slot); virtual shared_ptr removeItem(unsigned int slot, int count); - shared_ptr removeItemNoUpdate(int slot); - bool removeProjectile(int itemId); - int getRandomSlot(); + virtual shared_ptr removeItemNoUpdate(int slot); + virtual bool removeProjectile(int itemId); + virtual int getRandomSlot(); virtual void setItem(unsigned int slot, shared_ptr item); virtual int addItem(shared_ptr item); - virtual int getName(); + virtual wstring getName(); + virtual wstring getCustomName(); + virtual void setCustomName(const wstring &name); + virtual bool hasCustomName(); virtual void load(CompoundTag *base); virtual void save(CompoundTag *base); virtual int getMaxStackSize(); virtual bool stillValid(shared_ptr player); virtual void setChanged(); - void startOpen(); - void stopOpen(); + virtual void startOpen(); + virtual void stopOpen(); + virtual bool canPlaceItem(int slot, shared_ptr item); // 4J Added virtual shared_ptr clone(); diff --git a/Minecraft.World/DoorItem.cpp b/Minecraft.World/DoorItem.cpp index d59ac8d9..97de0f65 100644 --- a/Minecraft.World/DoorItem.cpp +++ b/Minecraft.World/DoorItem.cpp @@ -28,7 +28,7 @@ bool DoorItem::useOn(shared_ptr instance, shared_ptr playe if (material == Material::wood) tile = Tile::door_wood; else tile = Tile::door_iron; - if (!player->mayBuild(x, y, z) || !player->mayBuild(x, y + 1, z)) return false; + if (!player->mayUseItemAt(x, y, z, face, instance) || !player->mayUseItemAt(x, y + 1, z, face, instance)) return false; if (!tile->mayPlace(level, x, y, z)) return false; // 4J-PB - Adding a test only version to allow tooltips to be displayed @@ -65,10 +65,8 @@ void DoorItem::place(Level *level, int x, int y, int z, int dir, Tile *tile) if (doorLeft && !doorRight) flip = true; else if (solidRight > solidLeft) flip = true; - level->noNeighborUpdate = true; - level->setTileAndData(x, y, z, tile->id, dir); - level->setTileAndData(x, y + 1, z, tile->id, 8 | (flip ? 1 : 0)); - level->noNeighborUpdate = false; + level->setTileAndData(x, y, z, tile->id, dir, Tile::UPDATE_CLIENTS); + level->setTileAndData(x, y + 1, z, tile->id, 8 | (flip ? 1 : 0), Tile::UPDATE_CLIENTS); level->updateNeighborsAt(x, y, z, tile->id); level->updateNeighborsAt(x, y + 1, z, tile->id); } diff --git a/Minecraft.World/DoorTile.cpp b/Minecraft.World/DoorTile.cpp index be31be27..8b70e6d9 100644 --- a/Minecraft.World/DoorTile.cpp +++ b/Minecraft.World/DoorTile.cpp @@ -12,8 +12,6 @@ const wstring DoorTile::TEXTURES[] = { L"doorWood_lower", L"doorWood_upper", L"d DoorTile::DoorTile(int id, Material *material) : Tile(id, material,isSolidRender()) { - icons = NULL; - if (material == Material::metal) { texBase = 2; @@ -30,12 +28,12 @@ DoorTile::DoorTile(int id, Material *material) : Tile(id, material,isSolidRender Icon *DoorTile::getTexture(int face, int data) { - return icons[texBase]; + return iconBottom[TEXTURE_NORMAL]; } Icon *DoorTile::getTexture(LevelSource *level, int x, int y, int z, int face) { - if (face == Facing::UP || face == Facing::DOWN) return icons[texBase]; + if (face == Facing::UP || face == Facing::DOWN) return iconBottom[TEXTURE_NORMAL]; int compositeData = getCompositeData(level, x, y, z); int dir = compositeData & C_DIR_MASK; @@ -59,18 +57,22 @@ Icon *DoorTile::getTexture(LevelSource *level, int x, int y, int z, int face) if ((compositeData & C_RIGHT_HINGE_MASK) != 0) flip = !flip; } - return icons[texBase + (flip ? DOOR_TILE_TEXTURE_COUNT : 0) + (upper ? 1 : 0)]; + if (upper) + { + return iconTop[flip ? TEXTURE_FLIPPED : TEXTURE_NORMAL]; + } + else + { + return iconBottom[flip ? TEXTURE_FLIPPED : TEXTURE_NORMAL]; + } } void DoorTile::registerIcons(IconRegister *iconRegister) { - icons = new Icon*[DOOR_TILE_TEXTURE_COUNT * 2]; - - for (int i = 0; i < DOOR_TILE_TEXTURE_COUNT; i++) - { - icons[i] = iconRegister->registerIcon(TEXTURES[i]); - icons[i + DOOR_TILE_TEXTURE_COUNT] = new FlippedIcon(icons[i], true, false); - } + iconTop[TEXTURE_NORMAL] = iconRegister->registerIcon(getIconName() + L"_upper"); + iconBottom[TEXTURE_NORMAL] = iconRegister->registerIcon(getIconName() + L"_lower"); + iconTop[TEXTURE_FLIPPED] = new FlippedIcon(iconTop[TEXTURE_NORMAL], true, false); + iconBottom[TEXTURE_FLIPPED] = new FlippedIcon(iconBottom[TEXTURE_NORMAL], true, false); } bool DoorTile::blocksLight() @@ -177,12 +179,12 @@ void DoorTile::attack(Level *level, int x, int y, int z, shared_ptr play // 4J-PB - Adding a TestUse for tooltip display bool DoorTile::TestUse() { - return true; + return id == Tile::door_wood_Id; } bool DoorTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param { - if(soundOnly) + if (soundOnly) { // 4J - added - just do enough to play the sound if (material != Material::metal) @@ -199,12 +201,12 @@ bool DoorTile::use(Level *level, int x, int y, int z, shared_ptr player, lowerData ^= 4; if ((compositeData & C_IS_UPPER_MASK) == 0) { - level->setData(x, y, z, lowerData);//, Tile.UPDATE_CLIENTS); + level->setData(x, y, z, lowerData, Tile::UPDATE_CLIENTS); level->setTilesDirty(x, y, z, x, y, z); } else { - level->setData(x, y - 1, z, lowerData);//, Tile.UPDATE_CLIENTS); + level->setData(x, y - 1, z, lowerData, Tile::UPDATE_CLIENTS); level->setTilesDirty(x, y - 1, z, x, y, z); } @@ -222,12 +224,12 @@ void DoorTile::setOpen(Level *level, int x, int y, int z, bool shouldOpen) lowerData ^= 4; if ((compositeData & C_IS_UPPER_MASK) == 0) { - level->setData(x, y, z, lowerData);//, Tile.UPDATE_CLIENTS); + level->setData(x, y, z, lowerData, Tile::UPDATE_CLIENTS); level->setTilesDirty(x, y, z, x, y, z); } else { - level->setData(x, y - 1, z, lowerData);//, Tile.UPDATE_CLIENTS); + level->setData(x, y - 1, z, lowerData, Tile::UPDATE_CLIENTS); level->setTilesDirty(x, y - 1, z, x, y, z); } @@ -242,16 +244,16 @@ void DoorTile::neighborChanged(Level *level, int x, int y, int z, int type) bool spawn = false; if (level->getTile(x, y + 1, z) != id) { - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); spawn = true; } if (!level->isSolidBlockingTile(x, y - 1, z)) { - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); spawn = true; if (level->getTile(x, y + 1, z) == id) { - level->setTile(x, y + 1, z, 0); + level->removeTile(x, y + 1, z); } } if (spawn) @@ -274,7 +276,7 @@ void DoorTile::neighborChanged(Level *level, int x, int y, int z, int type) { if (level->getTile(x, y - 1, z) != id) { - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); } if (type > 0 && type != id) { @@ -339,3 +341,17 @@ int DoorTile::cloneTileId(Level *level, int x, int y, int z) { return material == Material::metal ? Item::door_iron_Id : Item::door_wood_Id; } + +void DoorTile::playerWillDestroy(Level *level, int x, int y, int z, int data, shared_ptr player) +{ + if (player->abilities.instabuild) + { + if ((data & UPPER_BIT) != 0) + { + if (level->getTile(x, y - 1, z) == id) + { + level->removeTile(x, y - 1, z); + } + } + } +} \ No newline at end of file diff --git a/Minecraft.World/DoorTile.h b/Minecraft.World/DoorTile.h index 59a8b414..a4e4f62f 100644 --- a/Minecraft.World/DoorTile.h +++ b/Minecraft.World/DoorTile.h @@ -10,6 +10,11 @@ class DoorTile : public Tile { friend class Tile; friend class ChunkRebuildData; + +private: + static const int TEXTURE_NORMAL = 0; + static const int TEXTURE_FLIPPED = 1; + public: static const int UPPER_BIT = 8; static const int C_DIR_MASK = 3; @@ -22,16 +27,15 @@ private: static const int DOOR_TILE_TEXTURE_COUNT = 4; static const wstring TEXTURES[]; int texBase; - Icon **icons; + Icon *iconTop[2]; + Icon *iconBottom[2]; protected: DoorTile(int id, Material *material); public: virtual Icon *getTexture(int face, int data); - //@Override - Icon *getTexture(LevelSource *level, int x, int y, int z, int face); - //@Override - void registerIcons(IconRegister *iconRegister); + virtual Icon *getTexture(LevelSource *level, int x, int y, int z, int face); + virtual void registerIcons(IconRegister *iconRegister); virtual bool blocksLight(); virtual bool isSolidRender(bool isServerLevel = false); virtual bool isCubeShaped(); @@ -57,4 +61,5 @@ public: virtual int getPistonPushReaction(); int getCompositeData(LevelSource *level, int x, int y, int z); virtual int cloneTileId(Level *level, int x, int y, int z); + virtual void playerWillDestroy(Level *level, int x, int y, int z, int data, shared_ptr player); }; diff --git a/Minecraft.World/DoubleTag.h b/Minecraft.World/DoubleTag.h index 130c3ebb..1f768d5b 100644 --- a/Minecraft.World/DoubleTag.h +++ b/Minecraft.World/DoubleTag.h @@ -10,7 +10,7 @@ public: DoubleTag(const wstring &name, double data) : Tag(name) {this->data = data; } void write(DataOutput *dos) { dos->writeDouble(data); } - void load(DataInput *dis) { data = dis->readDouble(); } + void load(DataInput *dis, int tagDepth) { data = dis->readDouble(); } byte getId() { return TAG_Double; } wstring toString() diff --git a/Minecraft.World/DragonFireball.cpp b/Minecraft.World/DragonFireball.cpp index e3b5d579..32524592 100644 --- a/Minecraft.World/DragonFireball.cpp +++ b/Minecraft.World/DragonFireball.cpp @@ -17,7 +17,7 @@ DragonFireball::DragonFireball(Level *level) : Fireball(level) setSize(5 / 16.0f, 5 / 16.0f); } -DragonFireball::DragonFireball(Level *level, shared_ptr mob, double xa, double ya, double za) : Fireball(level, mob, xa, ya, za) +DragonFireball::DragonFireball(Level *level, shared_ptr mob, double xa, double ya, double za) : Fireball(level, mob, xa, ya, za) { setSize(5 / 16.0f, 5 / 16.0f); } @@ -32,7 +32,7 @@ void DragonFireball::onHit(HitResult *res) if (!level->isClientSide) { AABB *aoe = bb->grow(SPLASH_RANGE, SPLASH_RANGE / 2, SPLASH_RANGE); - vector > *entitiesOfClass = level->getEntitiesOfClass(typeid(Mob), aoe); + vector > *entitiesOfClass = level->getEntitiesOfClass(typeid(LivingEntity), aoe); if (entitiesOfClass != NULL && !entitiesOfClass->empty()) { @@ -40,7 +40,7 @@ void DragonFireball::onHit(HitResult *res) for( AUTO_VAR(it, entitiesOfClass->begin()); it != entitiesOfClass->end(); ++it) { //shared_ptr e = *it; - shared_ptr e = dynamic_pointer_cast( *it ); + shared_ptr e = dynamic_pointer_cast( *it ); double dist = distanceToSqr(e); if (dist < SPLASH_RANGE_SQ) { @@ -65,22 +65,17 @@ bool DragonFireball::isPickable() return false; } -bool DragonFireball::hurt(DamageSource *source, int damage) +bool DragonFireball::hurt(DamageSource *source, float damage) { return false; } -bool DragonFireball::shouldBurn() -{ - return false; -} - -int DragonFireball::getIcon() -{ - 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..166e8d5f 100644 --- a/Minecraft.World/EnchantmentContainer.cpp +++ b/Minecraft.World/EnchantmentContainer.cpp @@ -2,7 +2,7 @@ #include "net.minecraft.world.inventory.h" #include "EnchantmentContainer.h" -EnchantmentContainer::EnchantmentContainer(EnchantmentMenu *menu) : SimpleContainer(IDS_ENCHANT, 1), m_menu( menu ) +EnchantmentContainer::EnchantmentContainer(EnchantmentMenu *menu) : SimpleContainer(IDS_ENCHANT, L"", false, 1), m_menu( menu ) { } @@ -15,4 +15,9 @@ void EnchantmentContainer::setChanged() { SimpleContainer::setChanged(); m_menu->slotsChanged(); // Remove this param as it's not needed +} + +bool EnchantmentContainer::canPlaceItem(int slot, shared_ptr item) +{ + return true; } \ No newline at end of file diff --git a/Minecraft.World/EnchantmentContainer.h b/Minecraft.World/EnchantmentContainer.h index 48d8687f..8b337f48 100644 --- a/Minecraft.World/EnchantmentContainer.h +++ b/Minecraft.World/EnchantmentContainer.h @@ -15,4 +15,5 @@ public: EnchantmentContainer(EnchantmentMenu *menu); virtual int getMaxStackSize(); virtual void setChanged(); + virtual bool canPlaceItem(int slot, shared_ptr item); }; \ No newline at end of file diff --git a/Minecraft.World/EnchantmentHelper.cpp b/Minecraft.World/EnchantmentHelper.cpp index f43ced01..da784d5a 100644 --- a/Minecraft.World/EnchantmentHelper.cpp +++ b/Minecraft.World/EnchantmentHelper.cpp @@ -88,6 +88,7 @@ void EnchantmentHelper::setEnchantments(unordered_map *enchantments, s int EnchantmentHelper::getEnchantmentLevel(int enchantmentId, ItemInstanceArray inventory) { + if (inventory.data == NULL) return 0; int bestLevel = 0; //for (ItemInstance piece : inventory) for(unsigned int i = 0; i < inventory.length; ++i) @@ -147,12 +148,12 @@ EnchantmentHelper::GetDamageProtectionIteration EnchantmentHelper::getDamageProt * @param source * @return */ -int EnchantmentHelper::getDamageProtection(shared_ptr inventory, DamageSource *source) +int EnchantmentHelper::getDamageProtection(ItemInstanceArray armor, DamageSource *source) { getDamageProtectionIteration.sum = 0; getDamageProtectionIteration.source = source; - runIterationOnInventory(getDamageProtectionIteration, inventory->armor); + runIterationOnInventory(getDamageProtectionIteration, armor); if (getDamageProtectionIteration.sum > 25) { @@ -177,72 +178,68 @@ EnchantmentHelper::GetDamageBonusIteration EnchantmentHelper::getDamageBonusIter * @param target * @return */ -int EnchantmentHelper::getDamageBonus(shared_ptr inventory, shared_ptr target) +float EnchantmentHelper::getDamageBonus(shared_ptr source, shared_ptr target) { getDamageBonusIteration.sum = 0; getDamageBonusIteration.target = target; - runIterationOnItem(getDamageBonusIteration, inventory->getSelected()); + runIterationOnItem(getDamageBonusIteration, source->getCarriedItem() ); - if (getDamageBonusIteration.sum > 0) - { - return 1 + random.nextInt(getDamageBonusIteration.sum); - } - return 0; + return getDamageBonusIteration.sum; } -int EnchantmentHelper::getKnockbackBonus(shared_ptr inventory, shared_ptr target) +int EnchantmentHelper::getKnockbackBonus(shared_ptr source, shared_ptr target) { - return getEnchantmentLevel(Enchantment::knockback->id, inventory->getSelected()); + return getEnchantmentLevel(Enchantment::knockback->id, source->getCarriedItem() ); } -int EnchantmentHelper::getFireAspect(shared_ptr source) +int EnchantmentHelper::getFireAspect(shared_ptr source) { return getEnchantmentLevel(Enchantment::fireAspect->id, source->getCarriedItem()); } -int EnchantmentHelper::getOxygenBonus(shared_ptr inventory) +int EnchantmentHelper::getOxygenBonus(shared_ptr source) { - return getEnchantmentLevel(Enchantment::drownProtection->id, inventory->armor); + return getEnchantmentLevel(Enchantment::drownProtection->id, source->getEquipmentSlots() ); } -int EnchantmentHelper::getDiggingBonus(shared_ptr inventory) +int EnchantmentHelper::getDiggingBonus(shared_ptr source) { - return getEnchantmentLevel(Enchantment::diggingBonus->id, inventory->getSelected()); + return getEnchantmentLevel(Enchantment::diggingBonus->id, source->getCarriedItem() ); } -int EnchantmentHelper::getDigDurability(shared_ptr inventory) +int EnchantmentHelper::getDigDurability(shared_ptr source) { - return getEnchantmentLevel(Enchantment::digDurability->id, inventory->getSelected()); + return getEnchantmentLevel(Enchantment::digDurability->id, source->getCarriedItem() ); } -bool EnchantmentHelper::hasSilkTouch(shared_ptr inventory) +bool EnchantmentHelper::hasSilkTouch(shared_ptr source) { - return getEnchantmentLevel(Enchantment::untouching->id, inventory->getSelected()) > 0; + return getEnchantmentLevel(Enchantment::untouching->id, source->getCarriedItem() ) > 0; } -int EnchantmentHelper::getDiggingLootBonus(shared_ptr inventory) +int EnchantmentHelper::getDiggingLootBonus(shared_ptr source) { - return getEnchantmentLevel(Enchantment::resourceBonus->id, inventory->getSelected()); + return getEnchantmentLevel(Enchantment::resourceBonus->id, source->getCarriedItem() ); } -int EnchantmentHelper::getKillingLootBonus(shared_ptr inventory) +int EnchantmentHelper::getKillingLootBonus(shared_ptr source) { - return getEnchantmentLevel(Enchantment::lootBonus->id, inventory->getSelected()); + return getEnchantmentLevel(Enchantment::lootBonus->id, source->getCarriedItem() ); } -bool EnchantmentHelper::hasWaterWorkerBonus(shared_ptr inventory) +bool EnchantmentHelper::hasWaterWorkerBonus(shared_ptr source) { - return getEnchantmentLevel(Enchantment::waterWorker->id, inventory->armor) > 0; + return getEnchantmentLevel(Enchantment::waterWorker->id, source->getEquipmentSlots() ) > 0; } -int EnchantmentHelper::getArmorThorns(shared_ptr source) +int EnchantmentHelper::getArmorThorns(shared_ptr source) { return getEnchantmentLevel(Enchantment::thorns->id, source->getEquipmentSlots()); } -shared_ptr EnchantmentHelper::getRandomItemWith(Enchantment *enchantment, shared_ptr source) +shared_ptr EnchantmentHelper::getRandomItemWith(Enchantment *enchantment, shared_ptr source) { ItemInstanceArray items = source->getEquipmentSlots(); for(unsigned int i = 0; i < items.length; ++i) diff --git a/Minecraft.World/EnchantmentHelper.h b/Minecraft.World/EnchantmentHelper.h index 9f7de5c5..6ed2e398 100644 --- a/Minecraft.World/EnchantmentHelper.h +++ b/Minecraft.World/EnchantmentHelper.h @@ -49,14 +49,14 @@ private: * @return */ public: - static int getDamageProtection(shared_ptr inventory, DamageSource *source); + static int getDamageProtection(ItemInstanceArray armor, DamageSource *source); private: class GetDamageBonusIteration : public EnchantmentIterationMethod { public: - int sum; - shared_ptr target; + float sum; + shared_ptr target; virtual void doEnchantment(Enchantment *enchantment, int level); }; @@ -70,18 +70,18 @@ private: * @return */ public: - static int getDamageBonus(shared_ptr inventory, shared_ptr target); - static int getKnockbackBonus(shared_ptr inventory, shared_ptr target); - static int getFireAspect(shared_ptr source); - static int getOxygenBonus(shared_ptr inventory); - static int getDiggingBonus(shared_ptr inventory); - static int getDigDurability(shared_ptr inventory); - static bool hasSilkTouch(shared_ptr inventory); - static int getDiggingLootBonus(shared_ptr inventory); - static int getKillingLootBonus(shared_ptr inventory); - static bool hasWaterWorkerBonus(shared_ptr inventory); - static int getArmorThorns(shared_ptr source); - static shared_ptr getRandomItemWith(Enchantment *enchantment, shared_ptr source); + static float getDamageBonus(shared_ptr source, shared_ptr target); + static int getKnockbackBonus(shared_ptr source, shared_ptr target); + static int getFireAspect(shared_ptr source); + static int getOxygenBonus(shared_ptr source); + static int getDiggingBonus(shared_ptr source); + static int getDigDurability(shared_ptr source); + static bool hasSilkTouch(shared_ptr source); + static int getDiggingLootBonus(shared_ptr source); + static int getKillingLootBonus(shared_ptr source); + static bool hasWaterWorkerBonus(shared_ptr source); + static int getArmorThorns(shared_ptr source); + static shared_ptr getRandomItemWith(Enchantment *enchantment, shared_ptr source); /** * diff --git a/Minecraft.World/EnchantmentMenu.cpp b/Minecraft.World/EnchantmentMenu.cpp index 23b366ce..fa769bf9 100644 --- a/Minecraft.World/EnchantmentMenu.cpp +++ b/Minecraft.World/EnchantmentMenu.cpp @@ -17,9 +17,9 @@ EnchantmentMenu::EnchantmentMenu(shared_ptr inventory, Level *level, } this->level = level; - this->x = xt; - this->y = yt; - this->z = zt; + x = xt; + y = yt; + z = zt; addSlot(new EnchantmentSlot(enchantSlots, 0, 21 + 4, 43 + 4)); for (int y = 0; y < 3; y++) @@ -53,9 +53,9 @@ void EnchantmentMenu::broadcastChanges() // 4J Added m_costsChanged to stop continually sending update packets even when no changes have been made if(m_costsChanged) { - for (int i = 0; i < containerListeners->size(); i++) + for (int i = 0; i < containerListeners.size(); i++) { - ContainerListener *listener = containerListeners->at(i); + ContainerListener *listener = containerListeners.at(i); listener->setContainerData(this, 0, costs[0]); listener->setContainerData(this, 1, costs[1]); listener->setContainerData(this, 2, costs[2]); @@ -162,7 +162,7 @@ bool EnchantmentMenu::clickMenuButton(shared_ptr player, int i) vector *newEnchantment = EnchantmentHelper::selectEnchantment(&random, item, costs[i]); if (newEnchantment != NULL) { - player->withdrawExperienceLevels(costs[i]); + player->giveExperienceLevels(-costs[i]); if (isBook) item->id = Item::enchantedBook_Id; int randomIndex = isBook ? random.nextInt(newEnchantment->size()) : -1; //for (EnchantmentInstance e : newEnchantment) @@ -216,8 +216,8 @@ bool EnchantmentMenu::stillValid(shared_ptr player) shared_ptr EnchantmentMenu::quickMoveStack(shared_ptr player, int slotIndex) { shared_ptr clicked = nullptr; - Slot *slot = slots->at(slotIndex); - Slot *IngredientSlot = slots->at(INGREDIENT_SLOT); + Slot *slot = slots.at(slotIndex); + Slot *IngredientSlot = slots.at(INGREDIENT_SLOT); if (slot != NULL && slot->hasItem()) { diff --git a/Minecraft.World/EnchantmentTableEntity.cpp b/Minecraft.World/EnchantmentTableEntity.cpp index 31da3c49..15131aa2 100644 --- a/Minecraft.World/EnchantmentTableEntity.cpp +++ b/Minecraft.World/EnchantmentTableEntity.cpp @@ -10,15 +10,16 @@ EnchantmentTableEntity::EnchantmentTableEntity() random = new Random(); time = 0; - flip = 0.0f; + flip = 0.0f; oFlip = 0.0f; flipT = 0.0f; flipA = 0.0f; - open = 0.0f; + open = 0.0f; oOpen = 0.0f; - rot = 0.0f; + rot = 0.0f; oRot = 0.0f; tRot = 0.0f; + name = L""; } EnchantmentTableEntity::~EnchantmentTableEntity() @@ -26,6 +27,18 @@ EnchantmentTableEntity::~EnchantmentTableEntity() delete random; } +void EnchantmentTableEntity::save(CompoundTag *base) +{ + TileEntity::save(base); + if (hasCustomName()) base->putString(L"CustomName", name); +} + +void EnchantmentTableEntity::load(CompoundTag *base) +{ + TileEntity::load(base); + if (base->contains(L"CustomName")) name = base->getString(L"CustomName"); +} + void EnchantmentTableEntity::tick() { TileEntity::tick(); @@ -89,6 +102,26 @@ void EnchantmentTableEntity::tick() flip = flip + flipA; } +wstring EnchantmentTableEntity::getName() +{ + return hasCustomName() ? name : app.GetString(IDS_ENCHANT); +} + +wstring EnchantmentTableEntity::getCustomName() +{ + return hasCustomName() ? name : L""; +} + +bool EnchantmentTableEntity::hasCustomName() +{ + return !name.empty(); +} + +void EnchantmentTableEntity::setCustomName(const wstring &name) +{ + this->name = name; +} + shared_ptr EnchantmentTableEntity::clone() { shared_ptr result = shared_ptr( new EnchantmentTableEntity() ); diff --git a/Minecraft.World/EnchantmentTableEntity.h b/Minecraft.World/EnchantmentTableEntity.h index aa54c812..18ae5b75 100644 --- a/Minecraft.World/EnchantmentTableEntity.h +++ b/Minecraft.World/EnchantmentTableEntity.h @@ -10,15 +10,24 @@ public: public: int time; - float flip, oFlip, flipT, flipA; - float open, oOpen; - float rot, oRot, tRot; + float flip, oFlip, flipT, flipA; + float open, oOpen; + float rot, oRot, tRot; private: Random *random; + wstring name; + public: EnchantmentTableEntity(); ~EnchantmentTableEntity(); - virtual void tick(); + + virtual void save(CompoundTag *base); + virtual void load(CompoundTag *base); + virtual void tick(); + virtual wstring getName(); + virtual wstring getCustomName(); + virtual bool hasCustomName(); + virtual void setCustomName(const wstring &name); // 4J Added virtual shared_ptr clone(); diff --git a/Minecraft.World/EnchantmentTableTile.cpp b/Minecraft.World/EnchantmentTableTile.cpp index 70c127ba..d50fe5f5 100644 --- a/Minecraft.World/EnchantmentTableTile.cpp +++ b/Minecraft.World/EnchantmentTableTile.cpp @@ -9,10 +9,10 @@ const wstring EnchantmentTableTile::TEXTURE_SIDE = L"enchantment_side"; const wstring EnchantmentTableTile::TEXTURE_TOP = L"enchantment_top"; const wstring EnchantmentTableTile::TEXTURE_BOTTOM = L"enchantment_bottom"; -EnchantmentTableTile::EnchantmentTableTile(int id) : EntityTile(id, Material::stone, isSolidRender()) +EnchantmentTableTile::EnchantmentTableTile(int id) : BaseEntityTile(id, Material::stone, isSolidRender()) { updateDefaultShape(); - setLightBlock(0); + setLightBlock(0); iconTop = NULL; iconBottom = NULL; @@ -21,7 +21,7 @@ EnchantmentTableTile::EnchantmentTableTile(int id) : EntityTile(id, Material::st // 4J Added override void EnchantmentTableTile::updateDefaultShape() { - setShape(0, 0, 0, 1, 12 / 16.0f, 1); + setShape(0, 0, 0, 1, 12 / 16.0f, 1); } bool EnchantmentTableTile::isCubeShaped() @@ -31,28 +31,28 @@ bool EnchantmentTableTile::isCubeShaped() void EnchantmentTableTile::animateTick(Level *level, int x, int y, int z, Random *random) { - EntityTile::animateTick(level, x, y, z, random); + BaseEntityTile::animateTick(level, x, y, z, random); - for (int xx = x - 2; xx <= x + 2; xx++) + for (int xx = x - 2; xx <= x + 2; xx++) { - for (int zz = z - 2; zz <= z + 2; zz++) + for (int zz = z - 2; zz <= z + 2; zz++) { - if (xx > x - 2 && xx < x + 2 && zz == z - 1) + if (xx > x - 2 && xx < x + 2 && zz == z - 1) { - zz = z + 2; - } - if (random->nextInt(16) != 0) continue; - for (int yy = y; yy <= y + 1; yy++) + zz = z + 2; + } + if (random->nextInt(16) != 0) continue; + for (int yy = y; yy <= y + 1; yy++) { - if (level->getTile(xx, yy, zz) == Tile::bookshelf_Id) + if (level->getTile(xx, yy, zz) == Tile::bookshelf_Id) { - if (!level->isEmptyTile((xx - x) / 2 + x, yy, (zz - z) / 2 + z)) break; + if (!level->isEmptyTile((xx - x) / 2 + x, yy, (zz - z) / 2 + z)) break; - level->addParticle(eParticleType_enchantmenttable, x + 0.5, y + 2.0, z + 0.5, xx - x + random->nextFloat() - 0.5, yy - y - random->nextFloat() - 1, zz - z + random->nextFloat() - 0.5); - } - } - } - } + level->addParticle(eParticleType_enchantmenttable, x + 0.5, y + 2.0, z + 0.5, xx - x + random->nextFloat() - 0.5, yy - y - random->nextFloat() - 1, zz - z + random->nextFloat() - 0.5); + } + } + } + } } bool EnchantmentTableTile::isSolidRender(bool isServerLevel) @@ -76,12 +76,22 @@ bool EnchantmentTableTile::use(Level *level, int x, int y, int z, shared_ptrisClientSide) + if (level->isClientSide) { - return true; - } - player->startEnchanting(x, y, z); - return true; + return true; + } + shared_ptr table = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + player->startEnchanting(x, y, z, table->hasCustomName() ? table->getName() : L""); + return true; +} + +void EnchantmentTableTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance) +{ + BaseEntityTile::setPlacedBy(level, x, y, z, by, itemInstance); + if (itemInstance->hasCustomHoverName()) + { + dynamic_pointer_cast( level->getTileEntity(x, y, z))->setCustomName(itemInstance->getHoverName()); + } } void EnchantmentTableTile::registerIcons(IconRegister *iconRegister) diff --git a/Minecraft.World/EnchantmentTableTile.h b/Minecraft.World/EnchantmentTableTile.h index 43816cec..ec5c70bf 100644 --- a/Minecraft.World/EnchantmentTableTile.h +++ b/Minecraft.World/EnchantmentTableTile.h @@ -1,8 +1,8 @@ #pragma once -#include "EntityTile.h" +#include "BaseEntityTile.h" class ChunkRebuildData; -class EnchantmentTableTile : public EntityTile +class EnchantmentTableTile : public BaseEntityTile { friend class ChunkRebuildData; public: @@ -16,14 +16,14 @@ private: public: EnchantmentTableTile(int id); - - virtual void updateDefaultShape(); // 4J Added override - bool isCubeShaped(); - void animateTick(Level *level, int x, int y, int z, Random *random); - bool isSolidRender(bool isServerLevel = false); - Icon *getTexture(int face, int data); - shared_ptr newTileEntity(Level *level); - bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param - //@Override - void registerIcons(IconRegister *iconRegister); + + virtual void updateDefaultShape(); // 4J Added override + virtual bool isCubeShaped(); + virtual void animateTick(Level *level, int x, int y, int z, Random *random); + virtual bool isSolidRender(bool isServerLevel = false); + virtual Icon *getTexture(int face, int data); + virtual shared_ptr newTileEntity(Level *level); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + virtual void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance); + virtual void registerIcons(IconRegister *iconRegister); }; diff --git a/Minecraft.World/EndPodiumFeature.cpp b/Minecraft.World/EndPodiumFeature.cpp index 261b6446..7cf742fa 100644 --- a/Minecraft.World/EndPodiumFeature.cpp +++ b/Minecraft.World/EndPodiumFeature.cpp @@ -74,7 +74,7 @@ bool EndPodiumFeature::place(Level *level, Random *random, int x, int y, int z) { if(level->isEmptyTile(xx,yy,zz)) { - placeBlock(level, xx, yy, zz, Tile::whiteStone_Id, 0); + placeBlock(level, xx, yy, zz, Tile::endStone_Id, 0); } } } diff --git a/Minecraft.World/EndTag.h b/Minecraft.World/EndTag.h index 684ee6ce..2815a577 100644 --- a/Minecraft.World/EndTag.h +++ b/Minecraft.World/EndTag.h @@ -7,7 +7,7 @@ public: EndTag() : Tag(L"") {} EndTag(const wstring &name) : Tag(name) {} - void load(DataInput *dis) {}; + void load(DataInput *dis, int tagDepth) {}; void write(DataOutput *dos) {}; byte getId() { return TAG_End; } diff --git a/Minecraft.World/EnderChestTile.cpp b/Minecraft.World/EnderChestTile.cpp index 7e50a933..ef3c2046 100644 --- a/Minecraft.World/EnderChestTile.cpp +++ b/Minecraft.World/EnderChestTile.cpp @@ -7,7 +7,7 @@ #include "net.minecraft.h" #include "EnderChestTile.h" -EnderChestTile::EnderChestTile(int id) : EntityTile(id, Material::stone, isSolidRender()) +EnderChestTile::EnderChestTile(int id) : BaseEntityTile(id, Material::stone, isSolidRender()) { updateDefaultShape(); } @@ -48,7 +48,7 @@ bool EnderChestTile::isSilkTouchable() return true; } -void EnderChestTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by) +void EnderChestTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance) { int facing = 0; int dir = (Mth::floor(by->yRot * 4 / (360) + 0.5f)) & 3; @@ -58,7 +58,7 @@ void EnderChestTile::setPlacedBy(Level *level, int x, int y, int z, shared_ptrsetData(x, y, z, facing); + level->setData(x, y, z, facing, Tile::UPDATE_CLIENTS); } bool EnderChestTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly) diff --git a/Minecraft.World/EnderChestTile.h b/Minecraft.World/EnderChestTile.h index 96173f63..4c2bbcbf 100644 --- a/Minecraft.World/EnderChestTile.h +++ b/Minecraft.World/EnderChestTile.h @@ -1,15 +1,15 @@ #pragma once -#include "EntityTile.h" +#include "BaseEntityTile.h" #include "ChestTile.h" -class EnderChestTile : public EntityTile +class EnderChestTile : public BaseEntityTile { public: static const int EVENT_SET_OPEN_COUNT = ChestTile::EVENT_SET_OPEN_COUNT; EnderChestTile(int id); - virtual void updateDefaultShape(); // 4J Added override + virtual void updateDefaultShape(); // 4J Added override bool isSolidRender(bool isServerLevel = false); bool isCubeShaped(); @@ -21,7 +21,7 @@ protected: bool isSilkTouchable(); public: - void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by); + void setPlacedBy(Level *level, int x, int y, int z, shared_ptr by, shared_ptr itemInstance); bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); shared_ptr newTileEntity(Level *level); void animateTick(Level *level, int xt, int yt, int zt, Random *random); diff --git a/Minecraft.World/EnderChestTileEntity.cpp b/Minecraft.World/EnderChestTileEntity.cpp index dffa2bd5..8169c029 100644 --- a/Minecraft.World/EnderChestTileEntity.cpp +++ b/Minecraft.World/EnderChestTileEntity.cpp @@ -55,12 +55,14 @@ void EnderChestTileEntity::tick() } } -void EnderChestTileEntity::triggerEvent(int b0, int b1) +bool EnderChestTileEntity::triggerEvent(int b0, int b1) { if (b0 == ChestTile::EVENT_SET_OPEN_COUNT) { openCount = b1; + return true; } + return TileEntity::triggerEvent(b0, b1); } void EnderChestTileEntity::setRemoved() diff --git a/Minecraft.World/EnderChestTileEntity.h b/Minecraft.World/EnderChestTileEntity.h index f6882980..1231bbd3 100644 --- a/Minecraft.World/EnderChestTileEntity.h +++ b/Minecraft.World/EnderChestTileEntity.h @@ -19,7 +19,7 @@ public: EnderChestTileEntity(); void tick(); - void triggerEvent(int b0, int b1); + bool triggerEvent(int b0, int b1); void setRemoved(); void startOpen(); void stopOpen(); diff --git a/Minecraft.World/EnderCrystal.cpp b/Minecraft.World/EnderCrystal.cpp index 719e9d96..78e00419 100644 --- a/Minecraft.World/EnderCrystal.cpp +++ b/Minecraft.World/EnderCrystal.cpp @@ -63,7 +63,7 @@ void EnderCrystal::tick() int zt = Mth::floor(z); if (level->getTile(xt, yt, zt) != Tile::fire_Id) { - level->setTile(xt, yt, zt, Tile::fire_Id); + level->setTileAndUpdate(xt, yt, zt, Tile::fire_Id); } } } @@ -88,12 +88,12 @@ bool EnderCrystal::isPickable() return true; } -bool EnderCrystal::hurt(DamageSource *source, int damage) +bool EnderCrystal::hurt(DamageSource *source, float damage) { - // 4J-PB - if the owner of the source is the enderdragon, then ignore it (where the dragon's fireball hits an endercrystal) - shared_ptr sourceIsDragon = dynamic_pointer_cast(source->getEntity()); + if (isInvulnerable()) return false; - if(sourceIsDragon!=NULL) + // 4J-PB - if the owner of the source is the enderdragon, then ignore it (where the dragon's fireball hits an endercrystal) + if ( source->getEntity() != NULL && source->getEntity()->instanceof(eTYPE_ENDERDRAGON) ) { return false; } diff --git a/Minecraft.World/EnderCrystal.h b/Minecraft.World/EnderCrystal.h index 26606e26..15940452 100644 --- a/Minecraft.World/EnderCrystal.h +++ b/Minecraft.World/EnderCrystal.h @@ -38,5 +38,5 @@ protected: public: virtual float getShadowHeightOffs(); virtual bool isPickable(); - virtual bool hurt(DamageSource *source, int damage); + virtual bool hurt(DamageSource *source, float damage); }; \ No newline at end of file diff --git a/Minecraft.World/EnderDragon.cpp b/Minecraft.World/EnderDragon.cpp index 2ccd453c..2dc0c434 100644 --- a/Minecraft.World/EnderDragon.cpp +++ b/Minecraft.World/EnderDragon.cpp @@ -2,7 +2,9 @@ #include "net.minecraft.world.level.h" #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.boss.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.entity.projectile.h" #include "net.minecraft.world.phys.h" #include "net.minecraft.world.damagesource.h" @@ -42,9 +44,8 @@ void EnderDragon::_init() // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); - - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); + registerAttributes(); + setHealth(getMaxHealth()); xTarget = yTarget = zTarget = 0.0; posPointer = -1; @@ -80,32 +81,10 @@ void EnderDragon::_init() m_currentPath = NULL; } -EnderDragon::EnderDragon(Level *level) : BossMob(level) +EnderDragon::EnderDragon(Level *level) : Mob(level) { _init(); - head = shared_ptr( new BossMobPart(this, L"head", 6, 6) ); - neck = shared_ptr( new BossMobPart(this, L"neck", 6, 6) ); // 4J Added - body = shared_ptr( new BossMobPart(this, L"body", 8, 8) ); - tail1 = shared_ptr( new BossMobPart(this, L"tail", 4, 4) ); - tail2 = shared_ptr( new BossMobPart(this, L"tail", 4, 4) ); - tail3 = shared_ptr( new BossMobPart(this, L"tail", 4, 4) ); - wing1 = shared_ptr( new BossMobPart(this, L"wing", 4, 4) ); - wing2 = shared_ptr( new BossMobPart(this, L"wing", 4, 4) ); - - subEntities.push_back(head); - subEntities.push_back(neck); // 4J Added - subEntities.push_back(body); - subEntities.push_back(tail1); - subEntities.push_back(tail2); - subEntities.push_back(tail3); - subEntities.push_back(wing1); - subEntities.push_back(wing2); - - maxHealth = 200; - setHealth(maxHealth); - - this->textureIdx = TN_MOB_ENDERDRAGON; // 4J was "/mob/enderdragon/ender.png"; setSize(16, 8); noPhysics = true; @@ -118,6 +97,28 @@ EnderDragon::EnderDragon(Level *level) : BossMob(level) noCulling = true; } +// 4J - split off from ctor so we can use shared_from_this() +void EnderDragon::AddParts() +{ + head = shared_ptr( new MultiEntityMobPart(dynamic_pointer_cast(shared_from_this()), L"head", 6, 6) ); + neck = shared_ptr( new MultiEntityMobPart(dynamic_pointer_cast(shared_from_this()), L"neck", 6, 6) ); // 4J Added + body = shared_ptr( new MultiEntityMobPart(dynamic_pointer_cast(shared_from_this()), L"body", 8, 8) ); + tail1 = shared_ptr( new MultiEntityMobPart(dynamic_pointer_cast(shared_from_this()), L"tail", 4, 4) ); + tail2 = shared_ptr( new MultiEntityMobPart(dynamic_pointer_cast(shared_from_this()), L"tail", 4, 4) ); + tail3 = shared_ptr( new MultiEntityMobPart(dynamic_pointer_cast(shared_from_this()), L"tail", 4, 4) ); + wing1 = shared_ptr( new MultiEntityMobPart(dynamic_pointer_cast(shared_from_this()), L"wing", 4, 4) ); + wing2 = shared_ptr( new MultiEntityMobPart(dynamic_pointer_cast(shared_from_this()), L"wing", 4, 4) ); + + subEntities.push_back(head); + subEntities.push_back(neck); // 4J Added + subEntities.push_back(body); + subEntities.push_back(tail1); + subEntities.push_back(tail2); + subEntities.push_back(tail3); + subEntities.push_back(wing1); + subEntities.push_back(wing2); +} + EnderDragon::~EnderDragon() { if(m_nodes->data != NULL) @@ -132,11 +133,16 @@ EnderDragon::~EnderDragon() if( m_currentPath != NULL ) delete m_currentPath; } +void EnderDragon::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..f1c2259c 100644 --- a/Minecraft.World/Entity.cpp +++ b/Minecraft.World/Entity.cpp @@ -3,6 +3,7 @@ #include "net.minecraft.world.item.h" #include "net.minecraft.world.item.enchantment.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.dimension.h" #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.phys.h" #include "net.minecraft.world.entity.item.h" @@ -21,7 +22,10 @@ #include "..\Minecraft.Client\MinecraftServer.h" #include "..\Minecraft.Client\MultiPlayerLevel.h" #include "..\Minecraft.Client\MultiplayerLocalPlayer.h" +#include "..\Minecraft.Client\ServerLevel.h" +#include "..\Minecraft.Client\PlayerList.h" +const wstring Entity::RIDING_TAG = L"Riding"; int Entity::entityCounter = 2048; // 4J - changed initialiser to 2048, as we are using range 0 - 2047 as special unique smaller ids for things that need network tracked DWORD Entity::tlsIdx = TlsAlloc(); @@ -55,7 +59,7 @@ int Entity::getSmallId() if( removedFound ) { // Has set up the entityIdRemovingFlags vector in this case, so we should check against this when allocating new ids -// app.DebugPrintf("getSmallId: Removed entities found\n"); + // app.DebugPrintf("getSmallId: Removed entities found\n"); puiRemovedFlags = entityIdRemovingFlags; } } @@ -75,7 +79,7 @@ int Entity::getSmallId() { if( puiRemovedFlags[i] & uiMask ) { -// app.DebugPrintf("Avoiding using ID %d (0x%x)\n", i * 32 + j,puiRemovedFlags[i]); + // app.DebugPrintf("Avoiding using ID %d (0x%x)\n", i * 32 + j,puiRemovedFlags[i]); uiMask >>= 1; continue; } @@ -234,7 +238,7 @@ void Entity::tickExtraWandering() // 4J - added for common ctor code // Do all the default initialisations done in the java class -void Entity::_init(bool useSmallId) +void Entity::_init(bool useSmallId, Level *level) { // 4J - changed to assign two different types of ids. A range from 0-2047 is used for things that we'll be wanting to identify over the network, // so we should only need 11 bits rather than 32 to uniquely identify them. The rest of the range is used for anything we don't need to track like this, @@ -254,6 +258,7 @@ void Entity::_init(bool useSmallId) blocksBuilding = false; rider = weak_ptr(); riding = nullptr; + forcedLoading = false; //level = NULL; // Level is assigned to in the original c_tor code xo = yo = zo = 0.0; @@ -277,6 +282,7 @@ void Entity::_init(bool useSmallId) walkDistO = 0; walkDist = 0; + moveDist = 0.0f; fallDistance = 0; @@ -301,15 +307,17 @@ void Entity::_init(bool useSmallId) firstTick = true; - - customTextureUrl = L""; - customTextureUrl2 = L""; - - fireImmune = false; // values that need to be sent to clients in SMP - entityData = shared_ptr(new SynchedEntityData()); + if( useSmallId ) + { + entityData = shared_ptr(new SynchedEntityData()); + } + else + { + entityData = nullptr; + } xRideRotA = yRideRotA = 0.0; inChunk = false; @@ -320,23 +328,43 @@ void Entity::_init(bool useSmallId) hasImpulse = false; + changingDimensionDelay = 0; + isInsidePortal = false; + portalTime = 0; + dimension = 0; + portalEntranceDir = 0; + invulnerable = false; + if( useSmallId ) + { + uuid = L"ent" + Mth::createInsecureUUID(random); + } + // 4J Added m_ignoreVerticalCollisions = false; m_uiAnimOverrideBitmask = 0L; + m_ignorePortal = false; } Entity::Entity(Level *level, bool useSmallId) // 4J - added useSmallId parameter { MemSect(16); - _init(useSmallId); + _init(useSmallId, level); MemSect(0); this->level = level; // resetPos(); setPos(0, 0, 0); - entityData->define(DATA_SHARED_FLAGS_ID, (byte) 0); - entityData->define(DATA_AIR_SUPPLY_ID, TOTAL_AIR_SUPPLY); // 4J Stu - Brought forward from 1.2.3 to fix 38654 - Gameplay: Player will take damage when air bubbles are present if resuming game from load/autosave underwater. + if (level != NULL) + { + dimension = level->dimension->id; + } + + if( entityData ) + { + entityData->define(DATA_SHARED_FLAGS_ID, (byte) 0); + entityData->define(DATA_AIR_SUPPLY_ID, TOTAL_AIR_SUPPLY); // 4J Stu - Brought forward from 1.2.3 to fix 38654 - Gameplay: Player will take damage when air bubbles are present if resuming game from load/autosave underwater. + } // 4J Stu - We cannot call virtual functions in ctors, as at this point the object // is of type Entity and not a derived class @@ -482,9 +510,11 @@ void Entity::baseTick() // 4J Stu - Not needed //util.Timer.push("entityBaseTick"); - if (riding != NULL && riding->removed) riding = nullptr; + if (riding != NULL && riding->removed) + { + riding = nullptr; + } - tickCount++; walkDistO = walkDist; xo = x; yo = y; @@ -492,10 +522,54 @@ void Entity::baseTick() xRotO = xRot; yRotO = yRot; + if (!level->isClientSide) // 4J Stu - Don't need this && level instanceof ServerLevel) + { + if(!m_ignorePortal) // 4J Added + { + MinecraftServer *server = dynamic_cast(level)->getServer(); + int waitTime = getPortalWaitTime(); + + if (isInsidePortal) + { + if (server->isNetherEnabled()) + { + if (riding == NULL) + { + if (portalTime++ >= waitTime) + { + portalTime = waitTime; + changingDimensionDelay = getDimensionChangingDelay(); + + int targetDimension; + + if (level->dimension->id == -1) + { + targetDimension = 0; + } + else + { + targetDimension = -1; + } + + changeDimension(targetDimension); + } + } + isInsidePortal = false; + } + } + else + { + if (portalTime > 0) portalTime -= 4; + if (portalTime < 0) portalTime = 0; + } + if (changingDimensionDelay > 0) changingDimensionDelay--; + } + } + if (isSprinting() && !isInWater() && canCreateParticles()) { int xt = Mth::floor(x); - int yt = Mth::floor(y - 0.2f - this->heightOffset); + int yt = Mth::floor(y - 0.2f - heightOffset); int zt = Mth::floor(z); int t = level->getTile(xt, yt, zt); int d = level->getData(xt, yt, zt); @@ -505,37 +579,7 @@ void Entity::baseTick() } } - if (updateInWaterState()) - { - if (!wasInWater && !firstTick && canCreateParticles()) - { - float speed = Mth::sqrt(xd * xd * 0.2f + yd * yd + zd * zd * 0.2f) * 0.2f; - if (speed > 1) speed = 1; - MemSect(31); - level->playSound(shared_from_this(), eSoundType_RANDOM_SPLASH, speed, 1 + (random->nextFloat() - random->nextFloat()) * 0.4f); - MemSect(0); - float yt = (float) Mth::floor(bb->y0); - for (int i = 0; i < 1 + bbWidth * 20; i++) - { - float xo = (random->nextFloat() * 2 - 1) * bbWidth; - float zo = (random->nextFloat() * 2 - 1) * bbWidth; - level->addParticle(eParticleType_bubble, x + xo, yt + 1, z + zo, xd, yd - random->nextFloat() * 0.2f, zd); - } - for (int i = 0; i < 1 + bbWidth * 20; i++) - { - float xo = (random->nextFloat() * 2 - 1) * bbWidth; - float zo = (random->nextFloat() * 2 - 1) * bbWidth; - level->addParticle(eParticleType_splash, x + xo, yt + 1, z + zo, xd, yd, zd); - } - } - fallDistance = 0; - wasInWater = true; - onFire = 0; - } - else - { - wasInWater = false; - } + updateInWaterState(); if (level->isClientSide) { @@ -575,7 +619,6 @@ void Entity::baseTick() if (!level->isClientSide) { setSharedFlag(FLAG_ONFIRE, onFire > 0); - setSharedFlag(FLAG_RIDING, riding != NULL); } firstTick = false; @@ -584,6 +627,10 @@ void Entity::baseTick() //util.Timer.pop(); } +int Entity::getPortalWaitTime() +{ + return 0; +} void Entity::lavaHurt() { @@ -650,6 +697,7 @@ void Entity::move(double xa, double ya, double za, bool noEntityCubes) // 4J - ySlideOffset *= 0.4f; double xo = x; + double yo = y; double zo = z; if (isStuckInWeb) @@ -670,7 +718,7 @@ void Entity::move(double xa, double ya, double za, bool noEntityCubes) // 4J - AABB *bbOrg = bb->copy(); - bool isPlayerSneaking = onGround && isSneaking() && dynamic_pointer_cast(shared_from_this()) != NULL; + bool isPlayerSneaking = onGround && isSneaking() && instanceof(eTYPE_PLAYER); if (isPlayerSneaking) { @@ -709,8 +757,8 @@ void Entity::move(double xa, double ya, double za, bool noEntityCubes) // 4J - AUTO_VAR(itEndAABB, aABBs->end()); // 4J Stu - Particles (and possibly other entities) don't have xChunk and zChunk set, so calculate the chunk instead - int xc = Mth::floor(x / 16); - int zc = Mth::floor(z / 16); + int xc = Mth::floor(x / 16); + int zc = Mth::floor(z / 16); if(!level->isClientSide || level->reallyHasChunk(xc, zc)) { // 4J Stu - It's horrible that the client is doing any movement at all! But if we don't have the chunk @@ -824,13 +872,6 @@ void Entity::move(double xa, double ya, double za, bool noEntityCubes) // 4J - za = zaN; bb->set(normal); } - else - { - double ss = bb->y0 - (int) bb->y0; - if (ss > 0) { - ySlideOffset += (float) (ss + 0.01); - } - } } @@ -849,14 +890,14 @@ void Entity::move(double xa, double ya, double za, bool noEntityCubes) // 4J - if (zaOrg != za) zd = 0; double xm = x - xo; + double ym = y - yo; double zm = z - zo; if (makeStepSound() && !isPlayerSneaking && riding == NULL) { - walkDist += (float) ( sqrt(xm * xm + zm * zm) * 0.6 ); int xt = Mth::floor(x); - int yt = Mth::floor(y - 0.2f - this->heightOffset); + int yt = Mth::floor(y - 0.2f - heightOffset); int zt = Mth::floor(z); int t = level->getTile(xt, yt, zt); if (t == 0) @@ -867,10 +908,23 @@ void Entity::move(double xa, double ya, double za, bool noEntityCubes) // 4J - t = level->getTile(xt, yt - 1, zt); } } - - if (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,22 +1028,6 @@ void Entity::checkFallDamage(double ya, bool onGround) { if (fallDistance > 0) { - if (dynamic_pointer_cast(shared_from_this()) != NULL) - { - int xt = Mth::floor(x); - int yt = Mth::floor(y - 0.2f - this->heightOffset); - int zt = Mth::floor(z); - int t = level->getTile(xt, yt, zt); - if (t == 0 && level->getTile(xt, yt - 1, zt) == Tile::fence_Id) - { - t = level->getTile(xt, yt - 1, zt); - } - - if (t > 0) - { - Tile::tiles[t]->fallOn(level, xt, yt, zt, shared_from_this(), fallDistance); - } - } causeFallDamage(fallDistance); fallDistance = 0; } @@ -1053,7 +1064,7 @@ void Entity::causeFallDamage(float distance) bool Entity::isInWaterOrRain() { - return wasInWater || (level->isRainingAt( Mth::floor(x), Mth::floor(y), Mth::floor(z))); + return wasInWater || (level->isRainingAt( Mth::floor(x), Mth::floor(y), Mth::floor(z)) || level->isRainingAt(Mth::floor(x), Mth::floor(y + bbHeight), Mth::floor(z))); } bool Entity::isInWater() @@ -1063,7 +1074,38 @@ bool Entity::isInWater() bool Entity::updateInWaterState() { - return level->checkAndHandleWater(bb->grow(0, -0.4f, 0)->shrink(0.001, 0.001, 0.001), Material::water, shared_from_this()); + if(level->checkAndHandleWater(bb->grow(0, -0.4f, 0)->shrink(0.001, 0.001, 0.001), Material::water, shared_from_this())) + { + if (!wasInWater && !firstTick && canCreateParticles()) + { + float speed = Mth::sqrt(xd * xd * 0.2f + yd * yd + zd * zd * 0.2f) * 0.2f; + if (speed > 1) speed = 1; + MemSect(31); + playSound(eSoundType_RANDOM_SPLASH, speed, 1 + (random->nextFloat() - random->nextFloat()) * 0.4f); + MemSect(0); + float yt = (float) Mth::floor(bb->y0); + for (int i = 0; i < 1 + bbWidth * 20; i++) + { + float xo = (random->nextFloat() * 2 - 1) * bbWidth; + float zo = (random->nextFloat() * 2 - 1) * bbWidth; + level->addParticle(eParticleType_bubble, x + xo, yt + 1, z + zo, xd, yd - random->nextFloat() * 0.2f, zd); + } + for (int i = 0; i < 1 + bbWidth * 20; i++) + { + float xo = (random->nextFloat() * 2 - 1) * bbWidth; + float zo = (random->nextFloat() * 2 - 1) * bbWidth; + level->addParticle(eParticleType_splash, x + xo, yt + 1, z + zo, xd, yd, zd); + } + } + fallDistance = 0; + wasInWater = true; + onFire = 0; + } + else + { + wasInWater = false; + } + return wasInWater; } bool Entity::isUnderLiquid(Material *material) @@ -1118,7 +1160,7 @@ int Entity::getLightColor(float a) if (level->hasChunkAt(xTile, 0, zTile)) { double hh = (bb->y1 - bb->y0) * 0.66; - int yTile = Mth::floor(y - this->heightOffset + hh); + int yTile = Mth::floor(y - heightOffset + hh); return level->getLightColor(xTile, yTile, zTile, 0); } return 0; @@ -1132,7 +1174,7 @@ float Entity::getBrightness(float a) if (level->hasChunkAt(xTile, 0, zTile)) { double hh = (bb->y1 - bb->y0) * 0.66; - int yTile = Mth::floor(y - this->heightOffset + hh); + int yTile = Mth::floor(y - heightOffset + hh); return level->getBrightness(xTile, yTile, zTile); } return 0; @@ -1145,28 +1187,28 @@ void Entity::setLevel(Level *level) void Entity::absMoveTo(double x, double y, double z, float yRot, float xRot) { - this->xo = this->x = x; - this->yo = this->y = y; - this->zo = this->z = z; - this->yRotO = this->yRot = yRot; - this->xRotO = this->xRot = xRot; + xo = this->x = x; + yo = this->y = y; + zo = this->z = z; + yRotO = this->yRot = yRot; + xRotO = this->xRot = xRot; ySlideOffset = 0; double yRotDiff = yRotO - yRot; if (yRotDiff < -180) yRotO += 360; if (yRotDiff >= 180) yRotO -= 360; - this->setPos(this->x, this->y, this->z); - this->setRot(yRot, xRot); + setPos(this->x, this->y, this->z); + setRot(yRot, xRot); } void Entity::moveTo(double x, double y, double z, float yRot, float xRot) { - this->xOld = this->xo = this->x = x; - this->yOld = this->yo = this->y = y + heightOffset; - this->zOld = this->zo = this->z = z; + xOld = xo = this->x = x; + yOld = yo = this->y = y + heightOffset; + zOld = zo = this->z = z; this->yRot = yRot; this->xRot = xRot; - this->setPos(this->x, this->y, this->z); + setPos(this->x, this->y, this->z); } float Entity::distanceTo(shared_ptr e) @@ -1231,7 +1273,7 @@ void Entity::push(shared_ptr e) xa *= 1 - pushthrough; za *= 1 - pushthrough; - this->push(-xa, 0, -za); + push(-xa, 0, -za); e->push(xa, 0, za); } } @@ -1241,18 +1283,17 @@ void Entity::push(double xa, double ya, double za) xd += xa; yd += ya; zd += za; - this->hasImpulse = true; + hasImpulse = true; } - void Entity::markHurt() { - this->hurtMarked = true; + hurtMarked = true; } - -bool Entity::hurt(DamageSource *source, int damage) +bool Entity::hurt(DamageSource *source, float damage) { + if(isInvulnerable()) return false; markHurt(); return false; } @@ -1297,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,19 +1431,43 @@ void Entity::load(CompoundTag *tag) onFire = tag->getShort(L"Fire"); setAirSupply(tag->getShort(L"Air")); onGround = tag->getBoolean(L"OnGround"); + dimension = tag->getInt(L"Dimension"); + invulnerable = tag->getBoolean(L"Invulnerable"); + changingDimensionDelay = tag->getInt(L"PortalCooldown"); + + if (tag->contains(L"UUID")) + { + uuid = tag->getString(L"UUID"); + } setPos(x, y, z); setRot(yRot, xRot); readAdditionalSaveData(tag); + + // set position again because bb size may have changed + if (repositionEntityAfterLoad()) setPos(x, y, z); } +bool Entity::repositionEntityAfterLoad() +{ + return true; +} const wstring Entity::getEncodeId() { return EntityIO::getEncodeId( shared_from_this() ); } +/** +* Called after load() has finished and the entity has been added to the +* world +*/ +void Entity::onLoadedFromSave() +{ + +} + ListTag *Entity::newDoubleList(unsigned int number, double firstValue, ...) { ListTag *res = new ListTag(); @@ -1449,6 +1535,10 @@ shared_ptr Entity::spawnAtLocation(int resource, int count, float yO shared_ptr Entity::spawnAtLocation(shared_ptr itemInstance, float yOffs) { + if (itemInstance->count == 0) + { + return nullptr; + } shared_ptr ie = shared_ptr( new ItemEntity(level, x, y + yOffs, z, itemInstance) ); ie->throwTime = 10; level->addEntity(ie); @@ -1468,7 +1558,7 @@ bool Entity::isInWall() float yo = ((i >> 1) % 2 - 0.5f) * 0.1f; float zo = ((i >> 2) % 2 - 0.5f) * bbWidth * 0.8f; int xt = Mth::floor(x + xo); - int yt = Mth::floor(y + this->getHeadHeight() + yo); + int yt = Mth::floor(y + getHeadHeight() + yo); int zt = Mth::floor(z + zo); if (level->isSolidBlockingTile(xt, yt, zt)) { @@ -1525,24 +1615,20 @@ void Entity::rideTick() yRideRotA -= yra; xRideRotA -= xra; - yRot += (float) yra; - xRot += (float) xra; + // jeb: This caused the crosshair to "drift" while riding horses. For now I've just disabled it, + // because I can't figure out what it's needed for. Riding boats and minecarts seem unaffected... + // yRot += yra; + // xRot += xra; } void Entity::positionRider() { shared_ptr lockedRider = rider.lock(); - if( lockedRider ) + if( lockedRider == NULL) { - shared_ptr player = dynamic_pointer_cast(lockedRider); - if (!(player && player->isLocalPlayer())) - { - lockedRider->xOld = xOld; - lockedRider->yOld = yOld + getRideHeight() + lockedRider->getRidingHeight(); - lockedRider->zOld = zOld; - } - lockedRider->setPos(x, y + getRideHeight() + lockedRider->getRidingHeight(), z); + return; } + lockedRider->setPos(x, y + getRideHeight() + lockedRider->getRidingHeight(), z); } double Entity::getRidingHeight() @@ -1564,7 +1650,7 @@ void Entity::ride(shared_ptr e) { if (riding != NULL) { - // 4J Stu - Position should already be updated before the SetRidingPacket comes in + // 4J Stu - Position should already be updated before the SetEntityLinkPacket comes in if(!level->isClientSide) moveTo(riding->x, riding->bb->y0 + riding->bbHeight, riding->z, yRot, xRot); riding->rider = weak_ptr(); } @@ -1579,52 +1665,6 @@ void Entity::ride(shared_ptr e) e->rider = shared_from_this(); } -// 4J Stu - Brought forward from 12w36 to fix #46282 - TU5: Gameplay: Exiting the minecart in a tight corridor damages the player -void Entity::findStandUpPosition(shared_ptr vehicle) -{ - AABB *boundingBox; - double fallbackX = vehicle->x; - double fallbackY = vehicle->bb->y0 + vehicle->bbHeight; - double fallbackZ = vehicle->z; - - for (double xDiff = -1.5; xDiff < 2; xDiff += 1.5) - { - for (double zDiff = -1.5; zDiff < 2; zDiff += 1.5) - { - if (xDiff == 0 && zDiff == 0) - { - continue; - } - - int xToInt = (int) (this->x + xDiff); - int zToInt = (int) (this->z + zDiff); - - // 4J Stu - Added loop over y to restaring the bb into 2 block high spaces if required (eg the track block plus 1 air block above it for minecarts) - for(double yDiff = 1.0; yDiff >= 0; yDiff -= 0.5) - { - boundingBox = this->bb->cloneMove(xDiff, yDiff, zDiff); - - if (level->getTileCubes(boundingBox,true)->size() == 0) - { - if (level->isTopSolidBlocking(xToInt, (int) (y - (1-yDiff)), zToInt)) - { - this->moveTo(this->x + xDiff, this->y + yDiff, this->z + zDiff, yRot, xRot); - return; - } - else if (level->isTopSolidBlocking(xToInt, (int) (y - (1-yDiff)) - 1, zToInt) || level->getMaterial(xToInt, (int) (y - (1-yDiff)) - 1, zToInt) == Material::water) - { - fallbackX = x + xDiff; - fallbackY = y + yDiff; - fallbackZ = z + zDiff; - } - } - } - } - } - - this->moveTo(fallbackX, fallbackY, fallbackZ, yRot, xRot); -} - void Entity::lerpTo(double x, double y, double z, float yRot, float xRot, int steps) { setPos(x, y, z); @@ -1663,6 +1703,26 @@ Vec3 *Entity::getLookAngle() void Entity::handleInsidePortal() { + if (changingDimensionDelay > 0) + { + changingDimensionDelay = getDimensionChangingDelay(); + return; + } + + double xd = xo - x; + double zd = zo - z; + + if (!level->isClientSide && !isInsidePortal) + { + portalEntranceDir = Direction::getDirection(xd, zd); + } + + isInsidePortal = true; +} + +int Entity::getDimensionChangingDelay() +{ + return SharedConstants::TICKS_PER_SECOND * 45; } void Entity::lerpMotion(double xd, double yd, double zd) @@ -1680,10 +1740,6 @@ void Entity::animateHurt() { } -void Entity::prepareCustomTextures() -{ -} - ItemInstanceArray Entity::getEquipmentSlots() // ItemInstance[] { return ItemInstanceArray(); // Default ctor creates NULL internal array @@ -1696,12 +1752,12 @@ void Entity::setEquippedSlot(int slot, shared_ptr item) bool Entity::isOnFire() { - return onFire > 0 || getSharedFlag(FLAG_ONFIRE); + return !fireImmune && (onFire > 0 || getSharedFlag(FLAG_ONFIRE)); } bool Entity::isRiding() { - return riding != NULL || getSharedFlag(FLAG_RIDING); + return riding != NULL; } bool Entity::isSneaking() @@ -1771,19 +1827,29 @@ void Entity::setUsingItemFlag(bool value) bool Entity::getSharedFlag(int flag) { - return (entityData->getByte(DATA_SHARED_FLAGS_ID) & (1 << flag)) != 0; + if( entityData ) + { + return (entityData->getByte(DATA_SHARED_FLAGS_ID) & (1 << flag)) != 0; + } + else + { + return false; + } } void Entity::setSharedFlag(int flag, bool value) { - byte currentValue = entityData->getByte(DATA_SHARED_FLAGS_ID); - if (value) + 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 +1872,10 @@ void Entity::thunderHit(const LightningBolt *lightningBolt) if (onFire == 0) setOnFire(8); } -void Entity::killed(shared_ptr mob) +void Entity::killed(shared_ptr mob) { } - bool Entity::checkInTile(double x, double y, double z) { int xTile = Mth::floor(x); @@ -1821,16 +1886,17 @@ bool Entity::checkInTile(double x, double y, double z) double yd = y - (yTile); double zd = z - (zTile); - if (level->isSolidBlockingTile(xTile, yTile, zTile)) + vector *cubes = level->getTileCubes(bb); + if ( (cubes && !cubes->empty()) || level->isFullAABBTile(xTile, yTile, zTile)) { - bool west = !level->isSolidBlockingTile(xTile - 1, yTile, zTile); - bool east = !level->isSolidBlockingTile(xTile + 1, yTile, zTile); - bool up = !level->isSolidBlockingTile(xTile, yTile - 1, zTile); - bool down = !level->isSolidBlockingTile(xTile, yTile + 1, zTile); - bool north = !level->isSolidBlockingTile(xTile, yTile, zTile - 1); - bool south = !level->isSolidBlockingTile(xTile, yTile, zTile + 1); + 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 +1908,7 @@ bool Entity::checkInTile(double x, double y, double z) closest = 1 - xd; dir = 1; } - if (up && yd < closest) - { - closest = yd; - dir = 2; - } - if (down && 1 - yd < closest) + if (up && 1 - yd < closest) { closest = 1 - yd; dir = 3; @@ -1872,9 +1933,9 @@ bool Entity::checkInTile(double x, double y, double z) if (dir == 4) this->zd = -speed; if (dir == 5) this->zd = +speed; + return true; } - return false; } @@ -1886,10 +1947,13 @@ void Entity::makeStuckInWeb() wstring Entity::getAName() { +#ifdef _DEBUG wstring id = EntityIO::getEncodeId(shared_from_this()); if (id.empty()) id = L"generic"; return L"entity." + id + _toString(entityId); - //return I18n.get("entity." + id + ".name"); +#else + return L""; +#endif } vector > *Entity::getSubEntities() @@ -1916,16 +1980,147 @@ bool Entity::isAttackable() return true; } -bool Entity::isInvulnerable() +bool Entity::skipAttackInteraction(shared_ptr source) { return false; } +bool Entity::isInvulnerable() +{ + return invulnerable; +} + void Entity::copyPosition(shared_ptr target) { moveTo(target->x, target->y, target->z, target->yRot, target->xRot); } +void Entity::restoreFrom(shared_ptr oldEntity, bool teleporting) +{ + CompoundTag *tag = new CompoundTag(); + oldEntity->saveWithoutId(tag); + load(tag); + delete tag; + changingDimensionDelay = oldEntity->changingDimensionDelay; + portalEntranceDir = oldEntity->portalEntranceDir; +} + +void Entity::changeDimension(int i) +{ + if (level->isClientSide || removed) return; + + MinecraftServer *server = MinecraftServer::getInstance(); + int lastDimension = dimension; + ServerLevel *oldLevel = server->getLevel(lastDimension); + ServerLevel *newLevel = server->getLevel(i); + + if (lastDimension == 1 && i == 1) + { + newLevel = server->getLevel(0); + } + + // 4J: Restrictions on what can go through + { + // 4J: Some things should just be destroyed when they hit a portal + if (instanceof(eTYPE_FALLINGTILE)) + { + removed = true; + return; + } + + // 4J: Check server level entity limit (arrows, item entities, experience orbs, etc) + if (newLevel->atEntityLimit(shared_from_this())) return; + + // 4J: Check level limit on living entities, minecarts and boats + if (!instanceof(eTYPE_PLAYER) && !newLevel->canCreateMore(GetType(), Level::eSpawnType_Portal)) return; + } + + // 4J: Definitely sending, set dimension now + dimension = newLevel->dimension->id; + + level->removeEntity(shared_from_this()); + removed = false; + + server->getPlayers()->repositionAcrossDimension(shared_from_this(), lastDimension, oldLevel, newLevel); + shared_ptr newEntity = EntityIO::newEntity(EntityIO::getEncodeId(shared_from_this()), newLevel); + + if (newEntity != NULL) + { + newEntity->restoreFrom(shared_from_this(), true); + + if (lastDimension == 1 && i == 1) + { + Pos *spawnPos = newLevel->getSharedSpawnPos(); + spawnPos->y = level->getTopSolidBlock(spawnPos->x, spawnPos->z); + newEntity->moveTo(spawnPos->x, spawnPos->y, spawnPos->z, newEntity->yRot, newEntity->xRot); + delete spawnPos; + } + + newLevel->addEntity(newEntity); + } + + removed = true; + + oldLevel->resetEmptyTime(); + newLevel->resetEmptyTime(); +} + +float Entity::getTileExplosionResistance(Explosion *explosion, Level *level, int x, int y, int z, Tile *tile) +{ + return tile->getExplosionResistance(shared_from_this()); +} + +bool Entity::shouldTileExplode(Explosion *explosion, Level *level, int x, int y, int z, int id, float power) +{ + return true; +} + +int Entity::getMaxFallDistance() +{ + return 3; +} + +int Entity::getPortalEntranceDir() +{ + return portalEntranceDir; +} + +bool Entity::isIgnoringTileTriggers() +{ + return false; +} + +bool Entity::displayFireAnimation() +{ + return isOnFire(); +} + +void Entity::setUUID(const wstring &UUID) +{ + uuid = UUID; +} + +wstring Entity::getUUID() +{ + return uuid; +} + +bool Entity::isPushedByWater() +{ + return true; +} + +wstring Entity::getDisplayName() +{ + return getAName(); +} + +// 4J: Added to retrieve name that should be sent in ChatPackets (important on Xbox One for players) +wstring Entity::getNetworkName() +{ + return getDisplayName(); +} + void Entity::setAnimOverrideBitmask(unsigned int uiBitmask) { m_uiAnimOverrideBitmask=uiBitmask; @@ -1953,4 +2148,4 @@ unsigned int Entity::getAnimOverrideBitmask() } return m_uiAnimOverrideBitmask; -} +} \ No newline at end of file diff --git a/Minecraft.World/Entity.h b/Minecraft.World/Entity.h index bde83e30..e2a26290 100644 --- a/Minecraft.World/Entity.h +++ b/Minecraft.World/Entity.h @@ -6,7 +6,7 @@ using namespace std; #include "Vec3.h" #include "Definitions.h" -class Mob; +class LivingEntity; class LightningBolt; class ItemEntity; class EntityPos; @@ -17,6 +17,7 @@ class Random; class Level; class CompoundTag; class DamageSource; +class Explosion; // 4J Stu Added this mainly to allow is to record telemetry for player deaths enum EEntityDamageType @@ -33,13 +34,16 @@ enum EEntityDamageType class Entity : public enable_shared_from_this { -friend class Gui; // 4J Stu - Added to be able to access the shared flag functions and constants, without making them publicly available to everything + friend class Gui; // 4J Stu - Added to be able to access the shared flag functions and constants, without making them publicly available to everything public: // 4J-PB - added to replace (e instanceof Type), avoiding dynamic casts virtual eINSTANCEOF GetType() = 0; -public: + inline bool instanceof(eINSTANCEOF super) { return eTYPE_DERIVED_FROM(super, GetType()); } + inline static bool instanceof(eINSTANCEOF type, eINSTANCEOF super) { return eTYPE_DERIVED_FROM(super, type); } +public: + static const wstring RIDING_TAG; static const short TOTAL_AIR_SUPPLY = 20 * 15; private: @@ -53,6 +57,7 @@ public: bool blocksBuilding; weak_ptr rider; // Changed to weak to avoid circular dependency between rider/riding entity shared_ptr riding; + bool forcedLoading; Level *level; double xo, yo, zo; @@ -79,6 +84,7 @@ public: float walkDistO; float walkDist; + float moveDist; float fallDistance; private: @@ -110,10 +116,6 @@ public: private: bool firstTick; -public: - wstring customTextureUrl; - wstring customTextureUrl2; - protected: bool fireImmune; @@ -125,7 +127,7 @@ private: static const int DATA_SHARED_FLAGS_ID = 0; static const int FLAG_ONFIRE = 0; static const int FLAG_SNEAKING = 1; - static const int FLAG_RIDING = 2; + //static const int FLAG_ = 2; static const int FLAG_SPRINTING = 3; static const int FLAG_USING_ITEM = 4; static const int FLAG_INVISIBLE = 5; @@ -138,22 +140,39 @@ private: public: bool inChunk; - int xChunk, yChunk, zChunk; - int xp, yp, zp, xRotp, yRotp; - bool noCulling; - bool hasImpulse; + int xChunk, yChunk, zChunk; + int xp, yp, zp, xRotp, yRotp; + bool noCulling; + bool hasImpulse; + int changingDimensionDelay; + +protected: + bool isInsidePortal; + int portalTime; + +public: + int dimension; + +protected: + int portalEntranceDir; + +private: + bool invulnerable; + wstring uuid; protected: // 4J Added so that client side simulations on the host are not affected by zero-lag bool m_ignoreVerticalCollisions; + bool m_ignorePortal; + public: Entity(Level *level, bool useSmallId = true); // 4J - added useSmallId parameter virtual ~Entity(); protected: // 4J - added for common ctor code - void _init(bool useSmallId); + void _init(bool useSmallId, Level *level); protected: virtual void defineSynchedData() = 0; @@ -191,6 +210,7 @@ public: void interpolateTurn(float xo, float yo); virtual void tick(); virtual void baseTick(); + virtual int getPortalWaitTime(); protected: void lavaHurt(); @@ -256,7 +276,7 @@ protected: public: // 4J Added damageSource param to enable telemetry on player deaths - virtual bool hurt(DamageSource *source, int damage); + virtual bool hurt(DamageSource *source, float damage); bool intersects(double x0, double y0, double z0, double x1, double y1, double z1); virtual bool isPickable(); virtual bool isPushable(); @@ -264,18 +284,24 @@ public: virtual void awardKillScore(shared_ptr victim, int score); virtual bool shouldRender(Vec3 *c); virtual bool shouldRenderAtSqrDistance(double distance); - virtual int getTexture(); // 4J - changed from wstring to int virtual bool isCreativeModeAllowed(); + bool saveAsMount(CompoundTag *entityTag); bool save(CompoundTag *entityTag); void saveWithoutId(CompoundTag *entityTag); virtual void load(CompoundTag *tag); protected: + virtual bool repositionEntityAfterLoad(); const wstring getEncodeId(); public: virtual void readAdditionalSaveData(CompoundTag *tag) = 0; virtual void addAdditonalSaveData(CompoundTag *tag) = 0; + /** + * Called after load() has finished and the entity has been added to the + * world + */ + virtual void onLoadedFromSave(); protected: ListTag *newDoubleList(unsigned int number, double firstValue, ...); @@ -296,15 +322,14 @@ public: virtual double getRidingHeight(); virtual double getRideHeight(); virtual void ride(shared_ptr e); - virtual void findStandUpPosition(shared_ptr vehicle); // 4J Stu - Brought forward from 12w36 to fix #46282 - TU5: Gameplay: Exiting the minecart in a tight corridor damages the player virtual void lerpTo(double x, double y, double z, float yRot, float xRot, int steps); virtual float getPickRadius(); virtual Vec3 *getLookAngle(); virtual void handleInsidePortal(); + virtual int getDimensionChangingDelay(); virtual void lerpMotion(double xd, double yd, double zd); virtual void handleEntityEvent(byte eventId); virtual void animateHurt(); - virtual void prepareCustomTextures(); virtual ItemInstanceArray getEquipmentSlots(); // ItemInstance[] virtual void setEquippedSlot(int slot, shared_ptr item); // 4J Stu - Brought forward change from 1.3 to fix #64688 - Customer Encountered: TU7: Content: Art: Aura of enchanted item is not displayed for other players in online game virtual bool isOnFire(); @@ -336,7 +361,7 @@ public: void setAirSupply(int supply); virtual void thunderHit(const LightningBolt *lightningBolt); - virtual void killed(shared_ptr mob); + virtual void killed(shared_ptr mob); protected: bool checkInTile(double x, double y, double z); @@ -346,9 +371,6 @@ public: virtual wstring getAName(); - // TU9 - bool skipAttackInteraction(shared_ptr source) {return false;} - // 4J - added to manage allocation of small ids private: // Things also added here to be able to manage the concept of a number of extra "wandering" entities - normally path finding entities aren't allowed to @@ -374,14 +396,28 @@ public: void considerForExtraWandering(bool enable); bool isExtraWanderingEnabled(); int getWanderingQuadrant(); - + virtual vector > *getSubEntities(); virtual bool is(shared_ptr other); virtual float getYHeadRot(); virtual void setYHeadRot(float yHeadRot); virtual bool isAttackable(); + virtual bool skipAttackInteraction(shared_ptr source); virtual bool isInvulnerable(); virtual void copyPosition(shared_ptr target); + virtual void restoreFrom(shared_ptr oldEntity, bool teleporting); + virtual void changeDimension(int i); + virtual float getTileExplosionResistance(Explosion *explosion, Level *level, int x, int y, int z, Tile *tile); + virtual bool shouldTileExplode(Explosion *explosion, Level *level, int x, int y, int z, int id, float power); + virtual int getMaxFallDistance(); + virtual int getPortalEntranceDir(); + virtual bool isIgnoringTileTriggers(); + virtual bool displayFireAnimation(); + virtual void setUUID(const wstring &UUID); + virtual wstring getUUID(); + virtual bool isPushedByWater(); + virtual wstring getDisplayName(); + virtual wstring getNetworkName(); // 4J: Added private: unsigned int m_uiAnimOverrideBitmask; diff --git a/Minecraft.World/EntityActionAtPositionPacket.cpp b/Minecraft.World/EntityActionAtPositionPacket.cpp index 7353f932..64f36d1f 100644 --- a/Minecraft.World/EntityActionAtPositionPacket.cpp +++ b/Minecraft.World/EntityActionAtPositionPacket.cpp @@ -24,7 +24,7 @@ EntityActionAtPositionPacket::EntityActionAtPositionPacket(shared_ptr e, this->x = x; this->y = y; this->z = z; - this->id = e->entityId; + id = e->entityId; } void EntityActionAtPositionPacket::read(DataInputStream *dis) //throws IOException diff --git a/Minecraft.World/EntityDamageSource.cpp b/Minecraft.World/EntityDamageSource.cpp index 8c7a5ee1..22237bf1 100644 --- a/Minecraft.World/EntityDamageSource.cpp +++ b/Minecraft.World/EntityDamageSource.cpp @@ -5,7 +5,7 @@ #include "net.minecraft.network.packet.h" //EntityDamageSource::EntityDamageSource(const wstring &msgId, shared_ptr entity) : DamageSource(msgId) -EntityDamageSource::EntityDamageSource(ChatPacket::EChatPacketMessage msgId, shared_ptr entity) : DamageSource(msgId) +EntityDamageSource::EntityDamageSource(ChatPacket::EChatPacketMessage msgId, ChatPacket::EChatPacketMessage msgWithItemId, shared_ptr entity) : DamageSource(msgId, msgWithItemId) { this->entity = entity; } @@ -21,18 +21,41 @@ shared_ptr EntityDamageSource::getEntity() // //return I18n.get("death." + msgId, player.name, entity.getAName()); //} -shared_ptr EntityDamageSource::getDeathMessagePacket(shared_ptr player) +shared_ptr EntityDamageSource::getDeathMessagePacket(shared_ptr player) { + shared_ptr held = (entity != NULL) && entity->instanceof(eTYPE_LIVINGENTITY) ? dynamic_pointer_cast(entity)->getCarriedItem() : nullptr; wstring additional = L""; - if(entity->GetType() == eTYPE_SERVERPLAYER) + + if (entity->instanceof(eTYPE_SERVERPLAYER)) { - 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 1d66bfeb..21bc3021 100644 --- a/Minecraft.World/File.cpp +++ b/Minecraft.World/File.cpp @@ -37,7 +37,7 @@ File::File( const wstring& pathname ) //: parent( NULL ) m_abstractPathName = pathname; #ifdef _WINDOWS64 - string path = wstringtofilename(m_abstractPathName); + string path = wstringtochararray(m_abstractPathName); string finalPath = StorageManager.GetMountedPath(path.c_str()); if(finalPath.size() == 0) finalPath = path; m_abstractPathName = convStringToWstring(finalPath); diff --git a/Minecraft.World/FileHeader.cpp b/Minecraft.World/FileHeader.cpp index 59e97d9b..35f7b02d 100644 --- a/Minecraft.World/FileHeader.cpp +++ b/Minecraft.World/FileHeader.cpp @@ -217,6 +217,7 @@ void FileHeader::ReadHeader( LPVOID saveMem, ESavePlatform plat /*= SAVE_FILE_PL // : Bumped it to 6 for PS3 v1 to update map data mappings to use larger PlayerUID // : Bumped it to 7 for Durango v1 to update map data mappings to use string based PlayerUID // : Bumped it to 8 for Durango v1 when to save the chunks in a different compressed format + case SAVE_FILE_VERSION_CHUNK_INHABITED_TIME: case SAVE_FILE_VERSION_COMPRESSED_CHUNK_STORAGE: case SAVE_FILE_VERSION_DURANGO_CHANGE_MAP_DATA_MAPPING_SIZE: case SAVE_FILE_VERSION_CHANGE_MAP_DATA_MAPPING_SIZE: diff --git a/Minecraft.World/FileHeader.h b/Minecraft.World/FileHeader.h index 203ec322..4444409f 100644 --- a/Minecraft.World/FileHeader.h +++ b/Minecraft.World/FileHeader.h @@ -36,6 +36,12 @@ enum ESaveVersions // This is the version at which we changed the chunk format to directly save the compressed storage formats SAVE_FILE_VERSION_COMPRESSED_CHUNK_STORAGE, + // This is the version at which we added inhabited time to chunk (1.6.4) + SAVE_FILE_VERSION_CHUNK_INHABITED_TIME, + + + // 4J Stu - If you add a new version here, the save conversion tool will also need updated to be able to read this new format + SAVE_FILE_VERSION_NEXT, }; diff --git a/Minecraft.World/FireChargeItem.cpp b/Minecraft.World/FireChargeItem.cpp index c4e47b0c..7a865ff5 100644 --- a/Minecraft.World/FireChargeItem.cpp +++ b/Minecraft.World/FireChargeItem.cpp @@ -13,7 +13,7 @@ FireChargeItem::FireChargeItem(int id) : Item(id) m_dragonFireballIcon = NULL; } -bool FireChargeItem::useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +bool FireChargeItem::useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { if (level->isClientSide) { @@ -27,7 +27,7 @@ bool FireChargeItem::useOn(shared_ptr itemInstance, shared_ptrmayBuild(x, y, z)) + if (!player->mayUseItemAt(x, y, z, face, instance)) { return false; } @@ -42,13 +42,13 @@ bool FireChargeItem::useOn(shared_ptr itemInstance, shared_ptrplaySound( x + 0.5, y + 0.5, z + 0.5,eSoundType_FIRE_IGNITE, 1, random->nextFloat() * 0.4f + 0.8f); - level->setTile(x, y, z, Tile::fire_Id); + level->playSound( x + 0.5, y + 0.5, z + 0.5,eSoundType_FIRE_NEWIGNITE, 1, random->nextFloat() * 0.4f + 0.8f); + level->setTileAndUpdate(x, y, z, Tile::fire_Id); } if (!player->abilities.instabuild) { - itemInstance->count--; + instance->count--; } return true; } diff --git a/Minecraft.World/FireTile.cpp b/Minecraft.World/FireTile.cpp index 60f062db..dfb4b961 100644 --- a/Minecraft.World/FireTile.cpp +++ b/Minecraft.World/FireTile.cpp @@ -50,8 +50,10 @@ void FireTile::init() setFlammable(Tile::bookshelf_Id, FLAME_EASY, BURN_MEDIUM); setFlammable(Tile::tnt_Id, FLAME_MEDIUM, BURN_INSTANT); setFlammable(Tile::tallgrass_Id, FLAME_INSTANT, BURN_INSTANT); - setFlammable(Tile::cloth_Id, FLAME_EASY, BURN_EASY); + setFlammable(Tile::wool_Id, FLAME_EASY, BURN_EASY); setFlammable(Tile::vine_Id, FLAME_MEDIUM, BURN_INSTANT); + setFlammable(Tile::coalBlock_Id, FLAME_HARD, BURN_HARD); + setFlammable(Tile::hayBlock_Id, FLAME_INSTANT, BURN_MEDIUM); } void FireTile::setFlammable(int id, int flame, int burn) @@ -90,13 +92,18 @@ int FireTile::getResourceCount(Random *random) return 0; } -int FireTile::getTickDelay() +int FireTile::getTickDelay(Level *level) { return 30; } void FireTile::tick(Level *level, int x, int y, int z, Random *random) { + if (!level->getGameRules()->getBoolean(GameRules::RULE_DOFIRETICK)) + { + return; + } + // 4J added - we don't want fire to do anything that might create new fire, or destroy this fire, if we aren't actually tracking (for network) the chunk this is in in the player // chunk map. If we did change something in that case, then the change wouldn't get sent to any player that had already received that full chunk, and so we'd just become desynchronised. // Seems safest just to do an addToTickNextTick here instead with a decent delay, to make sure that we will get ticked again in the future, when we might again be in a chunk @@ -105,13 +112,13 @@ void FireTile::tick(Level *level, int x, int y, int z, Random *random) { if( !MinecraftServer::getInstance()->getPlayers()->isTrackingTile(x, y, z, level->dimension->id) ) { - level->addToTickNextTick(x, y, z, id, getTickDelay() * 5); + level->addToTickNextTick(x, y, z, id, getTickDelay(level) * 5); return; } } - bool infiniBurn = level->getTile(x, y - 1, z) == Tile::hellRock_Id; + bool infiniBurn = level->getTile(x, y - 1, z) == Tile::netherRack_Id; if (level->dimension->id == 1) // 4J - was == instanceof TheEndDimension { if (level->getTile(x, y - 1, z) == Tile::unbreakable_Id) infiniBurn = true; @@ -119,14 +126,14 @@ void FireTile::tick(Level *level, int x, int y, int z, Random *random) if (!mayPlace(level, x, y, z)) { - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); } if (!infiniBurn && level->isRaining()) { if (level->isRainingAt(x, y, z) || level->isRainingAt(x - 1, y, z) || level->isRainingAt(x + 1, y, z) || level->isRainingAt(x, y, z - 1) || level->isRainingAt(x, y, z + 1)) { - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); return; } } @@ -134,13 +141,13 @@ void FireTile::tick(Level *level, int x, int y, int z, Random *random) int age = level->getData(x, y, z); if (age < 15) { - level->setDataNoUpdate(x, y, z, age + random->nextInt(3) / 2); + level->setData(x, y, z, age + random->nextInt(3) / 2, Tile::UPDATE_NONE); } - level->addToTickNextTick(x, y, z, id, getTickDelay() + random->nextInt(10)); + level->addToTickNextTick(x, y, z, id, getTickDelay(level) + random->nextInt(10)); if (!infiniBurn && !isValidFireLocation(level, x, y, z)) { - if (!level->isTopSolidBlocking(x, y - 1, z) || age > 3) level->setTile(x, y, z, 0); + if (!level->isTopSolidBlocking(x, y - 1, z) || age > 3) level->removeTile(x, y, z); return; } @@ -148,7 +155,7 @@ void FireTile::tick(Level *level, int x, int y, int z, Random *random) { if (age == 15 && random->nextInt(4) == 0) { - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); return; } } @@ -183,23 +190,18 @@ void FireTile::tick(Level *level, int x, int y, int z, Random *random) int fodds = getFireOdds(level, xx, yy, zz); if (fodds > 0) { - int odds = (fodds + 40) / (age + 30); + int odds = (fodds + 40 + (level->difficulty * 7)) / (age + 30); if (isHumid) { odds /= 2; } if (odds > 0 && random->nextInt(rate) <= odds) { - if ((level->isRaining() && level->isRainingAt(xx, yy, zz)) || level->isRainingAt(xx - 1, yy, z) || level->isRainingAt(xx + 1, yy, zz) || level->isRainingAt(xx, yy, zz - 1) - || level->isRainingAt(xx, yy, zz + 1)) + if (!(level->isRaining() && level->isRainingAt(xx, yy, zz) || level->isRainingAt(xx - 1, yy, z) || level->isRainingAt(xx + 1, yy, zz) || level->isRainingAt(xx, yy, zz - 1) || level->isRainingAt(xx, yy, zz + 1))) { - // DO NOTHING, rain! - - } else { int tAge = age + random->nextInt(5) / 4; if (tAge > 15) tAge = 15; - level->setTileAndData(xx, yy, zz, this->id, tAge); - + level->setTileAndData(xx, yy, zz, id, tAge, Tile::UPDATE_ALL); } } } @@ -209,6 +211,11 @@ void FireTile::tick(Level *level, int x, int y, int z, Random *random) } } +bool FireTile::canInstantlyTick() +{ + return false; +} + void FireTile::checkBurnOut(Level *level, int x, int y, int z, int chance, Random *random, int age) { int odds = burnOdds[level->getTile(x, y, z)]; @@ -219,10 +226,10 @@ void FireTile::checkBurnOut(Level *level, int x, int y, int z, int chance, Rando { int tAge = age + random->nextInt(5) / 4; if (tAge > 15) tAge = 15; - level->setTileAndData(x, y, z, this->id, tAge); + level->setTileAndData(x, y, z, id, tAge, Tile::UPDATE_ALL); } else { - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); } if (wasTnt) { @@ -284,7 +291,7 @@ void FireTile::neighborChanged(Level *level, int x, int y, int z, int type) { if (!level->isTopSolidBlocking(x, y - 1, z) && !isValidFireLocation(level, x, y, z)) { - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); return; } } @@ -300,10 +307,10 @@ void FireTile::onPlace(Level *level, int x, int y, int z) } if (!level->isTopSolidBlocking(x, y - 1, z) && !isValidFireLocation(level, x, y, z)) { - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); return; } - level->addToTickNextTick(x, y, z, id, getTickDelay() + level->random->nextInt(10)); + level->addToTickNextTick(x, y, z, id, getTickDelay(level) + level->random->nextInt(10)); } bool FireTile::isFlammable(int tile) @@ -315,7 +322,7 @@ void FireTile::animateTick(Level *level, int x, int y, int z, Random *random) { if (random->nextInt(24) == 0) { - level->playLocalSound(x + 0.5f, y + 0.5f, z + 0.5f,eSoundType_FIRE_FIRE, 1 + random->nextFloat(), random->nextFloat() * 0.7f + 0.3f); + level->playLocalSound(x + 0.5f, y + 0.5f, z + 0.5f,eSoundType_FIRE_FIRE, 1 + random->nextFloat(), random->nextFloat() * 0.7f + 0.3f, false); } if (level->isTopSolidBlocking(x, y - 1, z) || Tile::fire->canBurn(level, x, y - 1, z)) diff --git a/Minecraft.World/FireTile.h b/Minecraft.World/FireTile.h index af079a6a..1d823752 100644 --- a/Minecraft.World/FireTile.h +++ b/Minecraft.World/FireTile.h @@ -13,19 +13,19 @@ public: static const wstring TEXTURE_SECOND; static const int FLAME_INSTANT = 60; - static const int FLAME_EASY = 30; - static const int FLAME_MEDIUM = 15; - static const int FLAME_HARD = 5; - - static const int BURN_INSTANT = 100; - static const int BURN_EASY = 60; - static const int BURN_MEDIUM = 20; - static const int BURN_HARD = 5; - static const int BURN_NEVER = 0; + static const int FLAME_EASY = 30; + static const int FLAME_MEDIUM = 15; + static const int FLAME_HARD = 5; + + static const int BURN_INSTANT = 100; + static const int BURN_EASY = 60; + static const int BURN_MEDIUM = 20; + static const int BURN_HARD = 5; + static const int BURN_NEVER = 0; private: - int *flameOdds; - int *burnOdds; + int *flameOdds; + int *burnOdds; Icon **icons; protected: FireTile(int id); @@ -36,17 +36,19 @@ private: void setFlammable(int id, int flame, int burn); public: virtual AABB *getAABB(Level *level, int x, int y, int z); - virtual bool blocksLight(); - virtual bool isSolidRender(bool isServerLevel = false); - virtual bool isCubeShaped(); - virtual int getRenderShape(); - virtual int getResourceCount(Random *random); - virtual int getTickDelay(); - virtual void tick(Level *level, int x, int y, int z, Random *random); + virtual bool blocksLight(); + virtual bool isSolidRender(bool isServerLevel = false); + virtual bool isCubeShaped(); + virtual int getRenderShape(); + virtual int getResourceCount(Random *random); + virtual int getTickDelay(Level *level); + virtual void tick(Level *level, int x, int y, int z, Random *random); + virtual bool canInstantlyTick(); + private: void checkBurnOut(Level *level, int x, int y, int z, int chance, Random *random, int age); - bool isValidFireLocation(Level *level, int x, int y, int z); - int getFireOdds(Level *level, int x, int y, int z); + bool isValidFireLocation(Level *level, int x, int y, int z); + int getFireOdds(Level *level, int x, int y, int z); public: virtual bool mayPick(); bool canBurn(LevelSource *level, int x, int y, int z); diff --git a/Minecraft.World/Fireball.cpp b/Minecraft.World/Fireball.cpp index 46be68f7..1d9fbdda 100644 --- a/Minecraft.World/Fireball.cpp +++ b/Minecraft.World/Fireball.cpp @@ -63,8 +63,8 @@ Fireball::Fireball(Level *level, double x, double y, double z, double xa, double setSize(16 / 16.0f, 16 / 16.0f); - this->moveTo(x, y, z, yRot, xRot); - this->setPos(x, y, z); + moveTo(x, y, z, yRot, xRot); + setPos(x, y, z); double dd = sqrt(xa * xa + ya * ya + za * za); @@ -84,7 +84,7 @@ Fireball::Fireball(Level *level, double x, double y, double z, double xa, double } } -Fireball::Fireball(Level *level, shared_ptr mob, double xa, double ya, double za) : Entity ( level ) +Fireball::Fireball(Level *level, shared_ptr mob, double xa, double ya, double za) : Entity ( level ) { // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called @@ -92,13 +92,13 @@ Fireball::Fireball(Level *level, shared_ptr mob, double xa, double ya, doub _init(); - this->owner = mob; + owner = mob; setSize(16 / 16.0f, 16 / 16.0f); - this->moveTo(mob->x, mob->y, mob->z, mob->yRot, mob->xRot); - this->setPos(x, y, z); - this->heightOffset = 0; + moveTo(mob->x, mob->y, mob->z, mob->yRot, mob->xRot); + setPos(x, y, z); + heightOffset = 0; xd = yd = zd = 0.0; @@ -198,7 +198,7 @@ void Fireball::tick() to = Vec3::newTemp(res->pos->x, res->pos->y, res->pos->z); } shared_ptr hitEntity = nullptr; - vector > *objects = level->getEntities(shared_from_this(), this->bb->expand(xd, yd, zd)->grow(1, 1, 1)); + vector > *objects = level->getEntities(shared_from_this(), bb->expand(xd, yd, zd)->grow(1, 1, 1)); double nearest = 0; AUTO_VAR(itEnd, objects->end()); for (AUTO_VAR(it, objects->begin()); it != itEnd; it++) @@ -239,8 +239,8 @@ void Fireball::tick() z += zd; double sd = sqrt(xd * xd + zd * zd); - yRot = (float) (atan2(xd, zd) * 180 / PI); - xRot = (float) (atan2(yd, sd) * 180 / PI); + yRot = (float) (atan2(zd, xd) * 180 / PI) + 90; + xRot = (float) (atan2(sd, yd) * 180 / PI) - 90; while (xRot - xRotO < -180) xRotO -= 360; @@ -256,7 +256,7 @@ void Fireball::tick() yRot = yRotO + (yRot - yRotO) * 0.2f; - float inertia = 0.95f; + float inertia = getInertia(); if (isInWater()) { for (int i = 0; i < 4; i++) @@ -292,37 +292,19 @@ void Fireball::tick() setPos(x, y, z); } -void Fireball::onHit(HitResult *res) +float Fireball::getInertia() { - if (!level->isClientSide) - { - if (res->entity != NULL) - { - DamageSource *damageSource = DamageSource::fireball(dynamic_pointer_cast( shared_from_this() ), owner); - if (res->entity->hurt(damageSource, 6)) - { - } - else - { - } - delete damageSource; - } - - bool destroyBlocks = true;//level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); - level->explode(nullptr, x, y, z, 1, true, destroyBlocks); - - remove(); - } + return 0.95f; } void Fireball::addAdditonalSaveData(CompoundTag *tag) { - tag->putShort(L"xTile", (short) xTile); + tag->putShort(L"xTile", (short) xTile); tag->putShort(L"yTile", (short) yTile); tag->putShort(L"zTile", (short) zTile); tag->putByte(L"inTile", (byte) lastTile); tag->putByte(L"inGround", (byte) (inGround ? 1 : 0)); - tag->put(L"direction", this->newDoubleList(3, this->xd, this->yd, this->zd)); + tag->put(L"direction", newDoubleList(3, xd, yd, zd)); } void Fireball::readAdditionalSaveData(CompoundTag *tag) @@ -338,13 +320,13 @@ void Fireball::readAdditionalSaveData(CompoundTag *tag) if (tag->contains(L"direction")) { ListTag *listTag = (ListTag *)tag->getList(L"direction"); - this->xd = ((DoubleTag *) listTag->get(0))->data; - this->yd = ((DoubleTag *) listTag->get(1))->data; - this->zd = ((DoubleTag *) listTag->get(2))->data; + xd = ((DoubleTag *) listTag->get(0))->data; + yd = ((DoubleTag *) listTag->get(1))->data; + zd = ((DoubleTag *) listTag->get(2))->data; } else { - this->remove(); + remove(); } } @@ -358,8 +340,9 @@ float Fireball::getPickRadius() return 1; } -bool Fireball::hurt(DamageSource *source, int damage) +bool Fireball::hurt(DamageSource *source, float damage) { + if (isInvulnerable()) return false; markHurt(); if (source->getEntity() != NULL) @@ -374,10 +357,9 @@ bool Fireball::hurt(DamageSource *source, int damage) yPower = yd * 0.1; zPower = zd * 0.1; } - shared_ptr mob = dynamic_pointer_cast( source->getEntity() ); - if (mob != NULL) + if ( source->getEntity()->instanceof(eTYPE_LIVINGENTITY) ) { - owner = mob; + owner = dynamic_pointer_cast( source->getEntity() ); } return true; } @@ -399,17 +381,12 @@ int Fireball::getLightColor(float a) return 15 << 20 | 15 << 4; } -bool Fireball::shouldBurn() -{ - return true; -} - -int Fireball::getIcon() -{ - 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..a11e8527 100644 --- a/Minecraft.World/FurnaceTileEntity.cpp +++ b/Minecraft.World/FurnaceTileEntity.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "com.mojang.nbt.h" +#include "net.minecraft.h" #include "net.minecraft.world.entity.player.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.item.crafting.h" @@ -8,40 +9,43 @@ #include "Material.h" #include "FurnaceTileEntity.h" +int furnaceSlotsForUp [] = { FurnaceTileEntity::SLOT_INPUT }; +int furnaceSlotsForDown [] = { FurnaceTileEntity::SLOT_RESULT, FurnaceTileEntity::SLOT_FUEL }; +int furnaceSlotsForSides [] = { FurnaceTileEntity::SLOT_FUEL }; +const intArray FurnaceTileEntity::SLOTS_FOR_UP = intArray(furnaceSlotsForUp, 1); +const intArray FurnaceTileEntity::SLOTS_FOR_DOWN = intArray(furnaceSlotsForDown, 2); +const intArray FurnaceTileEntity::SLOTS_FOR_SIDES = intArray(furnaceSlotsForSides, 1); const int FurnaceTileEntity::BURN_INTERVAL = 10 * 20; // 4J Stu - Need a ctor to initialise member variables FurnaceTileEntity::FurnaceTileEntity() : TileEntity() { - items = new ItemInstanceArray(3); + items = ItemInstanceArray(3); litTime = 0; - litDuration = 0; - tickCount = 0; - m_charcoalUsed = false; + name = L""; } FurnaceTileEntity::~FurnaceTileEntity() { - delete[] items->data; - delete items; + delete[] items.data; } unsigned int FurnaceTileEntity::getContainerSize() { - return items->length; + return items.length; } shared_ptr FurnaceTileEntity::getItem(unsigned int slot) { - return (*items)[slot]; + return items[slot]; } @@ -49,20 +53,20 @@ shared_ptr FurnaceTileEntity::removeItem(unsigned int slot, int co { m_charcoalUsed = false; - if ((*items)[slot] != NULL) + if (items[slot] != NULL) { - if ((*items)[slot]->count <= count) + if (items[slot]->count <= count) { - shared_ptr item = (*items)[slot]; - (*items)[slot] = nullptr; + shared_ptr item = items[slot]; + items[slot] = nullptr; // 4J Stu - Fix for duplication glitch if(item->count <= 0) return nullptr; return item; } else { - shared_ptr i = (*items)[slot]->remove(count); - if ((*items)[slot]->count == 0) (*items)[slot] = nullptr; + shared_ptr i = items[slot]->remove(count); + if (items[slot]->count == 0) items[slot] = nullptr; // 4J Stu - Fix for duplication glitch if(i->count <= 0) return nullptr; return i; @@ -75,10 +79,10 @@ shared_ptr FurnaceTileEntity::removeItemNoUpdate(int slot) { m_charcoalUsed = false; - if (items->data[slot] != NULL) + if (items[slot] != NULL) { - shared_ptr item = items->data[slot]; - items->data[slot] = nullptr; + shared_ptr item = items[slot]; + items[slot] = nullptr; return item; } return nullptr; @@ -87,32 +91,48 @@ shared_ptr FurnaceTileEntity::removeItemNoUpdate(int slot) void FurnaceTileEntity::setItem(unsigned int slot, shared_ptr item) { - (*items)[slot] = item; + items[slot] = item; if (item != NULL && item->count > getMaxStackSize()) item->count = getMaxStackSize(); } -int FurnaceTileEntity::getName() +wstring FurnaceTileEntity::getName() { - return 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,18 +144,18 @@ void FurnaceTileEntity::save(CompoundTag *base) base->putShort(L"CookTime", (short) (tickCount)); ListTag *listTag = new ListTag(); - for (unsigned int i = 0; i < items->length; i++) + for (unsigned int i = 0; i < items.length; i++) { - if ((*items)[i] != NULL) + if (items[i] != NULL) { CompoundTag *tag = new CompoundTag(); tag->putByte(L"Slot", (byte) i); - (*items)[i]->save(tag); + items[i]->save(tag); listTag->add(tag); } } base->put(L"Items", listTag); - + if (hasCustomName()) base->putString(L"CustomName", name); base->putBoolean(L"CharcoalUsed", m_charcoalUsed); } @@ -178,24 +198,24 @@ void FurnaceTileEntity::tick() { if (litTime == 0 && canBurn()) { - litDuration = litTime = getBurnDuration((*items)[FUEL_SLOT]); + litDuration = litTime = getBurnDuration(items[SLOT_FUEL]); if (litTime > 0) { changed = true; - if ((*items)[FUEL_SLOT] != NULL) + if (items[SLOT_FUEL] != NULL) { // 4J Added: Keep track of whether charcoal was used in production of current stack. - if ( (*items)[FUEL_SLOT]->getItem()->id == Item::coal_Id - && (*items)[FUEL_SLOT]->getAuxValue() == CoalItem::CHAR_COAL) + if ( items[SLOT_FUEL]->getItem()->id == Item::coal_Id + && items[SLOT_FUEL]->getAuxValue() == CoalItem::CHAR_COAL) { m_charcoalUsed = true; } - (*items)[FUEL_SLOT]->count--; - if ((*items)[FUEL_SLOT]->count == 0) + items[SLOT_FUEL]->count--; + if (items[SLOT_FUEL]->count == 0) { - Item *remaining = (*items)[FUEL_SLOT]->getItem()->getCraftingRemainingItem(); - (*items)[FUEL_SLOT] = remaining != NULL ? shared_ptr(new ItemInstance(remaining)) : nullptr; + Item *remaining = items[SLOT_FUEL]->getItem()->getCraftingRemainingItem(); + items[SLOT_FUEL] = remaining != NULL ? shared_ptr(new ItemInstance(remaining)) : nullptr; } } } @@ -229,13 +249,13 @@ void FurnaceTileEntity::tick() bool FurnaceTileEntity::canBurn() { - if ((*items)[INPUT_SLOT] == NULL) return false; - ItemInstance *burnResult = FurnaceRecipes::getInstance()->getResult((*items)[0]->getItem()->id); + if (items[SLOT_INPUT] == NULL) return false; + ItemInstance *burnResult = FurnaceRecipes::getInstance()->getResult(items[SLOT_INPUT]->getItem()->id); if (burnResult == NULL) return false; - if ((*items)[RESULT_SLOT] == NULL) return true; - if (!(*items)[RESULT_SLOT]->sameItem_not_shared(burnResult)) return false; - if ((*items)[RESULT_SLOT]->count < getMaxStackSize() && (*items)[RESULT_SLOT]->count < (*items)[RESULT_SLOT]->getMaxStackSize()) return true; - if ((*items)[RESULT_SLOT]->count < burnResult->getMaxStackSize()) return true; + if (items[SLOT_RESULT] == NULL) return true; + if (!items[SLOT_RESULT]->sameItem_not_shared(burnResult)) return false; + if (items[SLOT_RESULT]->count < getMaxStackSize() && items[SLOT_RESULT]->count < items[SLOT_RESULT]->getMaxStackSize()) return true; + if (items[SLOT_RESULT]->count < burnResult->getMaxStackSize()) return true; return false; } @@ -244,12 +264,12 @@ void FurnaceTileEntity::burn() { if (!canBurn()) return; - ItemInstance *result = FurnaceRecipes::getInstance()->getResult((*items)[0]->getItem()->id); - if ((*items)[RESULT_SLOT] == NULL) (*items)[RESULT_SLOT] = result->copy(); - else if ((*items)[RESULT_SLOT]->id == result->id) (*items)[RESULT_SLOT]->count++; + ItemInstance *result = FurnaceRecipes::getInstance()->getResult(items[SLOT_INPUT]->getItem()->id); + if (items[SLOT_RESULT] == NULL) items[SLOT_RESULT] = result->copy(); + else if (items[SLOT_RESULT]->id == result->id) items[SLOT_RESULT]->count++; - (*items)[INPUT_SLOT]->count--; - if ((*items)[INPUT_SLOT]->count <= 0) (*items)[INPUT_SLOT] = nullptr; + items[SLOT_INPUT]->count--; + if (items[SLOT_INPUT]->count <= 0) items[SLOT_INPUT] = nullptr; } @@ -273,6 +293,11 @@ int FurnaceTileEntity::getBurnDuration(shared_ptr itemInstance) { return BURN_INTERVAL * 3 / 2; } + + if (tile == Tile::coalBlock) + { + return BURN_INTERVAL * 8 * 10; + } } if (dynamic_cast(item) && ((DiggerItem *) item)->getTier() == Item::Tier::WOOD) @@ -329,6 +354,45 @@ void FurnaceTileEntity::stopOpen() { } +bool FurnaceTileEntity::canPlaceItem(int slot, shared_ptr item) +{ + if (slot == SLOT_RESULT) return false; + if (slot == SLOT_FUEL) return isFuel(item); + return true; +} + +intArray FurnaceTileEntity::getSlotsForFace(int face) +{ + if (face == Facing::DOWN) + { + return SLOTS_FOR_DOWN; + } + else if (face == Facing::UP) + { + return SLOTS_FOR_UP; + } + else + { + return SLOTS_FOR_SIDES; + } +} + +bool FurnaceTileEntity::canPlaceItemThroughFace(int slot, shared_ptr item, int face) +{ + return canPlaceItem(slot, item); + +} + +bool FurnaceTileEntity::canTakeItemThroughFace(int slot, shared_ptr item, int face) +{ + if (face == Facing::DOWN && slot == SLOT_FUEL) + { + if (item->id != Item::bucket_empty_Id) return false; + } + + return true; +} + // 4J Added shared_ptr FurnaceTileEntity::clone() { @@ -339,11 +403,11 @@ shared_ptr FurnaceTileEntity::clone() result->tickCount = tickCount; result->litDuration = litDuration; - for (unsigned int i = 0; i < items->length; i++) + for (unsigned int i = 0; i < items.length; i++) { - if ((*items)[i] != NULL) + if (items[i] != NULL) { - (*result->items)[i] = ItemInstance::clone((*items)[i]); + result->items[i] = ItemInstance::clone(items[i]); } } return result; diff --git a/Minecraft.World/FurnaceTileEntity.h b/Minecraft.World/FurnaceTileEntity.h index db39452e..2907a4ca 100644 --- a/Minecraft.World/FurnaceTileEntity.h +++ b/Minecraft.World/FurnaceTileEntity.h @@ -3,28 +3,30 @@ using namespace std; #include "FurnaceTile.h" #include "TileEntity.h" -#include "Container.h" +#include "WorldlyContainer.h" class Player; class Level; -class FurnaceTileEntity : public TileEntity, public Container +class FurnaceTileEntity : public TileEntity, public WorldlyContainer { public: eINSTANCEOF GetType() { return eTYPE_FURNACETILEENTITY; } static TileEntity *create() { return new FurnaceTileEntity(); } -using TileEntity::setChanged; + using TileEntity::setChanged; + + static const int SLOT_INPUT = 0; + static const int SLOT_FUEL = 1; + static const int SLOT_RESULT = 2; private: - static const int BURN_INTERVAL; - ItemInstanceArray *items; + static const intArray SLOTS_FOR_UP; + static const intArray SLOTS_FOR_DOWN; + static const intArray SLOTS_FOR_SIDES; - enum { - INPUT_SLOT = 0, - FUEL_SLOT, - RESULT_SLOT, - }; + static const int BURN_INTERVAL; + ItemInstanceArray items; // 4J-JEV: Added for 'Renewable Energy' achievement. // Should be true iff characoal was consumed whilst cooking the current stack. @@ -35,6 +37,10 @@ public: int litDuration; int tickCount; +private: + + wstring name; + public: // 4J Stu - Need a ctor to initialise member variables FurnaceTileEntity(); @@ -45,7 +51,10 @@ public: virtual shared_ptr removeItem(unsigned int slot, int count); virtual shared_ptr removeItemNoUpdate(int slot); virtual void setItem(unsigned int slot, shared_ptr item); - virtual int getName(); + virtual wstring getName(); + virtual wstring getCustomName(); + virtual bool hasCustomName(); + virtual void setCustomName(const wstring &name); virtual void load(CompoundTag *base); virtual void save(CompoundTag *base); virtual int getMaxStackSize(); @@ -67,8 +76,13 @@ public: virtual bool stillValid(shared_ptr player); virtual void setChanged(); - void startOpen(); - void stopOpen(); + void startOpen(); + void stopOpen(); + + virtual bool canPlaceItem(int slot, shared_ptr item); + virtual intArray getSlotsForFace(int face); + virtual bool canPlaceItemThroughFace(int slot, shared_ptr item, int face); + virtual bool canTakeItemThroughFace(int slot, shared_ptr item, int face); // 4J Added virtual shared_ptr clone(); diff --git a/Minecraft.World/GameDifficultyCommand.h b/Minecraft.World/GameDifficultyCommand.h new file mode 100644 index 00000000..ffa0cc2d --- /dev/null +++ b/Minecraft.World/GameDifficultyCommand.h @@ -0,0 +1,75 @@ +/* +package net.minecraft.commands.common; + +import java.util.List; + +import net.minecraft.commands.*; +import net.minecraft.commands.exceptions.UsageException; +import net.minecraft.locale.I18n; +import net.minecraft.network.chat.ChatMessageComponent; +import net.minecraft.server.MinecraftServer; + +public class GameDifficultyCommand extends BaseCommand { + + // note: copied from Options.java, move to shared location? + private static final String[] DIFFICULTY_NAMES = { + "options.difficulty.peaceful", "options.difficulty.easy", "options.difficulty.normal", "options.difficulty.hard" + }; + + @Override + public String getName() { + return "difficulty"; + } + + @Override + public int getPermissionLevel() { + return LEVEL_GAMEMASTERS; + } + + + @Override + public String getUsage(CommandSender source) { + return "commands.difficulty.usage"; + } + + @Override + public void execute(CommandSender source, String[] args) { + if (args.length > 0) { + int newDiff = getDifficultyForString(source, args[0]); + + MinecraftServer.getInstance().setDifficulty(newDiff); + + logAdminAction(source, "commands.difficulty.success", ChatMessageComponent.forTranslation(DIFFICULTY_NAMES[newDiff])); + + return; + } + + throw new UsageException("commands.difficulty.usage"); + } + + protected int getDifficultyForString(CommandSender source, String name) { + if (name.equalsIgnoreCase("peaceful") || name.equalsIgnoreCase("p")) { + return 0; + } else if (name.equalsIgnoreCase("easy") || name.equalsIgnoreCase("e")) { + return 1; + } else if (name.equalsIgnoreCase("normal") || name.equalsIgnoreCase("n")) { + return 2; + } else if (name.equalsIgnoreCase("hard") || name.equalsIgnoreCase("h")) { + return 3; + } else { + return convertArgToInt(source, name, 0, 3); + } + } + + @Override + public List matchArguments(CommandSender source, String[] args) { + if (args.length == 1) { + return matchArguments(args, "peaceful", "easy", "normal", "hard"); + } + + return null; + } + +} + +*/ \ No newline at end of file diff --git a/Minecraft.World/GameModeCommand.cpp b/Minecraft.World/GameModeCommand.cpp index 86d4c5a5..f8c1ffb6 100644 --- a/Minecraft.World/GameModeCommand.cpp +++ b/Minecraft.World/GameModeCommand.cpp @@ -7,23 +7,32 @@ EGameCommand GameModeCommand::getId() return eGameCommand_GameMode; } +int GameModeCommand::getPermissionLevel() +{ + return LEVEL_GAMEMASTERS; +} + void GameModeCommand::execute(shared_ptr source, byteArray commandData) { - //if (args.length > 0) - //{ + //if (args.length > 0) { // GameType newMode = getModeForString(source, args[0]); - // Player player = args.length >= 2 ? getPlayer(args[1]) : convertSourceToPlayer(source); + // Player player = args.length >= 2 ? convertToPlayer(source, args[1]) : convertSourceToPlayer(source); // player.setGameMode(newMode); + // player.fallDistance = 0; // reset falldistance so flying people do not die :P - // String mode = I18n.get("gameMode." + newMode.getName()); + // ChatMessageComponent mode = ChatMessageComponent.forTranslation("gameMode." + newMode.getName()); // if (player != source) { // logAdminAction(source, AdminLogCommand.LOGTYPE_DONT_SHOW_TO_SELF, "commands.gamemode.success.other", player.getAName(), mode); // } else { // logAdminAction(source, AdminLogCommand.LOGTYPE_DONT_SHOW_TO_SELF, "commands.gamemode.success.self", mode); // } + + // return; //} + + //throw new UsageException("commands.gamemode.usage"); } GameType *GameModeCommand::getModeForString(shared_ptr source, const wstring &name) @@ -38,16 +47,4 @@ GameType *GameModeCommand::getModeForString(shared_ptr source, co //} else { // return LevelSettings.validateGameType(convertArgToInt(source, name, 0, GameType.values().length - 2)); //} -} - -shared_ptr GameModeCommand::getPlayer(PlayerUID playerId) -{ - return nullptr; - //Player player = MinecraftServer.getInstance().getPlayers().getPlayer(name); - - //if (player == null) { - // throw new PlayerNotFoundException(); - //} else { - // return player; - //} } \ No newline at end of file diff --git a/Minecraft.World/GameModeCommand.h b/Minecraft.World/GameModeCommand.h index 66401587..302be9f5 100644 --- a/Minecraft.World/GameModeCommand.h +++ b/Minecraft.World/GameModeCommand.h @@ -8,9 +8,9 @@ class GameModeCommand : public Command { public: virtual EGameCommand getId(); + int getPermissionLevel(); virtual void execute(shared_ptr source, byteArray commandData); protected: GameType *getModeForString(shared_ptr source, const wstring &name); - shared_ptr getPlayer(PlayerUID playerId); }; \ No newline at end of file diff --git a/Minecraft.World/GameRuleCommand.h b/Minecraft.World/GameRuleCommand.h new file mode 100644 index 00000000..25cf12ce --- /dev/null +++ b/Minecraft.World/GameRuleCommand.h @@ -0,0 +1,83 @@ +/* +package net.minecraft.commands.common; + +import net.minecraft.commands.BaseCommand; +import net.minecraft.commands.CommandSender; +import net.minecraft.commands.exceptions.UsageException; +import net.minecraft.network.chat.ChatMessageComponent; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.level.GameRules; + +import java.util.List; + +public class GameRuleCommand extends BaseCommand { + @Override + public String getName() { + return "gamerule"; + } + + @Override + public int getPermissionLevel() { + return LEVEL_GAMEMASTERS; + } + + + @Override + public String getUsage(CommandSender source) { + return "commands.gamerule.usage"; + } + + @Override + public void execute(CommandSender source, String[] args) { + if (args.length == 2) { + String rule = args[0]; + String value = args[1]; + + GameRules rules = getRules(); + + if (rules.contains(rule)) { + rules.set(rule, value); + logAdminAction(source, "commands.gamerule.success"); + } else { + logAdminAction(source, "commands.gamerule.norule", rule); + } + + return; + } else if (args.length == 1) { + String rule = args[0]; + GameRules rules = getRules(); + + if (rules.contains(rule)) { + String value = rules.get(rule); + source.sendMessage(ChatMessageComponent.forPlainText(rule).addPlainText(" = ").addPlainText(value)); + } else { + logAdminAction(source, "commands.gamerule.norule", rule); + } + + return; + } else if (args.length == 0) { + GameRules rules = getRules(); + source.sendMessage(ChatMessageComponent.forPlainText(joinStrings(rules.getRuleNames()))); + return; + } + + throw new UsageException("commands.gamerule.usage"); + } + + @Override + public List matchArguments(CommandSender source, String[] args) { + if (args.length == 1) { + return matchArguments(args, getRules().getRuleNames()); + } else if (args.length == 2) { + return matchArguments(args, "true", "false"); + } + + return null; + } + + private GameRules getRules() { + return MinecraftServer.getInstance().getLevel(0).getGameRules(); + } +} + +*/ \ No newline at end of file diff --git a/Minecraft.World/GameRules.cpp b/Minecraft.World/GameRules.cpp new file mode 100644 index 00000000..0e594520 --- /dev/null +++ b/Minecraft.World/GameRules.cpp @@ -0,0 +1,193 @@ +#include "stdafx.h" + +#include "GameRules.h" + +// 4J: GameRules isn't in use anymore, just routes any requests to app game host options, kept things commented out for context + +const int GameRules::RULE_DOFIRETICK = 0; +const int GameRules::RULE_MOBGRIEFING = 1; +const int GameRules::RULE_KEEPINVENTORY = 2; +const int GameRules::RULE_DOMOBSPAWNING = 3; +const int GameRules::RULE_DOMOBLOOT = 4; +const int GameRules::RULE_DOTILEDROPS = 5; +//const int GameRules::RULE_COMMANDBLOCKOUTPUT = 6; +const int GameRules::RULE_NATURAL_REGENERATION = 7; +const int GameRules::RULE_DAYLIGHT = 8; + +GameRules::GameRules() +{ + /*registerRule(RULE_DOFIRETICK, L"1"); + registerRule(RULE_MOBGRIEFING, L"1"); + registerRule(RULE_KEEPINVENTORY, L"0"); + registerRule(RULE_DOMOBSPAWNING, L"1"); + registerRule(RULE_DOMOBLOOT, L"1"); + registerRule(RULE_DOTILEDROPS, L"1"); + registerRule(RULE_COMMANDBLOCKOUTPUT, L"1"); + registerRule(RULE_NATURAL_REGENERATION, L"1"); + registerRule(RULE_DAYLIGHT, L"1");*/ +} + +GameRules::~GameRules() +{ + /*for(AUTO_VAR(it,rules.begin()); it != rules.end(); ++it) + { + delete it->second; + }*/ +} + +bool GameRules::getBoolean(const int rule) +{ + switch(rule) + { + case GameRules::RULE_DOFIRETICK: + return app.GetGameHostOption(eGameHostOption_FireSpreads); + case GameRules::RULE_MOBGRIEFING: + return app.GetGameHostOption(eGameHostOption_MobGriefing); + case GameRules::RULE_KEEPINVENTORY: + return app.GetGameHostOption(eGameHostOption_KeepInventory); + case GameRules::RULE_DOMOBSPAWNING: + return app.GetGameHostOption(eGameHostOption_DoMobSpawning); + case GameRules::RULE_DOMOBLOOT: + return app.GetGameHostOption(eGameHostOption_DoMobLoot); + case GameRules::RULE_DOTILEDROPS: + return app.GetGameHostOption(eGameHostOption_DoTileDrops); + case GameRules::RULE_NATURAL_REGENERATION: + return app.GetGameHostOption(eGameHostOption_NaturalRegeneration); + case GameRules::RULE_DAYLIGHT: + return app.GetGameHostOption(eGameHostOption_DoDaylightCycle); + default: + assert(0); + return false; + } +} + +/* +void GameRules::registerRule(const wstring &name, const wstring &startValue) +{ + rules[name] = new GameRule(startValue); +} + +void GameRules::set(const wstring &ruleName, const wstring &newValue) +{ + AUTO_VAR(it, rules.find(ruleName)); + if(it != rules.end() ) + { + GameRule *gameRule = it->second; + gameRule->set(newValue); + } + else + { + registerRule(ruleName, newValue); + } +} + +wstring GameRules::get(const wstring &ruleName) +{ + AUTO_VAR(it, rules.find(ruleName)); + if(it != rules.end() ) + { + GameRule *gameRule = it->second; + return gameRule->get(); + } + return L""; +} + +int GameRules::getInt(const wstring &ruleName) +{ + AUTO_VAR(it, rules.find(ruleName)); + if(it != rules.end() ) + { + GameRule *gameRule = it->second; + return gameRule->getInt(); + } + return 0; +} + +double GameRules::getDouble(const wstring &ruleName) +{ + AUTO_VAR(it, rules.find(ruleName)); + if(it != rules.end() ) + { + GameRule *gameRule = it->second; + return gameRule->getDouble(); + } + return 0; +} + +CompoundTag *GameRules::createTag() +{ + CompoundTag *result = new CompoundTag(L"GameRules"); + + for(AUTO_VAR(it,rules.begin()); it != rules.end(); ++it) + { + GameRule *gameRule = it->second; + result->putString(it->first, gameRule->get()); + } + + return result; +} + +void GameRules::loadFromTag(CompoundTag *tag) +{ + vector *allTags = tag->getAllTags(); + for (AUTO_VAR(it, allTags->begin()); it != allTags->end(); ++it) + { + Tag *ruleTag = *it; + wstring ruleName = ruleTag->getName(); + wstring value = tag->getString(ruleTag->getName()); + + set(ruleName, value); + } + delete allTags; +} + +// Need to delete returned vector. +vector *GameRules::getRuleNames() +{ + vector *out = new vector(); + for (AUTO_VAR(it, rules.begin()); it != rules.end(); it++) out->push_back(it->first); + return out; +} + +bool GameRules::contains(const wstring &rule) +{ + AUTO_VAR(it, rules.find(rule)); + return it != rules.end(); +} + +GameRules::GameRule::GameRule(const wstring &startValue) +{ + value = L""; + booleanValue = false; + intValue = 0; + doubleValue = 0.0; + set(startValue); +} + +void GameRules::GameRule::set(const wstring &newValue) +{ + value = newValue; + booleanValue = _fromString(newValue); + intValue = _fromString(newValue); + doubleValue = _fromString(newValue); +} + +wstring GameRules::GameRule::get() +{ + return value; +} + +bool GameRules::GameRule::getBoolean() +{ + return booleanValue; +} + +int GameRules::GameRule::getInt() +{ + return intValue; +} + +double GameRules::GameRule::getDouble() +{ + return doubleValue; +}*/ \ No newline at end of file diff --git a/Minecraft.World/GameRules.h b/Minecraft.World/GameRules.h new file mode 100644 index 00000000..35eddc6c --- /dev/null +++ b/Minecraft.World/GameRules.h @@ -0,0 +1,56 @@ +#pragma once + +class GameRules +{ +private: + class GameRule + { + private: + wstring value; + bool booleanValue; + int intValue; + double doubleValue; + + public: + GameRule(const wstring &startValue); + + void set(const wstring &newValue); + wstring get(); + bool getBoolean(); + int getInt(); + double getDouble(); + }; + +public: + // 4J: Originally strings + // default rules + static const int RULE_DOFIRETICK; + static const int RULE_MOBGRIEFING; + static const int RULE_KEEPINVENTORY; + static const int RULE_DOMOBSPAWNING; + static const int RULE_DOMOBLOOT; + static const int RULE_DOTILEDROPS; + static const int RULE_COMMANDBLOCKOUTPUT; + static const int RULE_NATURAL_REGENERATION; + static const int RULE_DAYLIGHT; + +private: + unordered_map rules; + +public: + GameRules(); + ~GameRules(); + + bool getBoolean(const int rule); + + // 4J: Removed unused functions + /*void set(const wstring &ruleName, const wstring &newValue); + void registerRule(const wstring &name, const wstring &startValue); + wstring get(const wstring &ruleName); + int getInt(const wstring &ruleName); + double getDouble(const wstring &ruleName); + CompoundTag *createTag(); + void loadFromTag(CompoundTag *tag); + vector *getRuleNames(); + bool contains(const wstring &rule);*/ +}; \ No newline at end of file diff --git a/Minecraft.World/Ghast.cpp b/Minecraft.World/Ghast.cpp index fcf0b705..f0817791 100644 --- a/Minecraft.World/Ghast.cpp +++ b/Minecraft.World/Ghast.cpp @@ -3,8 +3,10 @@ #include "net.minecraft.world.phys.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.projectile.h" #include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.damagesource.h" #include "net.minecraft.stats.h" @@ -17,6 +19,7 @@ void Ghast::_init() { + explosionPower = 1; floatDuration = 0; target = nullptr; retargetTime = 0; @@ -33,28 +36,31 @@ Ghast::Ghast(Level *level) : FlyingMob( level ) // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); + registerAttributes(); + setHealth(getMaxHealth()); - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); + _init(); - _init(); - - this->textureIdx = TN_MOB_GHAST; // 4J was L"/mob/ghast.png"; - this->setSize(4, 4); - this->fireImmune = true; + setSize(4, 4); + fireImmune = true; xpReward = Enemy::XP_REWARD_MEDIUM; } -bool Ghast::hurt(DamageSource *source, int dmg) +bool Ghast::isCharging() { + return entityData->getByte(DATA_IS_CHARGING) != 0; +} + +bool Ghast::hurt(DamageSource *source, float dmg) +{ + if (isInvulnerable()) return false; if (source->getMsgId() == ChatPacket::e_ChatDeathFireball) { - shared_ptr player = dynamic_pointer_cast( source->getEntity() ); - if (player != NULL) + if ( (source->getEntity() != NULL) && source->getEntity()->instanceof(eTYPE_PLAYER) ) { // reflected fireball, kill the ghast FlyingMob::hurt(source, 1000); - player->awardStat(GenericStats::ghast(),GenericStats::param_ghast()); + dynamic_pointer_cast(source->getEntity())->awardStat(GenericStats::ghast(), GenericStats::param_ghast()); return true; } } @@ -64,123 +70,118 @@ bool Ghast::hurt(DamageSource *source, int dmg) void Ghast::defineSynchedData() { - FlyingMob::defineSynchedData(); + FlyingMob::defineSynchedData(); - entityData->define(DATA_IS_CHARGING, (byte) 0); + entityData->define(DATA_IS_CHARGING, (byte) 0); } -int Ghast::getMaxHealth() +void Ghast::registerAttributes() { - return 10; -} + FlyingMob::registerAttributes(); -void Ghast::tick() -{ - FlyingMob::tick(); - byte current = entityData->getByte(DATA_IS_CHARGING); -// this->textureName = current == 1 ? L"/mob/ghast_fire.png" : L"/mob/ghast.png"; // 4J replaced with following line - this->textureIdx = current == 1 ? TN_MOB_GHAST_FIRE : TN_MOB_GHAST; + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(10); } void Ghast::serverAiStep() { - if (!level->isClientSide && level->difficulty == Difficulty::PEACEFUL) remove(); - checkDespawn(); + if (!level->isClientSide && level->difficulty == Difficulty::PEACEFUL) remove(); + checkDespawn(); - oCharge = charge; - double xd = xTarget - x; - double yd = yTarget - y; - double zd = zTarget - z; + oCharge = charge; + double xd = xTarget - x; + double yd = yTarget - y; + double zd = zTarget - z; - double dd = xd * xd + yd * yd + zd * zd; + double dd = xd * xd + yd * yd + zd * zd; - if (dd < 1 * 1 || dd > 60 * 60) + if (dd < 1 * 1 || dd > 60 * 60) { - xTarget = x + (random->nextFloat() * 2 - 1) * 16; - yTarget = y + (random->nextFloat() * 2 - 1) * 16; - zTarget = z + (random->nextFloat() * 2 - 1) * 16; - } + xTarget = x + (random->nextFloat() * 2 - 1) * 16; + yTarget = y + (random->nextFloat() * 2 - 1) * 16; + zTarget = z + (random->nextFloat() * 2 - 1) * 16; + } - if (floatDuration-- <= 0) + if (floatDuration-- <= 0) { - floatDuration += random->nextInt(5) + 2; + floatDuration += random->nextInt(5) + 2; dd = sqrt(dd); - if (canReach(xTarget, yTarget, zTarget, dd)) + if (canReach(xTarget, yTarget, zTarget, dd)) { - this->xd += xd / dd * 0.1; - this->yd += yd / dd * 0.1; - this->zd += zd / dd * 0.1; - } + this->xd += xd / dd * 0.1; + this->yd += yd / dd * 0.1; + this->zd += zd / dd * 0.1; + } else { - xTarget = x; - yTarget = y; - zTarget = z; - } - } + 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..77cb8152 --- /dev/null +++ b/Minecraft.World/HopperTileEntity.cpp @@ -0,0 +1,505 @@ +#include "stdafx.h" +#include "net.minecraft.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.item.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.tile.entity.h" +#include "net.minecraft.world.phys.h" +#include "net.minecraft.world.h" +#include "HopperTileEntity.h" + +HopperTileEntity::HopperTileEntity() +{ + items = ItemInstanceArray(5); + name = L""; + cooldownTime = -1; +} + +HopperTileEntity::~HopperTileEntity() +{ + delete [] items.data; +} + +void HopperTileEntity::load(CompoundTag *base) +{ + TileEntity::load(base); + + ListTag *inventoryList = (ListTag *) base->getList(L"Items"); + delete[] items.data; + items = ItemInstanceArray(getContainerSize()); + if (base->contains(L"CustomName")) name = base->getString(L"CustomName"); + cooldownTime = base->getInt(L"TransferCooldown"); + for (int i = 0; i < inventoryList->size(); i++) + { + CompoundTag *tag = inventoryList->get(i); + int slot = tag->getByte(L"Slot"); + if (slot >= 0 && slot < items.length) items[slot] = ItemInstance::fromTag(tag); + } +} + +void HopperTileEntity::save(CompoundTag *base) +{ + TileEntity::save(base); + ListTag *listTag = new ListTag(); + + for (int i = 0; i < items.length; i++) + { + if (items[i] != NULL) + { + CompoundTag *tag = new CompoundTag(); + tag->putByte(L"Slot", (byte) i); + items[i]->save(tag); + listTag->add(tag); + } + } + base->put(L"Items", listTag); + base->putInt(L"TransferCooldown", cooldownTime); + if (hasCustomName()) base->putString(L"CustomName", name); +} + +void HopperTileEntity::setChanged() +{ + TileEntity::setChanged(); +} + +unsigned int HopperTileEntity::getContainerSize() +{ + return items.length; +} + +shared_ptr HopperTileEntity::getItem(unsigned int slot) +{ + return items[slot]; +} + +shared_ptr HopperTileEntity::removeItem(unsigned int slot, int count) +{ + if (items[slot] != NULL) + { + if (items[slot]->count <= count) + { + shared_ptr item = items[slot]; + items[slot] = nullptr; + return item; + } + else + { + shared_ptr i = items[slot]->remove(count); + if (items[slot]->count == 0) items[slot] = nullptr; + return i; + } + } + return nullptr; +} + +shared_ptr HopperTileEntity::removeItemNoUpdate(int slot) +{ + if (items[slot] != NULL) + { + shared_ptr item = items[slot]; + items[slot] = nullptr; + return item; + } + return nullptr; +} + +void HopperTileEntity::setItem(unsigned int slot, shared_ptr item) +{ + items[slot] = item; + if (item != NULL && item->count > getMaxStackSize()) item->count = getMaxStackSize(); +} + +wstring HopperTileEntity::getName() +{ + return hasCustomName() ? name : app.GetString(IDS_CONTAINER_HOPPER); +} + +wstring HopperTileEntity::getCustomName() +{ + return hasCustomName() ? name : L""; +} + +bool HopperTileEntity::hasCustomName() +{ + return !name.empty(); +} + +void HopperTileEntity::setCustomName(const wstring &name) +{ + this->name = name; +} + +int HopperTileEntity::getMaxStackSize() +{ + return Container::LARGE_MAX_STACK_SIZE; +} + +bool HopperTileEntity::stillValid(shared_ptr player) +{ + if (level->getTileEntity(x, y, z) != shared_from_this()) return false; + if (player->distanceToSqr(x + 0.5, y + 0.5, z + 0.5) > 8 * 8) return false; + return true; +} + +void HopperTileEntity::startOpen() +{ +} + +void HopperTileEntity::stopOpen() +{ +} + +bool HopperTileEntity::canPlaceItem(int slot, shared_ptr item) +{ + return true; +} + +void HopperTileEntity::tick() +{ + if (level == NULL || level->isClientSide) return; + + cooldownTime--; + + if (!isOnCooldown()) + { + setCooldown(0); + tryMoveItems(); + } +} + +bool HopperTileEntity::tryMoveItems() +{ + if (level == NULL || level->isClientSide) return false; + + if (!isOnCooldown() && HopperTile::isTurnedOn(getData())) + { + bool changed = ejectItems(); + changed = suckInItems(this) || changed; + + if (changed) + { + setCooldown(MOVE_ITEM_SPEED); + setChanged(); + return true; + } + } + + return false; +} + +bool HopperTileEntity::ejectItems() +{ + shared_ptr container = getAttachedContainer(); + if (container == NULL) + { + return false; + } + + for (int slot = 0; slot < getContainerSize(); slot++) + { + if (getItem(slot) == NULL) continue; + + shared_ptr original = getItem(slot)->copy(); + shared_ptr result = addItem(container.get(), removeItem(slot, 1), Facing::OPPOSITE_FACING[HopperTile::getAttachedFace(getData())]); + + if (result == NULL || result->count == 0) + { + container->setChanged(); + return true; + } + else + { + setItem(slot, original); + } + } + + return false; +} + +bool HopperTileEntity::suckInItems(Hopper *hopper) +{ + shared_ptr container = getSourceContainer(hopper); + + if (container != NULL) + { + int face = Facing::DOWN; + + shared_ptr worldly = dynamic_pointer_cast(container); + if ( (worldly != NULL) && (face > -1) ) + { + intArray slots = worldly->getSlotsForFace(face); + + for (int i = 0; i < slots.length; i++) + { + if (tryTakeInItemFromSlot(hopper, container.get(), slots[i], face)) return true; + } + } + else + { + int size = container->getContainerSize(); + for (int i = 0; i < size; i++) + { + if (tryTakeInItemFromSlot(hopper, container.get(), i, face)) return true; + } + } + } + else + { + shared_ptr above = getItemAt(hopper->getLevel(), hopper->getLevelX(), hopper->getLevelY() + 1, hopper->getLevelZ()); + + if (above != NULL) + { + return addItem(hopper, above); + } + } + + return false; +} + +bool HopperTileEntity::tryTakeInItemFromSlot(Hopper *hopper, Container *container, int slot, int face) +{ + shared_ptr item = container->getItem(slot); + + if (item != NULL && canTakeItemFromContainer(container, item, slot, face)) + { + shared_ptr original = item->copy(); + shared_ptr result = addItem(hopper, container->removeItem(slot, 1), -1); + + if (result == NULL || result->count == 0) + { + container->setChanged(); + return true; + } + else + { + container->setItem(slot, original); + } + } + + return false; +} + +bool HopperTileEntity::addItem(Container *container, shared_ptr item) +{ + bool changed = false; + if (item == NULL) return false; + + shared_ptr copy = item->getItem()->copy(); + shared_ptr result = addItem(container, copy, -1); + + if (result == NULL || result->count == 0) + { + changed = true; + + item->remove(); + } + else + { + item->setItem(result); + } + + return changed; +} + +shared_ptr HopperTileEntity::addItem(Container *container, shared_ptr item, int face) +{ + if (dynamic_cast( container ) != NULL && face > -1) + { + WorldlyContainer *worldly = (WorldlyContainer *) container; + intArray slots = worldly->getSlotsForFace(face); + + for (int i = 0; i < slots.length && item != NULL && item->count > 0; i++) + { + item = tryMoveInItem(container, item, slots[i], face); + } + } + else + { + int size = container->getContainerSize(); + for (int i = 0; i < size && item != NULL && item->count > 0; i++) + { + item = tryMoveInItem(container, item, i, face); + } + } + + if (item != NULL && item->count == 0) + { + item = nullptr; + } + + return item; +} + +bool HopperTileEntity::canPlaceItemInContainer(Container *container, shared_ptr item, int slot, int face) +{ + if (!container->canPlaceItem(slot, item)) return false; + if ( dynamic_cast( container ) != NULL && !dynamic_cast( container )->canPlaceItemThroughFace(slot, item, face)) return false; + return true; +} + +bool HopperTileEntity::canTakeItemFromContainer(Container *container, shared_ptr item, int slot, int face) +{ + if (dynamic_cast( container ) != NULL && !dynamic_cast( container )->canTakeItemThroughFace(slot, item, face)) return false; + return true; +} + +shared_ptr HopperTileEntity::tryMoveInItem(Container *container, shared_ptr item, int slot, int face) +{ + shared_ptr current = container->getItem(slot); + + if (canPlaceItemInContainer(container, item, slot, face)) + { + bool success = false; + if (current == NULL) + { + container->setItem(slot, item); + item = nullptr; + success = true; + } + else if (canMergeItems(current, item)) + { + int space = item->getMaxStackSize() - current->count; + int count = min(item->count, space); + + item->count -= count; + current->count += count; + success = count > 0; + } + if (success) + { + HopperTileEntity *hopper = dynamic_cast(container); + if (hopper != NULL) + { + hopper->setCooldown(MOVE_ITEM_SPEED); + container->setChanged(); + } + container->setChanged(); + } + } + return item; +} + +shared_ptr HopperTileEntity::getAttachedContainer() +{ + int face = HopperTile::getAttachedFace(getData()); + return getContainerAt(getLevel(), x + Facing::STEP_X[face], y + Facing::STEP_Y[face], z + Facing::STEP_Z[face]); +} + +shared_ptr HopperTileEntity::getSourceContainer(Hopper *hopper) +{ + return getContainerAt(hopper->getLevel(), hopper->getLevelX(), hopper->getLevelY() + 1, hopper->getLevelZ()); +} + +shared_ptr HopperTileEntity::getItemAt(Level *level, double xt, double yt, double zt) +{ + vector > *entities = level->getEntitiesOfClass(typeid(ItemEntity), AABB::newTemp(xt, yt, zt, xt + 1, yt + 1, zt + 1), EntitySelector::ENTITY_STILL_ALIVE); + + if (entities->size() > 0) + { + shared_ptr out = dynamic_pointer_cast( entities->at(0) ); + delete entities; + return out; + } + else + { + delete entities; + return nullptr; + } +} + +shared_ptr HopperTileEntity::getContainerAt(Level *level, double x, double y, double z) +{ + shared_ptr result = nullptr; + + int xt = Mth::floor(x); + int yt = Mth::floor(y); + int zt = Mth::floor(z); + + shared_ptr entity = level->getTileEntity(xt, yt, zt); + + result = dynamic_pointer_cast(entity); + if (result != NULL) + { + if ( dynamic_pointer_cast(result) != NULL ) + { + int id = level->getTile(xt, yt, zt); + Tile *tile = Tile::tiles[id]; + + if ( dynamic_cast( tile ) != NULL ) + { + result = ((ChestTile *) tile)->getContainer(level, xt, yt, zt); + } + } + } + + if (result == NULL) + { + vector > *entities = level->getEntities(nullptr, AABB::newTemp(x, y, z, x + 1, y + 1, z + 1), EntitySelector::CONTAINER_ENTITY_SELECTOR); + + if ( (entities != NULL) && (entities->size() > 0) ) + { + result = dynamic_pointer_cast( entities->at( level->random->nextInt(entities->size()) ) ); + } + } + + return result; +} + +bool HopperTileEntity::canMergeItems(shared_ptr a, shared_ptr b) +{ + if (a->id != b->id) return false; + if (a->getAuxValue() != b->getAuxValue()) return false; + if (a->count > a->getMaxStackSize()) return false; + if (!ItemInstance::tagMatches(a, b)) return false; + return true; +} + +Level *HopperTileEntity::getLevel() +{ + return TileEntity::getLevel(); +} + +double HopperTileEntity::getLevelX() +{ + return x; +} + +double HopperTileEntity::getLevelY() +{ + return y; +} + +double HopperTileEntity::getLevelZ() +{ + return z; +} + +void HopperTileEntity::setCooldown(int time) +{ + cooldownTime = time; +} + +bool HopperTileEntity::isOnCooldown() +{ + return cooldownTime > 0; +} + +// 4J Added +shared_ptr HopperTileEntity::clone() +{ + shared_ptr result = shared_ptr( new HopperTileEntity() ); + TileEntity::clone(result); + + result->name = name; + result->cooldownTime = cooldownTime; + for (unsigned int i = 0; i < items.length; i++) + { + if (items[i] != NULL) + { + result->items[i] = ItemInstance::clone(items[i]); + } + } + return result; +} \ No newline at end of file diff --git a/Minecraft.World/HopperTileEntity.h b/Minecraft.World/HopperTileEntity.h new file mode 100644 index 00000000..2e84ffdb --- /dev/null +++ b/Minecraft.World/HopperTileEntity.h @@ -0,0 +1,80 @@ +#pragma once + +#include "TileEntity.h" +#include "Hopper.h" + +class HopperTileEntity : public TileEntity, public Hopper +{ +public: + eINSTANCEOF GetType() { return eTYPE_HOPPERTILEENTITY; } + static TileEntity *create() { return new HopperTileEntity(); } + // 4J Added + virtual shared_ptr clone(); + +public: + static const int MOVE_ITEM_SPEED = 8; + +private: + ItemInstanceArray items; + wstring name; + int cooldownTime ; + +public: + HopperTileEntity(); + ~HopperTileEntity(); + + virtual void load(CompoundTag *base); + virtual void save(CompoundTag *base); + virtual void setChanged(); + virtual unsigned int getContainerSize(); + virtual shared_ptr getItem(unsigned int slot); + virtual shared_ptr removeItem(unsigned int slot, int count); + virtual shared_ptr removeItemNoUpdate(int slot); + virtual void setItem(unsigned int slot, shared_ptr item); + virtual wstring getName(); + virtual wstring getCustomName(); + virtual bool hasCustomName(); + virtual void setCustomName(const wstring &name); + virtual int getMaxStackSize(); + virtual bool stillValid(shared_ptr player); + virtual void startOpen(); + virtual void stopOpen(); + virtual bool canPlaceItem(int slot, shared_ptr item); + virtual void tick(); + virtual bool tryMoveItems(); + +private: + virtual bool ejectItems(); + +public: + static bool suckInItems(Hopper *hopper); + +private: + static bool tryTakeInItemFromSlot(Hopper *hopper, Container *container, int slot, int face); + +public: + static bool addItem(Container *container, shared_ptr item); + static shared_ptr addItem(Container *container, shared_ptr item, int face); + +private: + static bool canPlaceItemInContainer(Container *container, shared_ptr item, int slot, int face); + static bool canTakeItemFromContainer(Container *container, shared_ptr item, int slot, int face); + static shared_ptr tryMoveInItem(Container *container, shared_ptr item, int slot, int face); + virtual shared_ptr getAttachedContainer(); + +public: + static shared_ptr getSourceContainer(Hopper *hopper); + static shared_ptr getItemAt(Level *level, double xt, double yt, double zt); + static shared_ptr getContainerAt(Level *level, double x, double y, double z); + +private: + static bool canMergeItems(shared_ptr a, shared_ptr b); + +public: + virtual Level *getLevel(); + virtual double getLevelX(); + virtual double getLevelY(); + virtual double getLevelZ(); + virtual void setCooldown(int time); + virtual bool isOnCooldown(); +}; \ No newline at end of file diff --git a/Minecraft.World/HorseInventoryMenu.cpp b/Minecraft.World/HorseInventoryMenu.cpp new file mode 100644 index 00000000..7dba791f --- /dev/null +++ b/Minecraft.World/HorseInventoryMenu.cpp @@ -0,0 +1,132 @@ +#include "stdafx.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.entity.animal.h" +#include "HorseInventoryMenu.h" + +HorseSaddleSlot::HorseSaddleSlot( shared_ptr horseInventory ) : Slot(horseInventory, EntityHorse::INV_SLOT_SADDLE, 8, 18) +{ +} + +bool HorseSaddleSlot::mayPlace(shared_ptr item) +{ + return Slot::mayPlace(item) && item->id == Item::saddle_Id && !hasItem(); +} + + +HorseArmorSlot::HorseArmorSlot( HorseInventoryMenu *parent, shared_ptr horseInventory ) : Slot(horseInventory, EntityHorse::INV_SLOT_ARMOR, 8, 18 * 2) +{ + m_parent = parent; +} + +bool HorseArmorSlot::mayPlace(shared_ptr item) +{ + return Slot::mayPlace(item) && m_parent->horse->canWearArmor() && EntityHorse::isHorseArmor(item->id); +} + +bool HorseArmorSlot::isActive() +{ + return m_parent->horse->canWearArmor(); +} + + +HorseInventoryMenu::HorseInventoryMenu(shared_ptr playerInventory, shared_ptr horseInventory, shared_ptr horse) +{ + horseContainer = horseInventory; + this->horse = horse; + int containerRows = 3; + horseInventory->startOpen(); + + int yo = (containerRows - 4) * 18; + + // equipment slots + addSlot(new HorseSaddleSlot(horseInventory) ); + addSlot(new HorseArmorSlot(this, horseInventory) ); + + if (horse->isChestedHorse()) + { + for (int y = 0; y < containerRows; y++) + { + for (int x = 0; x < 5; x++) + { + addSlot(new Slot(horseInventory, EntityHorse::INV_BASE_COUNT + x + y * 5, 80 + x * 18, 18 + y * 18)); + } + } + } + + for (int y = 0; y < 3; y++) + { + for (int x = 0; x < 9; x++) + { + addSlot(new Slot(playerInventory, x + y * 9 + 9, 8 + x * 18, 102 + y * 18 + yo)); + } + } + for (int x = 0; x < 9; x++) + { + addSlot(new Slot(playerInventory, x, 8 + x * 18, 160 + yo)); + } +} + +bool HorseInventoryMenu::stillValid(shared_ptr player) +{ + return horseContainer->stillValid(player) && horse->isAlive() && horse->distanceTo(player) < 8; +} + +shared_ptr HorseInventoryMenu::quickMoveStack(shared_ptr player, int slotIndex) +{ + shared_ptr clicked = nullptr; + Slot *slot = slots.at(slotIndex); + if (slot != NULL && slot->hasItem()) + { + shared_ptr stack = slot->getItem(); + clicked = stack->copy(); + + if (slotIndex < horseContainer->getContainerSize()) + { + if (!moveItemStackTo(stack, horseContainer->getContainerSize(), slots.size(), true)) + { + return nullptr; + } + } + else + { + if (getSlot(EntityHorse::INV_SLOT_ARMOR)->mayPlace(stack) && !getSlot(EntityHorse::INV_SLOT_ARMOR)->hasItem()) + { + if (!moveItemStackTo(stack, EntityHorse::INV_SLOT_ARMOR, EntityHorse::INV_SLOT_ARMOR + 1, false)) + { + return nullptr; + } + } + else if (getSlot(EntityHorse::INV_SLOT_SADDLE)->mayPlace(stack)) + { + if (!moveItemStackTo(stack, EntityHorse::INV_SLOT_SADDLE, EntityHorse::INV_SLOT_SADDLE + 1, false)) + { + return nullptr; + } + } + else if (horseContainer->getContainerSize() <= EntityHorse::INV_BASE_COUNT || !moveItemStackTo(stack, EntityHorse::INV_BASE_COUNT, horseContainer->getContainerSize(), false)) + { + return nullptr; + } + } + if (stack->count == 0) + { + slot->set(nullptr); + } + else + { + slot->setChanged(); + } + } + return clicked; +} + +void HorseInventoryMenu::removed(shared_ptr player) +{ + AbstractContainerMenu::removed(player); + horseContainer->stopOpen(); +} + +shared_ptr HorseInventoryMenu::getContainer() +{ + return horseContainer; +} \ No newline at end of file diff --git a/Minecraft.World/HorseInventoryMenu.h b/Minecraft.World/HorseInventoryMenu.h new file mode 100644 index 00000000..613c55f9 --- /dev/null +++ b/Minecraft.World/HorseInventoryMenu.h @@ -0,0 +1,41 @@ +#pragma once + +#include "AbstractContainerMenu.h" +#include "Slot.h" + +class HorseInventoryMenu; + +class HorseSaddleSlot : public Slot +{ +public: + HorseSaddleSlot( shared_ptr horseInventory ); + + bool mayPlace(shared_ptr item); +}; + +class HorseArmorSlot : public Slot +{ +private: + HorseInventoryMenu *m_parent; +public: + HorseArmorSlot( HorseInventoryMenu *parent, shared_ptr horseInventory ); + + bool mayPlace(shared_ptr item); + bool isActive(); +}; + +class HorseInventoryMenu : public AbstractContainerMenu +{ + friend class HorseArmorSlot; +private: + shared_ptr horseContainer; + shared_ptr horse; + +public: + HorseInventoryMenu(shared_ptr playerInventory, shared_ptr horseInventory, shared_ptr horse); + + bool stillValid(shared_ptr player); + shared_ptr quickMoveStack(shared_ptr player, int slotIndex); + void removed(shared_ptr player); + shared_ptr getContainer(); +}; \ No newline at end of file diff --git a/Minecraft.World/HouseFeature.cpp b/Minecraft.World/HouseFeature.cpp index f8c5d173..40b4e770 100644 --- a/Minecraft.World/HouseFeature.cpp +++ b/Minecraft.World/HouseFeature.cpp @@ -7,187 +7,188 @@ bool HouseFeature::place(Level *level, Random *random, int x, int y, int z) { - while (y > 0 && !level->getMaterial(x, y - 1, z)->blocksMotion()) - y--; + while (y > 0 && !level->getMaterial(x, y - 1, z)->blocksMotion()) + y--; int w = random->nextInt(7) + 7; int h = 4 + random->nextInt(3) / 2; int d = random->nextInt(7) + 7; - int x0 = x - w / 2; - int y0 = y; - int z0 = z - d / 2; + int x0 = x - w / 2; + int y0 = y; + int z0 = z - d / 2; - int doorSide = random->nextInt(4); - if (doorSide < 2) d += 2; - else w += 2; + int doorSide = random->nextInt(4); + if (doorSide < 2) d += 2; + else w += 2; - for (int xx = x0; xx < x0 + w; xx++) + for (int xx = x0; xx < x0 + w; xx++) { - for (int zz = z0; zz < z0 + d; zz++) + for (int zz = z0; zz < z0 + d; zz++) { - Material *m = level->getMaterial(xx, y - 1, zz); - if (!m->blocksMotion() || m == Material::ice) return false; + 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/IceTile.cpp b/Minecraft.World/IceTile.cpp index 6ca9cc80..938c098f 100644 --- a/Minecraft.World/IceTile.cpp +++ b/Minecraft.World/IceTile.cpp @@ -27,7 +27,7 @@ void IceTile::playerDestroy(Level *level, shared_ptr player, int x, int player->awardStat(GenericStats::blocksMined(id), GenericStats::param_blocksMined(id,data,1) ); player->causeFoodExhaustion(FoodConstants::EXHAUSTION_MINE); - if (isSilkTouchable() && EnchantmentHelper::hasSilkTouch(player->inventory)) + if (isSilkTouchable() && EnchantmentHelper::hasSilkTouch(player)) { shared_ptr item = getSilkTouchItemInstance(data); if (item != NULL) @@ -39,16 +39,16 @@ void IceTile::playerDestroy(Level *level, shared_ptr player, int x, int { if (level->dimension->ultraWarm) { - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); return; } - int playerBonusLevel = EnchantmentHelper::getDiggingLootBonus(player->inventory); + int playerBonusLevel = EnchantmentHelper::getDiggingLootBonus(player); spawnResources(level, x, y, z, data, playerBonusLevel); Material *below = level->getMaterial(x, y - 1, z); if (below->blocksMotion() || below->isLiquid()) { - level->setTile(x, y, z, Tile::water_Id); + level->setTileAndUpdate(x, y, z, Tile::water_Id); } } } @@ -64,11 +64,11 @@ void IceTile::tick(Level *level, int x, int y, int z, Random *random) { if (level->dimension->ultraWarm) { - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); return; } this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, Tile::calmWater_Id); + level->setTileAndUpdate(x, y, z, Tile::calmWater_Id); } } diff --git a/Minecraft.World/IndirectEntityDamageSource.cpp b/Minecraft.World/IndirectEntityDamageSource.cpp index 01c54ed6..c2a67af5 100644 --- a/Minecraft.World/IndirectEntityDamageSource.cpp +++ b/Minecraft.World/IndirectEntityDamageSource.cpp @@ -5,7 +5,7 @@ #include "net.minecraft.network.packet.h" //IndirectEntityDamageSource::IndirectEntityDamageSource(const wstring &msgId, shared_ptr entity, shared_ptr owner) : EntityDamageSource(msgId, entity) -IndirectEntityDamageSource::IndirectEntityDamageSource(ChatPacket::EChatPacketMessage msgId, shared_ptr entity, shared_ptr owner) : EntityDamageSource(msgId, entity) +IndirectEntityDamageSource::IndirectEntityDamageSource(ChatPacket::EChatPacketMessage msgId, ChatPacket::EChatPacketMessage msgWithItemId, shared_ptr entity, shared_ptr owner) : EntityDamageSource(msgId, msgWithItemId, entity) { this->owner = owner; } @@ -27,8 +27,9 @@ shared_ptr IndirectEntityDamageSource::getEntity() // //return I18n.get("death." + msgId, player.name, owner.getAName()); //} -shared_ptr IndirectEntityDamageSource::getDeathMessagePacket(shared_ptr player) +shared_ptr IndirectEntityDamageSource::getDeathMessagePacket(shared_ptr player) { + shared_ptr held = entity->instanceof(eTYPE_LIVINGENTITY) ? dynamic_pointer_cast(entity)->getCarriedItem() : nullptr; wstring additional = L""; int type; if(owner != NULL) @@ -44,5 +45,18 @@ shared_ptr IndirectEntityDamageSource::getDeathMessagePacket(shared_ { type = entity->GetType(); } - return shared_ptr( new ChatPacket(player->name, m_msgId, type, additional ) ); + if(held != NULL && held->hasCustomHoverName() ) + { + return shared_ptr( new ChatPacket(player->getNetworkName(), m_msgWithItemId, type, additional, held->getHoverName() ) ); + } + else + { + return shared_ptr( new ChatPacket(player->getNetworkName(), m_msgId, type, additional ) ); + } +} + +// 4J: Copy function +DamageSource *IndirectEntityDamageSource::copy() +{ + return new IndirectEntityDamageSource(*this); } \ No newline at end of file diff --git a/Minecraft.World/IndirectEntityDamageSource.h b/Minecraft.World/IndirectEntityDamageSource.h index b7aec18c..5ec397c3 100644 --- a/Minecraft.World/IndirectEntityDamageSource.h +++ b/Minecraft.World/IndirectEntityDamageSource.h @@ -13,7 +13,7 @@ private: public: //IndirectEntityDamageSource(const wstring &msgId, shared_ptr entity, shared_ptr owner); - IndirectEntityDamageSource(ChatPacket::EChatPacketMessage msgId, shared_ptr entity, shared_ptr owner); + IndirectEntityDamageSource(ChatPacket::EChatPacketMessage msgId, ChatPacket::EChatPacketMessage msgWithItemId, shared_ptr entity, shared_ptr owner); virtual ~IndirectEntityDamageSource() { } virtual shared_ptr getDirectEntity(); // 4J Stu - Brought forward from 1.2.3 to fix #46422 @@ -21,5 +21,7 @@ public: // 4J Stu - Made return a packet //virtual wstring getLocalizedDeathMessage(shared_ptr player); - virtual shared_ptr getDeathMessagePacket(shared_ptr player); + virtual shared_ptr getDeathMessagePacket(shared_ptr player); + + virtual DamageSource *copy(); }; \ No newline at end of file diff --git a/Minecraft.World/InputStream.cpp b/Minecraft.World/InputStream.cpp index dbec82cc..e325db8a 100644 --- a/Minecraft.World/InputStream.cpp +++ b/Minecraft.World/InputStream.cpp @@ -5,5 +5,7 @@ InputStream *InputStream::getResourceAsStream(const wstring &fileName) { - return new FileInputStream( File( fileName ) ); + File file( fileName ); + + return file.exists() ? new FileInputStream( file ) : NULL; } \ No newline at end of file diff --git a/Minecraft.World/IntArrayTag.h b/Minecraft.World/IntArrayTag.h index 58339bf6..48f4ce74 100644 --- a/Minecraft.World/IntArrayTag.h +++ b/Minecraft.World/IntArrayTag.h @@ -10,6 +10,7 @@ public: IntArrayTag(const wstring &name) : Tag(name) { + data = intArray(); } IntArrayTag(const wstring &name, intArray data) : Tag(name) @@ -17,6 +18,11 @@ public: this->data = data; } + ~IntArrayTag() + { + delete [] data.data; + } + void write(DataOutput *dos) { dos->writeInt(data.length); @@ -26,7 +32,7 @@ public: } } - void load(DataInput *dis) + void load(DataInput *dis, int tagDepth) { int length = dis->readInt(); @@ -52,7 +58,7 @@ public: if (Tag::equals(obj)) { IntArrayTag *o = (IntArrayTag *) obj; - return ((data.data == NULL && o->data.data == NULL) || (data.data != NULL && data.length == o->data.length && memcmp(data.data, o->data.data, data.length) == 0) ); + return ((data.data == NULL && o->data.data == NULL) || (data.data != NULL && data.length == o->data.length && memcmp(data.data, o->data.data, data.length * sizeof(int)) == 0) ); } return false; } diff --git a/Minecraft.World/IntTag.h b/Minecraft.World/IntTag.h index f4d30818..cce87da3 100644 --- a/Minecraft.World/IntTag.h +++ b/Minecraft.World/IntTag.h @@ -9,7 +9,7 @@ public: IntTag(const wstring &name, int data) : Tag(name) {this->data = data; } void write(DataOutput *dos) { dos->writeInt(data); } - void load(DataInput *dis) { data = dis->readInt(); } + void load(DataInput *dis, int tagDepth) { data = dis->readInt(); } byte getId() { return TAG_Int; } wstring toString() diff --git a/Minecraft.World/Inventory.cpp b/Minecraft.World/Inventory.cpp index 8ef3f085..f6a136c9 100644 --- a/Minecraft.World/Inventory.cpp +++ b/Minecraft.World/Inventory.cpp @@ -154,35 +154,63 @@ void Inventory::swapPaint(int wheel) selected -= 9; } -void Inventory::clearInventory() +int Inventory::clearInventory(int id, int data) { - for (unsigned int i = 0; i < items.length; i++) + int count = 0; + for (int i = 0; i < items.length; i++) { + shared_ptr item = items[i]; + if (item == NULL) continue; + if (id > -1 && item->id != id) continue; + if (data > -1 && item->getAuxValue() != data) continue; + + count += item->count; items[i] = nullptr; } - for (unsigned int i = 0; i < armor.length; i++) + for (int i = 0; i < armor.length; i++) { + shared_ptr item = armor[i]; + if (item == NULL) continue; + if (id > -1 && item->id != id) continue; + if (data > -1 && item->getAuxValue() != data) continue; + + count += item->count; armor[i] = nullptr; } + + if (carried != NULL) + { + if (id > -1 && carried->id != id) return count; + if (data > -1 && carried->getAuxValue() != data) return count; + + count += carried->count; + setCarried(nullptr); + } + + return count; } void Inventory::replaceSlot(Item *item, int data) { if (item != NULL) { - 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)); + } } } @@ -324,8 +352,8 @@ void Inventory::swapSlots(int from, int to) bool Inventory::add(shared_ptr item) { - // 4J Stu - Fix for duplication glitch - if(item->count <= 0) return true; + if (item == NULL) return false; + if (item->count == 0) return false; if (!item->isDamaged()) { @@ -364,7 +392,7 @@ bool Inventory::add(shared_ptr item) GenericStats::param_itemsCollected(item->id, item->getAuxValue(), item->GetCount())); items[slot] = ItemInstance::clone(item); - items[slot]->popTime = Inventory::POP_TIME_DURATION; + items[slot]->popTime = POP_TIME_DURATION; item->count = 0; return true; } @@ -549,9 +577,19 @@ shared_ptr Inventory::getItem(unsigned int slot) */ } -int Inventory::getName() +wstring Inventory::getName() { - return IDS_INVENTORY; + return app.GetString(IDS_INVENTORY); +} + +wstring Inventory::getCustomName() +{ + return L""; +} + +bool Inventory::hasCustomName() +{ + return false; } int Inventory::getMaxStackSize() @@ -559,13 +597,6 @@ int Inventory::getMaxStackSize() 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..5c49e904 100644 --- a/Minecraft.World/Inventory.h +++ b/Minecraft.World/Inventory.h @@ -37,7 +37,6 @@ public: shared_ptr getSelected(); // 4J-PB - Added for the in-game tooltips bool IsHeldItem(); - static int getSelectionSize(); private: @@ -45,16 +44,12 @@ private: int getSlot(int tileId, int data); int getSlotWithRemainingSpace(shared_ptr item); - + public: int getFreeSlot(); - void grabTexture(int id, int data, bool checkData, bool mayReplace); - void swapPaint(int wheel); - - void clearInventory(); - + int clearInventory(int id, int data); void replaceSlot(Item *item, int data); private: @@ -62,56 +57,37 @@ private: public: void tick(); - bool removeResource(int type); // 4J-PB added to get the right resource from the inventory for removal bool removeResource(int type,int iAuxVal); void removeResources(shared_ptr item); // 4J Added for trading - + // 4J-Stu added to the get the item that would be affected by the removeResource functions shared_ptr getResourceItem(int type); shared_ptr getResourceItem(int type,int iAuxVal); bool hasResource(int type); - void swapSlots(int from, int to); - bool add(shared_ptr item); - shared_ptr removeItem(unsigned int slot, int count); virtual shared_ptr removeItemNoUpdate(int slot); - void setItem(unsigned int slot, shared_ptr item); - float getDestroySpeed(Tile *tile); - ListTag *save(ListTag *listTag); - void load(ListTag *inventoryList); - unsigned int getContainerSize(); - shared_ptr getItem(unsigned int slot); - - int getName(); - + wstring getName(); + wstring getCustomName(); + bool hasCustomName(); int getMaxStackSize(); - - int getAttackDamage(shared_ptr entity); - bool canDestroy(Tile *tile); - shared_ptr getArmor(int layer); - int getArmorValue(); - - void hurtArmor(int dmg); - + void hurtArmor(float dmg); void dropAll(); - void setChanged(); - bool isSame(shared_ptr copy); private: @@ -119,17 +95,13 @@ private: public: shared_ptr copy(); - void setCarried(shared_ptr carried); - shared_ptr getCarried(); - bool stillValid(shared_ptr player); - bool contains(shared_ptr itemInstance); - virtual void startOpen(); virtual void stopOpen(); + bool canPlaceItem(int slot, shared_ptr item); void replaceWith(shared_ptr other); int countMatches(shared_ptr itemInstance); // 4J Added diff --git a/Minecraft.World/InventoryMenu.cpp b/Minecraft.World/InventoryMenu.cpp index 979243c1..ae5d9269 100644 --- a/Minecraft.World/InventoryMenu.cpp +++ b/Minecraft.World/InventoryMenu.cpp @@ -94,12 +94,12 @@ bool InventoryMenu::stillValid(shared_ptr player) shared_ptr InventoryMenu::quickMoveStack(shared_ptr player, int slotIndex) { shared_ptr clicked = nullptr; - Slot *slot = slots->at(slotIndex); + Slot *slot = slots.at(slotIndex); - Slot *HelmetSlot = slots->at(ARMOR_SLOT_START); - Slot *ChestplateSlot = slots->at(ARMOR_SLOT_START+1); - Slot *LeggingsSlot = slots->at(ARMOR_SLOT_START+2); - Slot *BootsSlot = slots->at(ARMOR_SLOT_START+3); + Slot *HelmetSlot = slots.at(ARMOR_SLOT_START); + Slot *ChestplateSlot = slots.at(ARMOR_SLOT_START+1); + Slot *LeggingsSlot = slots.at(ARMOR_SLOT_START+2); + Slot *BootsSlot = slots.at(ARMOR_SLOT_START+3); if (slot != NULL && slot->hasItem()) @@ -225,16 +225,21 @@ bool InventoryMenu::mayCombine(Slot *slot, shared_ptr item) return slot->mayCombine(item); } -// 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..35768ac1 100644 --- a/Minecraft.World/Item.cpp +++ b/Minecraft.World/Item.cpp @@ -14,9 +14,12 @@ #include "MapItem.h" #include "Item.h" #include "HangingEntityItem.h" +#include "HtmlString.h" typedef Item::Tier _Tier; +//const UUID Item::BASE_ATTACK_DAMAGE_UUID = UUID::fromString(L"CB3F55D3-645C-4F38-A497-9C13A33DB5CF"); + wstring Item::ICON_DESCRIPTION_PREFIX = L"item."; const _Tier *_Tier::WOOD = new _Tier(0, 59, 2, 0, 15); // @@ -68,7 +71,7 @@ Item *Item::hatchet_gold = NULL; Item *Item::string = NULL; Item *Item::feather = NULL; -Item *Item::sulphur = NULL; +Item *Item::gunpowder = NULL; Item *Item::hoe_wood = NULL; Item *Item::hoe_stone = NULL; @@ -80,10 +83,10 @@ Item *Item::seeds_wheat = NULL; Item *Item::wheat = NULL; Item *Item::bread = NULL; -ArmorItem *Item::helmet_cloth = NULL; -ArmorItem *Item::chestplate_cloth = NULL; -ArmorItem *Item::leggings_cloth = NULL; -ArmorItem *Item::boots_cloth = NULL; +ArmorItem *Item::helmet_leather = NULL; +ArmorItem *Item::chestplate_leather = NULL; +ArmorItem *Item::leggings_leather = NULL; +ArmorItem *Item::boots_leather = NULL; ArmorItem *Item::helmet_chain = NULL; ArmorItem *Item::chestplate_chain = NULL; @@ -128,7 +131,7 @@ Item *Item::snowBall = NULL; Item *Item::boat = NULL; Item *Item::leather = NULL; -Item *Item::milk = NULL; +Item *Item::bucket_milk = NULL; Item *Item::brick = NULL; Item *Item::clay = NULL; Item *Item::reeds = NULL; @@ -152,7 +155,7 @@ Item *Item::cake = NULL; Item *Item::bed = NULL; -Item *Item::diode = NULL; +Item *Item::repeater = NULL; Item *Item::cookie = NULL; MapItem *Item::map = NULL; @@ -188,7 +191,7 @@ Item *Item::enderPearl = NULL; Item *Item::blazeRod = NULL; Item *Item::ghastTear = NULL; Item *Item::goldNugget = NULL; -Item *Item::netherStalkSeeds = NULL; +Item *Item::netherwart_seeds = NULL; PotionItem *Item::potion = NULL; Item *Item::glassBottle = NULL; Item *Item::spiderEye = NULL; @@ -200,14 +203,13 @@ Item *Item::cauldron = NULL; Item *Item::eyeOfEnder = NULL; Item *Item::speckledMelon = NULL; -Item *Item::monsterPlacer = NULL; +Item *Item::spawnEgg = NULL; Item *Item::expBottle = NULL; // TU9 Item *Item::fireball = NULL; Item *Item::frame = NULL; -Item *Item::netherbrick = NULL; Item *Item::skull = NULL; @@ -225,247 +227,273 @@ Item *Item::potato = NULL; Item *Item::potatoBaked = NULL; Item *Item::potatoPoisonous = NULL; +EmptyMapItem *Item::emptyMap = NULL; + Item *Item::carrotGolden = NULL; Item *Item::carrotOnAStick = NULL; +Item *Item::netherStar = NULL; Item *Item::pumpkinPie = NULL; +Item *Item::fireworks = NULL; +Item *Item::fireworksCharge = NULL; EnchantedBookItem *Item::enchantedBook = NULL; + +Item *Item::comparator = NULL; +Item *Item::netherbrick = NULL; Item *Item::netherQuartz = NULL; +Item *Item::minecart_tnt = NULL; +Item *Item::minecart_hopper = NULL; + +Item *Item::horseArmorMetal = NULL; +Item *Item::horseArmorGold = NULL; +Item *Item::horseArmorDiamond = NULL; +Item *Item::lead = NULL; +Item *Item::nameTag = NULL; void Item::staticCtor() { + Item::sword_wood = ( new WeaponItem(12, _Tier::WOOD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_sword, eMaterial_wood) ->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::door_wood = ( new DoorItem(68, Material::wood) ) ->setBaseItemTypeAndMaterial(eBaseItemType_door, eMaterial_wood)->setTextureName(L"doorWood")->setDescriptionId(IDS_ITEM_DOOR_WOOD)->setUseDescriptionId(IDS_DESC_DOOR_WOOD); - Item::door_iron = ( new DoorItem(74, Material::metal) ) ->setBaseItemTypeAndMaterial(eBaseItemType_door, eMaterial_iron)->setTextureName(L"doorIron")->setDescriptionId(IDS_ITEM_DOOR_IRON)->setUseDescriptionId(IDS_DESC_DOOR_IRON); - - Item::helmet_cloth = (ArmorItem *) ( ( new ArmorItem(42, ArmorItem::ArmorMaterial::CLOTH, 0, ArmorItem::SLOT_HEAD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_helmet, eMaterial_cloth) ->setTextureName(L"helmetCloth")->setDescriptionId(IDS_ITEM_HELMET_CLOTH)->setUseDescriptionId(IDS_DESC_HELMET_LEATHER) ); - Item::helmet_iron = (ArmorItem *) ( ( new ArmorItem(50, ArmorItem::ArmorMaterial::IRON, 2, ArmorItem::SLOT_HEAD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_helmet, eMaterial_iron) ->setTextureName(L"helmetIron")->setDescriptionId(IDS_ITEM_HELMET_IRON)->setUseDescriptionId(IDS_DESC_HELMET_IRON) ); - Item::helmet_diamond = (ArmorItem *) ( ( new ArmorItem(54, ArmorItem::ArmorMaterial::DIAMOND, 3, ArmorItem::SLOT_HEAD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_helmet, eMaterial_diamond) ->setTextureName(L"helmetDiamond")->setDescriptionId(IDS_ITEM_HELMET_DIAMOND)->setUseDescriptionId(IDS_DESC_HELMET_DIAMOND) ); - Item::helmet_gold = (ArmorItem *) ( ( new ArmorItem(58, ArmorItem::ArmorMaterial::GOLD, 4, ArmorItem::SLOT_HEAD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_helmet, eMaterial_gold) ->setTextureName(L"helmetGold")->setDescriptionId(IDS_ITEM_HELMET_GOLD)->setUseDescriptionId(IDS_DESC_HELMET_GOLD) ); + Item::helmet_leather = (ArmorItem *) ( ( new ArmorItem(42, ArmorItem::ArmorMaterial::CLOTH, 0, ArmorItem::SLOT_HEAD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_helmet, eMaterial_cloth) ->setIconName(L"helmetCloth")->setDescriptionId(IDS_ITEM_HELMET_CLOTH)->setUseDescriptionId(IDS_DESC_HELMET_LEATHER) ); + Item::helmet_iron = (ArmorItem *) ( ( new ArmorItem(50, ArmorItem::ArmorMaterial::IRON, 2, ArmorItem::SLOT_HEAD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_helmet, eMaterial_iron) ->setIconName(L"helmetIron")->setDescriptionId(IDS_ITEM_HELMET_IRON)->setUseDescriptionId(IDS_DESC_HELMET_IRON) ); + Item::helmet_diamond = (ArmorItem *) ( ( new ArmorItem(54, ArmorItem::ArmorMaterial::DIAMOND, 3, ArmorItem::SLOT_HEAD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_helmet, eMaterial_diamond) ->setIconName(L"helmetDiamond")->setDescriptionId(IDS_ITEM_HELMET_DIAMOND)->setUseDescriptionId(IDS_DESC_HELMET_DIAMOND) ); + Item::helmet_gold = (ArmorItem *) ( ( new ArmorItem(58, ArmorItem::ArmorMaterial::GOLD, 4, ArmorItem::SLOT_HEAD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_helmet, eMaterial_gold) ->setIconName(L"helmetGold")->setDescriptionId(IDS_ITEM_HELMET_GOLD)->setUseDescriptionId(IDS_DESC_HELMET_GOLD) ); - Item::chestplate_cloth = (ArmorItem *) ( ( new ArmorItem(43, ArmorItem::ArmorMaterial::CLOTH, 0, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_cloth) ->setTextureName(L"chestplateCloth")->setDescriptionId(IDS_ITEM_CHESTPLATE_CLOTH)->setUseDescriptionId(IDS_DESC_CHESTPLATE_LEATHER) ); - Item::chestplate_iron = (ArmorItem *) ( ( new ArmorItem(51, ArmorItem::ArmorMaterial::IRON, 2, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_iron) ->setTextureName(L"chestplateIron")->setDescriptionId(IDS_ITEM_CHESTPLATE_IRON)->setUseDescriptionId(IDS_DESC_CHESTPLATE_IRON) ); - Item::chestplate_diamond = (ArmorItem *) ( ( new ArmorItem(55, ArmorItem::ArmorMaterial::DIAMOND, 3, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_diamond) ->setTextureName(L"chestplateDiamond")->setDescriptionId(IDS_ITEM_CHESTPLATE_DIAMOND)->setUseDescriptionId(IDS_DESC_CHESTPLATE_DIAMOND) ); - Item::chestplate_gold = (ArmorItem *) ( ( new ArmorItem(59, ArmorItem::ArmorMaterial::GOLD, 4, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_gold) ->setTextureName(L"chestplateGold")->setDescriptionId(IDS_ITEM_CHESTPLATE_GOLD)->setUseDescriptionId(IDS_DESC_CHESTPLATE_GOLD) ); + Item::chestplate_leather = (ArmorItem *) ( ( new ArmorItem(43, ArmorItem::ArmorMaterial::CLOTH, 0, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_cloth) ->setIconName(L"chestplateCloth")->setDescriptionId(IDS_ITEM_CHESTPLATE_CLOTH)->setUseDescriptionId(IDS_DESC_CHESTPLATE_LEATHER) ); + Item::chestplate_iron = (ArmorItem *) ( ( new ArmorItem(51, ArmorItem::ArmorMaterial::IRON, 2, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_iron) ->setIconName(L"chestplateIron")->setDescriptionId(IDS_ITEM_CHESTPLATE_IRON)->setUseDescriptionId(IDS_DESC_CHESTPLATE_IRON) ); + Item::chestplate_diamond = (ArmorItem *) ( ( new ArmorItem(55, ArmorItem::ArmorMaterial::DIAMOND, 3, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_diamond) ->setIconName(L"chestplateDiamond")->setDescriptionId(IDS_ITEM_CHESTPLATE_DIAMOND)->setUseDescriptionId(IDS_DESC_CHESTPLATE_DIAMOND) ); + Item::chestplate_gold = (ArmorItem *) ( ( new ArmorItem(59, ArmorItem::ArmorMaterial::GOLD, 4, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_gold) ->setIconName(L"chestplateGold")->setDescriptionId(IDS_ITEM_CHESTPLATE_GOLD)->setUseDescriptionId(IDS_DESC_CHESTPLATE_GOLD) ); - Item::leggings_cloth = (ArmorItem *) ( ( new ArmorItem(44, ArmorItem::ArmorMaterial::CLOTH, 0, ArmorItem::SLOT_LEGS) ) ->setBaseItemTypeAndMaterial(eBaseItemType_leggings, eMaterial_cloth) ->setTextureName(L"leggingsCloth")->setDescriptionId(IDS_ITEM_LEGGINGS_CLOTH)->setUseDescriptionId(IDS_DESC_LEGGINGS_LEATHER) ); - Item::leggings_iron = (ArmorItem *) ( ( new ArmorItem(52, ArmorItem::ArmorMaterial::IRON, 2, ArmorItem::SLOT_LEGS) ) ->setBaseItemTypeAndMaterial(eBaseItemType_leggings, eMaterial_iron) ->setTextureName(L"leggingsIron")->setDescriptionId(IDS_ITEM_LEGGINGS_IRON)->setUseDescriptionId(IDS_DESC_LEGGINGS_IRON) ); - Item::leggings_diamond = (ArmorItem *) ( ( new ArmorItem(56, ArmorItem::ArmorMaterial::DIAMOND, 3, ArmorItem::SLOT_LEGS) ) ->setBaseItemTypeAndMaterial(eBaseItemType_leggings, eMaterial_diamond) ->setTextureName(L"leggingsDiamond")->setDescriptionId(IDS_ITEM_LEGGINGS_DIAMOND)->setUseDescriptionId(IDS_DESC_LEGGINGS_DIAMOND) ); - Item::leggings_gold = (ArmorItem *) ( ( new ArmorItem(60, ArmorItem::ArmorMaterial::GOLD, 4, ArmorItem::SLOT_LEGS) ) ->setBaseItemTypeAndMaterial(eBaseItemType_leggings, eMaterial_gold) ->setTextureName(L"leggingsGold")->setDescriptionId(IDS_ITEM_LEGGINGS_GOLD)->setUseDescriptionId(IDS_DESC_LEGGINGS_GOLD) ); + Item::leggings_leather = (ArmorItem *) ( ( new ArmorItem(44, ArmorItem::ArmorMaterial::CLOTH, 0, ArmorItem::SLOT_LEGS) ) ->setBaseItemTypeAndMaterial(eBaseItemType_leggings, eMaterial_cloth) ->setIconName(L"leggingsCloth")->setDescriptionId(IDS_ITEM_LEGGINGS_CLOTH)->setUseDescriptionId(IDS_DESC_LEGGINGS_LEATHER) ); + Item::leggings_iron = (ArmorItem *) ( ( new ArmorItem(52, ArmorItem::ArmorMaterial::IRON, 2, ArmorItem::SLOT_LEGS) ) ->setBaseItemTypeAndMaterial(eBaseItemType_leggings, eMaterial_iron) ->setIconName(L"leggingsIron")->setDescriptionId(IDS_ITEM_LEGGINGS_IRON)->setUseDescriptionId(IDS_DESC_LEGGINGS_IRON) ); + Item::leggings_diamond = (ArmorItem *) ( ( new ArmorItem(56, ArmorItem::ArmorMaterial::DIAMOND, 3, ArmorItem::SLOT_LEGS) ) ->setBaseItemTypeAndMaterial(eBaseItemType_leggings, eMaterial_diamond) ->setIconName(L"leggingsDiamond")->setDescriptionId(IDS_ITEM_LEGGINGS_DIAMOND)->setUseDescriptionId(IDS_DESC_LEGGINGS_DIAMOND) ); + Item::leggings_gold = (ArmorItem *) ( ( new ArmorItem(60, ArmorItem::ArmorMaterial::GOLD, 4, ArmorItem::SLOT_LEGS) ) ->setBaseItemTypeAndMaterial(eBaseItemType_leggings, eMaterial_gold) ->setIconName(L"leggingsGold")->setDescriptionId(IDS_ITEM_LEGGINGS_GOLD)->setUseDescriptionId(IDS_DESC_LEGGINGS_GOLD) ); - Item::helmet_chain = (ArmorItem *) ( ( new ArmorItem(46, ArmorItem::ArmorMaterial::CHAIN, 1, ArmorItem::SLOT_HEAD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_helmet, eMaterial_chain) ->setTextureName(L"helmetChain")->setDescriptionId(IDS_ITEM_HELMET_CHAIN)->setUseDescriptionId(IDS_DESC_HELMET_CHAIN) ); - Item::chestplate_chain = (ArmorItem *) ( ( new ArmorItem(47, ArmorItem::ArmorMaterial::CHAIN, 1, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_chain) ->setTextureName(L"chestplateChain")->setDescriptionId(IDS_ITEM_CHESTPLATE_CHAIN)->setUseDescriptionId(IDS_DESC_CHESTPLATE_CHAIN) ); - Item::leggings_chain = (ArmorItem *) ( ( new ArmorItem(48, ArmorItem::ArmorMaterial::CHAIN, 1, ArmorItem::SLOT_LEGS) ) ->setBaseItemTypeAndMaterial(eBaseItemType_leggings, eMaterial_chain) ->setTextureName(L"leggingsChain")->setDescriptionId(IDS_ITEM_LEGGINGS_CHAIN)->setUseDescriptionId(IDS_DESC_LEGGINGS_CHAIN) ); - Item::boots_chain = (ArmorItem *) ( ( new ArmorItem(49, ArmorItem::ArmorMaterial::CHAIN, 1, ArmorItem::SLOT_FEET) ) ->setBaseItemTypeAndMaterial(eBaseItemType_boots, eMaterial_chain) ->setTextureName(L"bootsChain")->setDescriptionId(IDS_ITEM_BOOTS_CHAIN)->setUseDescriptionId(IDS_DESC_BOOTS_CHAIN) ); + Item::helmet_chain = (ArmorItem *) ( ( new ArmorItem(46, ArmorItem::ArmorMaterial::CHAIN, 1, ArmorItem::SLOT_HEAD) ) ->setBaseItemTypeAndMaterial(eBaseItemType_helmet, eMaterial_chain) ->setIconName(L"helmetChain")->setDescriptionId(IDS_ITEM_HELMET_CHAIN)->setUseDescriptionId(IDS_DESC_HELMET_CHAIN) ); + Item::chestplate_chain = (ArmorItem *) ( ( new ArmorItem(47, ArmorItem::ArmorMaterial::CHAIN, 1, ArmorItem::SLOT_TORSO) ) ->setBaseItemTypeAndMaterial(eBaseItemType_chestplate, eMaterial_chain) ->setIconName(L"chestplateChain")->setDescriptionId(IDS_ITEM_CHESTPLATE_CHAIN)->setUseDescriptionId(IDS_DESC_CHESTPLATE_CHAIN) ); + Item::leggings_chain = (ArmorItem *) ( ( new ArmorItem(48, ArmorItem::ArmorMaterial::CHAIN, 1, ArmorItem::SLOT_LEGS) ) ->setBaseItemTypeAndMaterial(eBaseItemType_leggings, eMaterial_chain) ->setIconName(L"leggingsChain")->setDescriptionId(IDS_ITEM_LEGGINGS_CHAIN)->setUseDescriptionId(IDS_DESC_LEGGINGS_CHAIN) ); + Item::boots_chain = (ArmorItem *) ( ( new ArmorItem(49, ArmorItem::ArmorMaterial::CHAIN, 1, ArmorItem::SLOT_FEET) ) ->setBaseItemTypeAndMaterial(eBaseItemType_boots, eMaterial_chain) ->setIconName(L"bootsChain")->setDescriptionId(IDS_ITEM_BOOTS_CHAIN)->setUseDescriptionId(IDS_DESC_BOOTS_CHAIN) ); - Item::boots_cloth = (ArmorItem *) ( ( new ArmorItem(45, ArmorItem::ArmorMaterial::CLOTH, 0, ArmorItem::SLOT_FEET) ) ->setBaseItemTypeAndMaterial(eBaseItemType_boots, eMaterial_cloth) ->setTextureName(L"bootsCloth")->setDescriptionId(IDS_ITEM_BOOTS_CLOTH)->setUseDescriptionId(IDS_DESC_BOOTS_LEATHER) ); - Item::boots_iron = (ArmorItem *) ( ( new ArmorItem(53, ArmorItem::ArmorMaterial::IRON, 2, ArmorItem::SLOT_FEET) ) ->setBaseItemTypeAndMaterial(eBaseItemType_boots, eMaterial_iron) ->setTextureName(L"bootsIron")->setDescriptionId(IDS_ITEM_BOOTS_IRON)->setUseDescriptionId(IDS_DESC_BOOTS_IRON) ); - Item::boots_diamond = (ArmorItem *) ( ( new ArmorItem(57, ArmorItem::ArmorMaterial::DIAMOND, 3, ArmorItem::SLOT_FEET) ) ->setBaseItemTypeAndMaterial(eBaseItemType_boots, eMaterial_diamond) ->setTextureName(L"bootsDiamond")->setDescriptionId(IDS_ITEM_BOOTS_DIAMOND)->setUseDescriptionId(IDS_DESC_BOOTS_DIAMOND) ); - Item::boots_gold = (ArmorItem *) ( ( new ArmorItem(61, ArmorItem::ArmorMaterial::GOLD, 4, ArmorItem::SLOT_FEET) ) ->setBaseItemTypeAndMaterial(eBaseItemType_boots, eMaterial_gold) ->setTextureName(L"bootsGold")->setDescriptionId(IDS_ITEM_BOOTS_GOLD)->setUseDescriptionId(IDS_DESC_BOOTS_GOLD) ); + Item::boots_leather = (ArmorItem *) ( ( new ArmorItem(45, ArmorItem::ArmorMaterial::CLOTH, 0, ArmorItem::SLOT_FEET) ) ->setBaseItemTypeAndMaterial(eBaseItemType_boots, eMaterial_cloth) ->setIconName(L"bootsCloth")->setDescriptionId(IDS_ITEM_BOOTS_CLOTH)->setUseDescriptionId(IDS_DESC_BOOTS_LEATHER) ); + Item::boots_iron = (ArmorItem *) ( ( new ArmorItem(53, ArmorItem::ArmorMaterial::IRON, 2, ArmorItem::SLOT_FEET) ) ->setBaseItemTypeAndMaterial(eBaseItemType_boots, eMaterial_iron) ->setIconName(L"bootsIron")->setDescriptionId(IDS_ITEM_BOOTS_IRON)->setUseDescriptionId(IDS_DESC_BOOTS_IRON) ); + Item::boots_diamond = (ArmorItem *) ( ( new ArmorItem(57, ArmorItem::ArmorMaterial::DIAMOND, 3, ArmorItem::SLOT_FEET) ) ->setBaseItemTypeAndMaterial(eBaseItemType_boots, eMaterial_diamond) ->setIconName(L"bootsDiamond")->setDescriptionId(IDS_ITEM_BOOTS_DIAMOND)->setUseDescriptionId(IDS_DESC_BOOTS_DIAMOND) ); + Item::boots_gold = (ArmorItem *) ( ( new ArmorItem(61, ArmorItem::ArmorMaterial::GOLD, 4, ArmorItem::SLOT_FEET) ) ->setBaseItemTypeAndMaterial(eBaseItemType_boots, eMaterial_gold) ->setIconName(L"bootsGold")->setDescriptionId(IDS_ITEM_BOOTS_GOLD)->setUseDescriptionId(IDS_DESC_BOOTS_GOLD) ); - Item::ironIngot = ( new Item(9) )->setTextureName(L"ingotIron") ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_iron)->setDescriptionId(IDS_ITEM_INGOT_IRON)->setUseDescriptionId(IDS_DESC_INGOT); - Item::goldIngot = ( new Item(10) )->setTextureName(L"ingotGold") ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_gold)->setDescriptionId(IDS_ITEM_INGOT_GOLD)->setUseDescriptionId(IDS_DESC_INGOT); + Item::ironIngot = ( new Item(9) )->setIconName(L"ingotIron") ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_iron)->setDescriptionId(IDS_ITEM_INGOT_IRON)->setUseDescriptionId(IDS_DESC_INGOT); + Item::goldIngot = ( new Item(10) )->setIconName(L"ingotGold") ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_gold)->setDescriptionId(IDS_ITEM_INGOT_GOLD)->setUseDescriptionId(IDS_DESC_INGOT); // 4J-PB - todo - add materials and base types to the ones below - Item::bucket_empty = ( new BucketItem(69, 0) ) ->setBaseItemTypeAndMaterial(eBaseItemType_utensil, eMaterial_water)->setTextureName(L"bucket")->setDescriptionId(IDS_ITEM_BUCKET)->setUseDescriptionId(IDS_DESC_BUCKET)->setMaxStackSize(16); - Item::bowl = ( new Item(25) ) ->setBaseItemTypeAndMaterial(eBaseItemType_utensil, eMaterial_wood)->setTextureName(L"bowl")->setDescriptionId(IDS_ITEM_BOWL)->setUseDescriptionId(IDS_DESC_BOWL)->setMaxStackSize(64); + Item::bucket_empty = ( new BucketItem(69, 0) ) ->setBaseItemTypeAndMaterial(eBaseItemType_utensil, eMaterial_water)->setIconName(L"bucket")->setDescriptionId(IDS_ITEM_BUCKET)->setUseDescriptionId(IDS_DESC_BUCKET)->setMaxStackSize(16); + Item::bowl = ( new Item(25) ) ->setBaseItemTypeAndMaterial(eBaseItemType_utensil, eMaterial_wood)->setIconName(L"bowl")->setDescriptionId(IDS_ITEM_BOWL)->setUseDescriptionId(IDS_DESC_BOWL)->setMaxStackSize(64); - Item::bucket_water = ( new BucketItem(70, Tile::water_Id) ) ->setTextureName(L"bucketWater")->setDescriptionId(IDS_ITEM_BUCKET_WATER)->setCraftingRemainingItem(Item::bucket_empty)->setUseDescriptionId(IDS_DESC_BUCKET_WATER); - Item::bucket_lava = ( new BucketItem(71, Tile::lava_Id) ) ->setTextureName(L"bucketLava")->setDescriptionId(IDS_ITEM_BUCKET_LAVA)->setCraftingRemainingItem(Item::bucket_empty)->setUseDescriptionId(IDS_DESC_BUCKET_LAVA); - Item::milk = ( new MilkBucketItem(79) )->setTextureName(L"milk")->setDescriptionId(IDS_ITEM_BUCKET_MILK)->setCraftingRemainingItem(Item::bucket_empty)->setUseDescriptionId(IDS_DESC_BUCKET_MILK); + Item::bucket_water = ( new BucketItem(70, Tile::water_Id) ) ->setIconName(L"bucketWater")->setDescriptionId(IDS_ITEM_BUCKET_WATER)->setCraftingRemainingItem(Item::bucket_empty)->setUseDescriptionId(IDS_DESC_BUCKET_WATER); + Item::bucket_lava = ( new BucketItem(71, Tile::lava_Id) ) ->setIconName(L"bucketLava")->setDescriptionId(IDS_ITEM_BUCKET_LAVA)->setCraftingRemainingItem(Item::bucket_empty)->setUseDescriptionId(IDS_DESC_BUCKET_LAVA); + Item::bucket_milk = ( new MilkBucketItem(79) )->setIconName(L"milk")->setDescriptionId(IDS_ITEM_BUCKET_MILK)->setCraftingRemainingItem(Item::bucket_empty)->setUseDescriptionId(IDS_DESC_BUCKET_MILK); - Item::bow = (BowItem *)( new BowItem(5) ) ->setTextureName(L"bow")->setBaseItemTypeAndMaterial(eBaseItemType_bow, eMaterial_bow) ->setDescriptionId(IDS_ITEM_BOW)->setUseDescriptionId(IDS_DESC_BOW); - Item::arrow = ( new Item(6) ) ->setTextureName(L"arrow")->setBaseItemTypeAndMaterial(eBaseItemType_bow, eMaterial_arrow) ->setDescriptionId(IDS_ITEM_ARROW)->setUseDescriptionId(IDS_DESC_ARROW); + Item::bow = (BowItem *)( new BowItem(5) ) ->setIconName(L"bow")->setBaseItemTypeAndMaterial(eBaseItemType_bow, eMaterial_bow) ->setDescriptionId(IDS_ITEM_BOW)->setUseDescriptionId(IDS_DESC_BOW); + Item::arrow = ( new Item(6) ) ->setIconName(L"arrow")->setBaseItemTypeAndMaterial(eBaseItemType_bow, eMaterial_arrow) ->setDescriptionId(IDS_ITEM_ARROW)->setUseDescriptionId(IDS_DESC_ARROW); - Item::compass = ( new CompassItem(89) ) ->setTextureName(L"compass")->setBaseItemTypeAndMaterial(eBaseItemType_pockettool, eMaterial_compass) ->setDescriptionId(IDS_ITEM_COMPASS)->setUseDescriptionId(IDS_DESC_COMPASS); - Item::clock = ( new ClockItem(91) ) ->setTextureName(L"clock")->setBaseItemTypeAndMaterial(eBaseItemType_pockettool, eMaterial_clock) ->setDescriptionId(IDS_ITEM_CLOCK)->setUseDescriptionId(IDS_DESC_CLOCK); - Item::map = (MapItem *) ( new MapItem(102) ) ->setTextureName(L"map")->setBaseItemTypeAndMaterial(eBaseItemType_pockettool, eMaterial_map) ->setDescriptionId(IDS_ITEM_MAP)->setUseDescriptionId(IDS_DESC_MAP); + Item::compass = ( new CompassItem(89) ) ->setIconName(L"compass")->setBaseItemTypeAndMaterial(eBaseItemType_pockettool, eMaterial_compass) ->setDescriptionId(IDS_ITEM_COMPASS)->setUseDescriptionId(IDS_DESC_COMPASS); + Item::clock = ( new ClockItem(91) ) ->setIconName(L"clock")->setBaseItemTypeAndMaterial(eBaseItemType_pockettool, eMaterial_clock) ->setDescriptionId(IDS_ITEM_CLOCK)->setUseDescriptionId(IDS_DESC_CLOCK); + Item::map = (MapItem *) ( new MapItem(102) ) ->setIconName(L"map")->setBaseItemTypeAndMaterial(eBaseItemType_pockettool, eMaterial_map) ->setDescriptionId(IDS_ITEM_MAP)->setUseDescriptionId(IDS_DESC_MAP); - Item::flintAndSteel = ( new FlintAndSteelItem(3) ) ->setTextureName(L"flintAndSteel")->setBaseItemTypeAndMaterial(eBaseItemType_devicetool, eMaterial_flintandsteel)->setDescriptionId(IDS_ITEM_FLINT_AND_STEEL)->setUseDescriptionId(IDS_DESC_FLINTANDSTEEL); - Item::apple = ( new FoodItem(4, 4, FoodConstants::FOOD_SATURATION_LOW, false) ) ->setTextureName(L"apple")->setDescriptionId(IDS_ITEM_APPLE)->setUseDescriptionId(IDS_DESC_APPLE); - Item::coal = ( new CoalItem(7) ) ->setTextureName(L"coal")->setDescriptionId(IDS_ITEM_COAL)->setUseDescriptionId(IDS_DESC_COAL); - Item::diamond = ( new Item(8) ) ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_diamond)->setTextureName(L"diamond")->setDescriptionId(IDS_ITEM_DIAMOND)->setUseDescriptionId(IDS_DESC_DIAMONDS); - Item::stick = ( new Item(24) ) ->setTextureName(L"stick")->handEquipped()->setDescriptionId(IDS_ITEM_STICK)->setUseDescriptionId(IDS_DESC_STICK); - Item::mushroomStew = ( new BowlFoodItem(26, 6) ) ->setTextureName(L"mushroomStew")->setDescriptionId(IDS_ITEM_MUSHROOM_STEW)->setUseDescriptionId(IDS_DESC_MUSHROOMSTEW); + Item::flintAndSteel = ( new FlintAndSteelItem(3) ) ->setIconName(L"flintAndSteel")->setBaseItemTypeAndMaterial(eBaseItemType_devicetool, eMaterial_flintandsteel)->setDescriptionId(IDS_ITEM_FLINT_AND_STEEL)->setUseDescriptionId(IDS_DESC_FLINTANDSTEEL); + Item::apple = ( new FoodItem(4, 4, FoodConstants::FOOD_SATURATION_LOW, false) ) ->setIconName(L"apple")->setDescriptionId(IDS_ITEM_APPLE)->setUseDescriptionId(IDS_DESC_APPLE); + Item::coal = ( new CoalItem(7) ) ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_coal)->setIconName(L"coal")->setDescriptionId(IDS_ITEM_COAL)->setUseDescriptionId(IDS_DESC_COAL); + Item::diamond = ( new Item(8) ) ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_diamond)->setIconName(L"diamond")->setDescriptionId(IDS_ITEM_DIAMOND)->setUseDescriptionId(IDS_DESC_DIAMONDS); + Item::stick = ( new Item(24) ) ->setIconName(L"stick")->handEquipped()->setDescriptionId(IDS_ITEM_STICK)->setUseDescriptionId(IDS_DESC_STICK); + Item::mushroomStew = ( new BowlFoodItem(26, 6) ) ->setIconName(L"mushroomStew")->setDescriptionId(IDS_ITEM_MUSHROOM_STEW)->setUseDescriptionId(IDS_DESC_MUSHROOMSTEW); - Item::string = ( new TilePlanterItem(31, Tile::tripWire) ) ->setTextureName(L"string")->setDescriptionId(IDS_ITEM_STRING)->setUseDescriptionId(IDS_DESC_STRING); - Item::feather = ( new Item(32) ) ->setTextureName(L"feather")->setDescriptionId(IDS_ITEM_FEATHER)->setUseDescriptionId(IDS_DESC_FEATHER); - Item::sulphur = ( new Item(33) ) ->setTextureName(L"sulphur")->setDescriptionId(IDS_ITEM_SULPHUR)->setUseDescriptionId(IDS_DESC_SULPHUR)->setPotionBrewingFormula(PotionBrewing::MOD_GUNPOWDER); + Item::string = ( new TilePlanterItem(31, Tile::tripWire) ) ->setIconName(L"string")->setDescriptionId(IDS_ITEM_STRING)->setUseDescriptionId(IDS_DESC_STRING); + Item::feather = ( new Item(32) ) ->setIconName(L"feather")->setDescriptionId(IDS_ITEM_FEATHER)->setUseDescriptionId(IDS_DESC_FEATHER); + Item::gunpowder = ( new Item(33) ) ->setIconName(L"sulphur")->setDescriptionId(IDS_ITEM_SULPHUR)->setUseDescriptionId(IDS_DESC_SULPHUR)->setPotionBrewingFormula(PotionBrewing::MOD_GUNPOWDER); - Item::seeds_wheat = ( new SeedItem(39, Tile::crops_Id, Tile::farmland_Id) ) ->setTextureName(L"seeds")->setDescriptionId(IDS_ITEM_WHEAT_SEEDS)->setUseDescriptionId(IDS_DESC_WHEAT_SEEDS); - Item::wheat = ( new Item(40) ) ->setTextureName(L"wheat")->setDescriptionId(IDS_ITEM_WHEAT)->setUseDescriptionId(IDS_DESC_WHEAT); - Item::bread = ( new FoodItem(41, 5, FoodConstants::FOOD_SATURATION_NORMAL, false) ) ->setTextureName(L"bread")->setDescriptionId(IDS_ITEM_BREAD)->setUseDescriptionId(IDS_DESC_BREAD); + Item::seeds_wheat = ( new SeedItem(39, Tile::wheat_Id, Tile::farmland_Id) ) ->setIconName(L"seeds")->setDescriptionId(IDS_ITEM_WHEAT_SEEDS)->setUseDescriptionId(IDS_DESC_WHEAT_SEEDS); + Item::wheat = ( new Item(40) ) ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_wheat)->setIconName(L"wheat")->setDescriptionId(IDS_ITEM_WHEAT)->setUseDescriptionId(IDS_DESC_WHEAT); + Item::bread = ( new FoodItem(41, 5, FoodConstants::FOOD_SATURATION_NORMAL, false) ) ->setIconName(L"bread")->setDescriptionId(IDS_ITEM_BREAD)->setUseDescriptionId(IDS_DESC_BREAD); - Item::flint = ( new Item(62) ) ->setTextureName(L"flint")->setDescriptionId(IDS_ITEM_FLINT)->setUseDescriptionId(IDS_DESC_FLINT); - Item::porkChop_raw = ( new FoodItem(63, 3, FoodConstants::FOOD_SATURATION_LOW, true) ) ->setTextureName(L"porkchopRaw")->setDescriptionId(IDS_ITEM_PORKCHOP_RAW)->setUseDescriptionId(IDS_DESC_PORKCHOP_RAW); - Item::porkChop_cooked = ( new FoodItem(64, 8, FoodConstants::FOOD_SATURATION_GOOD, true) ) ->setTextureName(L"porkchopCooked")->setDescriptionId(IDS_ITEM_PORKCHOP_COOKED)->setUseDescriptionId(IDS_DESC_PORKCHOP_COOKED); - Item::painting = ( new HangingEntityItem(65,eTYPE_PAINTING) ) ->setBaseItemTypeAndMaterial(eBaseItemType_HangingItem, eMaterial_cloth)->setTextureName(L"painting")->setDescriptionId(IDS_ITEM_PAINTING)->setUseDescriptionId(IDS_DESC_PICTURE); + Item::flint = ( new Item(62) ) ->setIconName(L"flint")->setDescriptionId(IDS_ITEM_FLINT)->setUseDescriptionId(IDS_DESC_FLINT); + Item::porkChop_raw = ( new FoodItem(63, 3, FoodConstants::FOOD_SATURATION_LOW, true) ) ->setIconName(L"porkchopRaw")->setDescriptionId(IDS_ITEM_PORKCHOP_RAW)->setUseDescriptionId(IDS_DESC_PORKCHOP_RAW); + Item::porkChop_cooked = ( new FoodItem(64, 8, FoodConstants::FOOD_SATURATION_GOOD, true) ) ->setIconName(L"porkchopCooked")->setDescriptionId(IDS_ITEM_PORKCHOP_COOKED)->setUseDescriptionId(IDS_DESC_PORKCHOP_COOKED); + Item::painting = ( new HangingEntityItem(65,eTYPE_PAINTING) ) ->setBaseItemTypeAndMaterial(eBaseItemType_HangingItem, eMaterial_cloth)->setIconName(L"painting")->setDescriptionId(IDS_ITEM_PAINTING)->setUseDescriptionId(IDS_DESC_PICTURE); - Item::apple_gold = ( new GoldenAppleItem(66, 4, FoodConstants::FOOD_SATURATION_SUPERNATURAL, false) )->setCanAlwaysEat()->setEatEffect(MobEffect::regeneration->id, 5, 0, 1.0f) - ->setBaseItemTypeAndMaterial(eBaseItemType_giltFruit,eMaterial_apple)->setTextureName(L"appleGold")->setDescriptionId(IDS_ITEM_APPLE_GOLD);//->setUseDescriptionId(IDS_DESC_GOLDENAPPLE); + Item::apple_gold = ( new GoldenAppleItem(66, 4, FoodConstants::FOOD_SATURATION_SUPERNATURAL, false) )->setCanAlwaysEat()->setEatEffect(MobEffect::regeneration->id, 5, 1, 1.0f) + ->setBaseItemTypeAndMaterial(eBaseItemType_giltFruit,eMaterial_apple)->setIconName(L"appleGold")->setDescriptionId(IDS_ITEM_APPLE_GOLD);//->setUseDescriptionId(IDS_DESC_GOLDENAPPLE); - Item::sign = ( new SignItem(67) ) ->setBaseItemTypeAndMaterial(eBaseItemType_HangingItem, eMaterial_wood)->setTextureName(L"sign")->setDescriptionId(IDS_ITEM_SIGN)->setUseDescriptionId(IDS_DESC_SIGN); + Item::sign = ( new SignItem(67) ) ->setBaseItemTypeAndMaterial(eBaseItemType_HangingItem, eMaterial_wood)->setIconName(L"sign")->setDescriptionId(IDS_ITEM_SIGN)->setUseDescriptionId(IDS_DESC_SIGN); - Item::minecart = ( new MinecartItem(72, Minecart::RIDEABLE) ) ->setTextureName(L"minecart")->setDescriptionId(IDS_ITEM_MINECART)->setUseDescriptionId(IDS_DESC_MINECART); - Item::saddle = ( new SaddleItem(73) ) ->setTextureName(L"saddle")->setDescriptionId(IDS_ITEM_SADDLE)->setUseDescriptionId(IDS_DESC_SADDLE); - Item::redStone = ( new RedStoneItem(75) ) ->setTextureName(L"redstone")->setDescriptionId(IDS_ITEM_REDSTONE)->setUseDescriptionId(IDS_DESC_REDSTONE_DUST)->setPotionBrewingFormula(PotionBrewing::MOD_REDSTONE); - Item::snowBall = ( new SnowballItem(76) ) ->setTextureName(L"snowball")->setDescriptionId(IDS_ITEM_SNOWBALL)->setUseDescriptionId(IDS_DESC_SNOWBALL); + Item::minecart = ( new MinecartItem(72, Minecart::TYPE_RIDEABLE) ) ->setIconName(L"minecart")->setDescriptionId(IDS_ITEM_MINECART)->setUseDescriptionId(IDS_DESC_MINECART); + Item::saddle = ( new SaddleItem(73) ) ->setIconName(L"saddle")->setDescriptionId(IDS_ITEM_SADDLE)->setUseDescriptionId(IDS_DESC_SADDLE); + Item::redStone = ( new RedStoneItem(75) ) ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_redstone)->setIconName(L"redstone")->setDescriptionId(IDS_ITEM_REDSTONE)->setUseDescriptionId(IDS_DESC_REDSTONE_DUST)->setPotionBrewingFormula(PotionBrewing::MOD_REDSTONE); + Item::snowBall = ( new SnowballItem(76) ) ->setIconName(L"snowball")->setDescriptionId(IDS_ITEM_SNOWBALL)->setUseDescriptionId(IDS_DESC_SNOWBALL); - Item::boat = ( new BoatItem(77) ) ->setTextureName(L"boat")->setDescriptionId(IDS_ITEM_BOAT)->setUseDescriptionId(IDS_DESC_BOAT); + Item::boat = ( new BoatItem(77) ) ->setIconName(L"boat")->setDescriptionId(IDS_ITEM_BOAT)->setUseDescriptionId(IDS_DESC_BOAT); - Item::leather = ( new Item(78) ) ->setTextureName(L"leather")->setDescriptionId(IDS_ITEM_LEATHER)->setUseDescriptionId(IDS_DESC_LEATHER); - Item::brick = ( new Item(80) ) ->setTextureName(L"brick")->setDescriptionId(IDS_ITEM_BRICK)->setUseDescriptionId(IDS_DESC_BRICK); - Item::clay = ( new Item(81) ) ->setTextureName(L"clay")->setDescriptionId(IDS_ITEM_CLAY)->setUseDescriptionId(IDS_DESC_CLAY); - Item::reeds = ( new TilePlanterItem(82, Tile::reeds) ) ->setTextureName(L"reeds")->setDescriptionId(IDS_ITEM_REEDS)->setUseDescriptionId(IDS_DESC_REEDS); - Item::paper = ( new Item(83) ) ->setTextureName(L"paper")->setDescriptionId(IDS_ITEM_PAPER)->setUseDescriptionId(IDS_DESC_PAPER); - Item::book = ( new BookItem(84) ) ->setTextureName(L"book")->setDescriptionId(IDS_ITEM_BOOK)->setUseDescriptionId(IDS_DESC_BOOK); - Item::slimeBall = ( new Item(85) ) ->setTextureName(L"slimeball")->setDescriptionId(IDS_ITEM_SLIMEBALL)->setUseDescriptionId(IDS_DESC_SLIMEBALL); - Item::minecart_chest = ( new MinecartItem(86, Minecart::CHEST) ) ->setTextureName(L"minecartChest")->setDescriptionId(IDS_ITEM_MINECART_CHEST)->setUseDescriptionId(IDS_DESC_MINECARTWITHCHEST); - Item::minecart_furnace = ( new MinecartItem(87, Minecart::FURNACE) )->setTextureName(L"minecartFurnace")->setDescriptionId(IDS_ITEM_MINECART_FURNACE)->setUseDescriptionId(IDS_DESC_MINECARTWITHFURNACE); - Item::egg = ( new EggItem(88) ) ->setTextureName(L"egg")->setDescriptionId(IDS_ITEM_EGG)->setUseDescriptionId(IDS_DESC_EGG); - Item::fishingRod = (FishingRodItem *)( new FishingRodItem(90) ) ->setBaseItemTypeAndMaterial(eBaseItemType_rod, eMaterial_wood)->setTextureName(L"fishingRod")->setDescriptionId(IDS_ITEM_FISHING_ROD)->setUseDescriptionId(IDS_DESC_FISHINGROD); - Item::yellowDust = ( new Item(92) ) ->setTextureName(L"yellowDust")->setDescriptionId(IDS_ITEM_YELLOW_DUST)->setUseDescriptionId(IDS_DESC_YELLOW_DUST)->setPotionBrewingFormula(PotionBrewing::MOD_GLOWSTONE); - Item::fish_raw = ( new FoodItem(93, 2, FoodConstants::FOOD_SATURATION_LOW, false) ) ->setTextureName(L"fishRaw")->setDescriptionId(IDS_ITEM_FISH_RAW)->setUseDescriptionId(IDS_DESC_FISH_RAW); - Item::fish_cooked = ( new FoodItem(94, 5, FoodConstants::FOOD_SATURATION_NORMAL, false) ) ->setTextureName(L"fishCooked")->setDescriptionId(IDS_ITEM_FISH_COOKED)->setUseDescriptionId(IDS_DESC_FISH_COOKED); + Item::leather = ( new Item(78) ) ->setIconName(L"leather")->setDescriptionId(IDS_ITEM_LEATHER)->setUseDescriptionId(IDS_DESC_LEATHER); + Item::brick = ( new Item(80) ) ->setIconName(L"brick")->setDescriptionId(IDS_ITEM_BRICK)->setUseDescriptionId(IDS_DESC_BRICK); + Item::clay = ( new Item(81) ) ->setIconName(L"clay")->setDescriptionId(IDS_ITEM_CLAY)->setUseDescriptionId(IDS_DESC_CLAY); + Item::reeds = ( new TilePlanterItem(82, Tile::reeds) ) ->setIconName(L"reeds")->setDescriptionId(IDS_ITEM_REEDS)->setUseDescriptionId(IDS_DESC_REEDS); + Item::paper = ( new Item(83) ) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_paper, Item::eMaterial_paper)->setIconName(L"paper")->setDescriptionId(IDS_ITEM_PAPER)->setUseDescriptionId(IDS_DESC_PAPER); + Item::book = ( new BookItem(84) ) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_paper, Item::eMaterial_book)->setIconName(L"book")->setDescriptionId(IDS_ITEM_BOOK)->setUseDescriptionId(IDS_DESC_BOOK); + Item::slimeBall = ( new Item(85) ) ->setIconName(L"slimeball")->setDescriptionId(IDS_ITEM_SLIMEBALL)->setUseDescriptionId(IDS_DESC_SLIMEBALL); + Item::minecart_chest = ( new MinecartItem(86, Minecart::TYPE_CHEST) ) ->setIconName(L"minecart_chest")->setDescriptionId(IDS_ITEM_MINECART_CHEST)->setUseDescriptionId(IDS_DESC_MINECARTWITHCHEST); + Item::minecart_furnace = ( new MinecartItem(87, Minecart::TYPE_FURNACE) )->setIconName(L"minecart_furnace")->setDescriptionId(IDS_ITEM_MINECART_FURNACE)->setUseDescriptionId(IDS_DESC_MINECARTWITHFURNACE); + Item::egg = ( new EggItem(88) ) ->setIconName(L"egg")->setDescriptionId(IDS_ITEM_EGG)->setUseDescriptionId(IDS_DESC_EGG); + Item::fishingRod = (FishingRodItem *)( new FishingRodItem(90) ) ->setBaseItemTypeAndMaterial(eBaseItemType_rod, eMaterial_wood)->setIconName(L"fishingRod")->setDescriptionId(IDS_ITEM_FISHING_ROD)->setUseDescriptionId(IDS_DESC_FISHINGROD); + Item::yellowDust = ( new Item(92) ) ->setIconName(L"yellowDust")->setDescriptionId(IDS_ITEM_YELLOW_DUST)->setUseDescriptionId(IDS_DESC_YELLOW_DUST)->setPotionBrewingFormula(PotionBrewing::MOD_GLOWSTONE); + Item::fish_raw = ( new FoodItem(93, 2, FoodConstants::FOOD_SATURATION_LOW, false) ) ->setIconName(L"fishRaw")->setDescriptionId(IDS_ITEM_FISH_RAW)->setUseDescriptionId(IDS_DESC_FISH_RAW); + Item::fish_cooked = ( new FoodItem(94, 5, FoodConstants::FOOD_SATURATION_NORMAL, false) ) ->setIconName(L"fishCooked")->setDescriptionId(IDS_ITEM_FISH_COOKED)->setUseDescriptionId(IDS_DESC_FISH_COOKED); - Item::dye_powder = ( new DyePowderItem(95) ) ->setBaseItemTypeAndMaterial(eBaseItemType_dyepowder, eMaterial_dye)->setTextureName(L"dyePowder")->setDescriptionId(IDS_ITEM_DYE_POWDER)->setUseDescriptionId(-1); + 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) ) ->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::bone = ( new Item(96) ) ->setIconName(L"bone")->setDescriptionId(IDS_ITEM_BONE)->handEquipped()->setUseDescriptionId(IDS_DESC_BONE); + Item::sugar = ( new Item(97) ) ->setIconName(L"sugar")->setDescriptionId(IDS_ITEM_SUGAR)->setUseDescriptionId(IDS_DESC_SUGAR)->setPotionBrewingFormula(PotionBrewing::MOD_SUGAR); // 4J-PB - changing the cake to be stackable - Jens ok'ed this 23/10/12 //Item::cake = ( new TilePlanterItem(98, Tile::cake) )->setMaxStackSize(1)->setIcon(13, 1)->setDescriptionId(IDS_ITEM_CAKE)->setUseDescriptionId(IDS_DESC_CAKE); - Item::cake = ( new TilePlanterItem(98, Tile::cake) ) ->setTextureName(L"cake")->setDescriptionId(IDS_ITEM_CAKE)->setUseDescriptionId(IDS_DESC_CAKE); + Item::cake = ( new TilePlanterItem(98, Tile::cake) ) ->setIconName(L"cake")->setDescriptionId(IDS_ITEM_CAKE)->setUseDescriptionId(IDS_DESC_CAKE); - Item::bed = ( new BedItem(99) ) ->setMaxStackSize(1)->setTextureName(L"bed")->setDescriptionId(IDS_ITEM_BED)->setUseDescriptionId(IDS_DESC_BED); + Item::bed = ( new BedItem(99) ) ->setMaxStackSize(1)->setIconName(L"bed")->setDescriptionId(IDS_ITEM_BED)->setUseDescriptionId(IDS_DESC_BED); - Item::diode = ( new TilePlanterItem(100, (Tile *)Tile::diode_off) ) ->setTextureName(L"diode")->setDescriptionId(IDS_ITEM_DIODE)->setUseDescriptionId(IDS_DESC_REDSTONEREPEATER); - Item::cookie = ( new FoodItem(101, 2, FoodConstants::FOOD_SATURATION_POOR, false) ) ->setTextureName(L"cookie")->setDescriptionId(IDS_ITEM_COOKIE)->setUseDescriptionId(IDS_DESC_COOKIE); + Item::repeater = ( new TilePlanterItem(100, (Tile *)Tile::diode_off) ) ->setIconName(L"diode")->setDescriptionId(IDS_ITEM_DIODE)->setUseDescriptionId(IDS_DESC_REDSTONEREPEATER); + Item::cookie = ( new FoodItem(101, 2, FoodConstants::FOOD_SATURATION_POOR, false) ) ->setIconName(L"cookie")->setDescriptionId(IDS_ITEM_COOKIE)->setUseDescriptionId(IDS_DESC_COOKIE); - Item::shears = (ShearsItem *)( new ShearsItem(103) ) ->setTextureName(L"shears")->setBaseItemTypeAndMaterial(eBaseItemType_devicetool, eMaterial_shears)->setDescriptionId(IDS_ITEM_SHEARS)->setUseDescriptionId(IDS_DESC_SHEARS); + Item::shears = (ShearsItem *)( new ShearsItem(103) ) ->setIconName(L"shears")->setBaseItemTypeAndMaterial(eBaseItemType_devicetool, eMaterial_shears)->setDescriptionId(IDS_ITEM_SHEARS)->setUseDescriptionId(IDS_DESC_SHEARS); - Item::melon = (new FoodItem(104, 2, FoodConstants::FOOD_SATURATION_LOW, false)) ->setTextureName(L"melon")->setDescriptionId(IDS_ITEM_MELON_SLICE)->setUseDescriptionId(IDS_DESC_MELON_SLICE); + Item::melon = (new FoodItem(104, 2, FoodConstants::FOOD_SATURATION_LOW, false)) ->setIconName(L"melon")->setDescriptionId(IDS_ITEM_MELON_SLICE)->setUseDescriptionId(IDS_DESC_MELON_SLICE); - Item::seeds_pumpkin = (new SeedItem(105, Tile::pumpkinStem_Id, Tile::farmland_Id)) ->setTextureName(L"seeds_pumpkin")->setBaseItemTypeAndMaterial(eBaseItemType_seed, eMaterial_pumpkin)->setDescriptionId(IDS_ITEM_PUMPKIN_SEEDS)->setUseDescriptionId(IDS_DESC_PUMPKIN_SEEDS); - Item::seeds_melon = (new SeedItem(106, Tile::melonStem_Id, Tile::farmland_Id)) ->setTextureName(L"seeds_melon")->setBaseItemTypeAndMaterial(eBaseItemType_seed, eMaterial_melon)->setDescriptionId(IDS_ITEM_MELON_SEEDS)->setUseDescriptionId(IDS_DESC_MELON_SEEDS); + Item::seeds_pumpkin = (new SeedItem(105, Tile::pumpkinStem_Id, Tile::farmland_Id)) ->setIconName(L"seeds_pumpkin")->setBaseItemTypeAndMaterial(eBaseItemType_seed, eMaterial_pumpkin)->setDescriptionId(IDS_ITEM_PUMPKIN_SEEDS)->setUseDescriptionId(IDS_DESC_PUMPKIN_SEEDS); + Item::seeds_melon = (new SeedItem(106, Tile::melonStem_Id, Tile::farmland_Id)) ->setIconName(L"seeds_melon")->setBaseItemTypeAndMaterial(eBaseItemType_seed, eMaterial_melon)->setDescriptionId(IDS_ITEM_MELON_SEEDS)->setUseDescriptionId(IDS_DESC_MELON_SEEDS); - Item::beef_raw = (new FoodItem(107, 3, FoodConstants::FOOD_SATURATION_LOW, true)) ->setTextureName(L"beefRaw")->setDescriptionId(IDS_ITEM_BEEF_RAW)->setUseDescriptionId(IDS_DESC_BEEF_RAW); - Item::beef_cooked = (new FoodItem(108, 8, FoodConstants::FOOD_SATURATION_GOOD, true))->setTextureName(L"beefCooked")->setDescriptionId(IDS_ITEM_BEEF_COOKED)->setUseDescriptionId(IDS_DESC_BEEF_COOKED); - Item::chicken_raw = (new FoodItem(109, 2, FoodConstants::FOOD_SATURATION_LOW, true))->setEatEffect(MobEffect::hunger->id, 30, 0, .3f)->setTextureName(L"chickenRaw")->setDescriptionId(IDS_ITEM_CHICKEN_RAW)->setUseDescriptionId(IDS_DESC_CHICKEN_RAW); - Item::chicken_cooked = (new FoodItem(110, 6, FoodConstants::FOOD_SATURATION_NORMAL, true))->setTextureName(L"chickenCooked")->setDescriptionId(IDS_ITEM_CHICKEN_COOKED)->setUseDescriptionId(IDS_DESC_CHICKEN_COOKED); - Item::rotten_flesh = (new FoodItem(111, 4, FoodConstants::FOOD_SATURATION_POOR, true))->setEatEffect(MobEffect::hunger->id, 30, 0, .8f)->setTextureName(L"rottenFlesh")->setDescriptionId(IDS_ITEM_ROTTEN_FLESH)->setUseDescriptionId(IDS_DESC_ROTTEN_FLESH); + Item::beef_raw = (new FoodItem(107, 3, FoodConstants::FOOD_SATURATION_LOW, true)) ->setIconName(L"beefRaw")->setDescriptionId(IDS_ITEM_BEEF_RAW)->setUseDescriptionId(IDS_DESC_BEEF_RAW); + Item::beef_cooked = (new FoodItem(108, 8, FoodConstants::FOOD_SATURATION_GOOD, true))->setIconName(L"beefCooked")->setDescriptionId(IDS_ITEM_BEEF_COOKED)->setUseDescriptionId(IDS_DESC_BEEF_COOKED); + Item::chicken_raw = (new FoodItem(109, 2, FoodConstants::FOOD_SATURATION_LOW, true))->setEatEffect(MobEffect::hunger->id, 30, 0, .3f)->setIconName(L"chickenRaw")->setDescriptionId(IDS_ITEM_CHICKEN_RAW)->setUseDescriptionId(IDS_DESC_CHICKEN_RAW); + Item::chicken_cooked = (new FoodItem(110, 6, FoodConstants::FOOD_SATURATION_NORMAL, true))->setIconName(L"chickenCooked")->setDescriptionId(IDS_ITEM_CHICKEN_COOKED)->setUseDescriptionId(IDS_DESC_CHICKEN_COOKED); + Item::rotten_flesh = (new FoodItem(111, 4, FoodConstants::FOOD_SATURATION_POOR, true))->setEatEffect(MobEffect::hunger->id, 30, 0, .8f)->setIconName(L"rottenFlesh")->setDescriptionId(IDS_ITEM_ROTTEN_FLESH)->setUseDescriptionId(IDS_DESC_ROTTEN_FLESH); - Item::enderPearl = (new EnderpearlItem(112)) ->setTextureName(L"enderPearl")->setDescriptionId(IDS_ITEM_ENDER_PEARL)->setUseDescriptionId(IDS_DESC_ENDER_PEARL); + Item::enderPearl = (new EnderpearlItem(112)) ->setIconName(L"enderPearl")->setDescriptionId(IDS_ITEM_ENDER_PEARL)->setUseDescriptionId(IDS_DESC_ENDER_PEARL); - Item::blazeRod = (new Item(113) ) ->setTextureName(L"blazeRod")->setDescriptionId(IDS_ITEM_BLAZE_ROD)->setUseDescriptionId(IDS_DESC_BLAZE_ROD)->handEquipped(); - Item::ghastTear = (new Item(114) ) ->setTextureName(L"ghastTear")->setDescriptionId(IDS_ITEM_GHAST_TEAR)->setUseDescriptionId(IDS_DESC_GHAST_TEAR)->setPotionBrewingFormula(PotionBrewing::MOD_GHASTTEARS); - Item::goldNugget = (new Item(115) ) ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_gold)->setTextureName(L"goldNugget")->setDescriptionId(IDS_ITEM_GOLD_NUGGET)->setUseDescriptionId(IDS_DESC_GOLD_NUGGET); + Item::blazeRod = (new Item(113) ) ->setIconName(L"blazeRod")->setDescriptionId(IDS_ITEM_BLAZE_ROD)->setUseDescriptionId(IDS_DESC_BLAZE_ROD)->handEquipped(); + Item::ghastTear = (new Item(114) ) ->setIconName(L"ghastTear")->setDescriptionId(IDS_ITEM_GHAST_TEAR)->setUseDescriptionId(IDS_DESC_GHAST_TEAR)->setPotionBrewingFormula(PotionBrewing::MOD_GHASTTEARS); + Item::goldNugget = (new Item(115) ) ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_gold)->setIconName(L"goldNugget")->setDescriptionId(IDS_ITEM_GOLD_NUGGET)->setUseDescriptionId(IDS_DESC_GOLD_NUGGET); - Item::netherStalkSeeds = (new SeedItem(116, Tile::netherStalk_Id, Tile::hellSand_Id) ) ->setTextureName(L"netherStalkSeeds")->setDescriptionId(IDS_ITEM_NETHER_STALK_SEEDS)->setUseDescriptionId(IDS_DESC_NETHER_STALK_SEEDS)->setPotionBrewingFormula(PotionBrewing::MOD_NETHERWART); + Item::netherwart_seeds = (new SeedItem(116, Tile::netherStalk_Id, Tile::soulsand_Id) ) ->setIconName(L"netherStalkSeeds")->setDescriptionId(IDS_ITEM_NETHER_STALK_SEEDS)->setUseDescriptionId(IDS_DESC_NETHER_STALK_SEEDS)->setPotionBrewingFormula(PotionBrewing::MOD_NETHERWART); - Item::potion = (PotionItem *) ( ( new PotionItem(117) ) ->setTextureName(L"potion")->setDescriptionId(IDS_ITEM_POTION)->setUseDescriptionId(IDS_DESC_POTION) ); - Item::glassBottle = (new BottleItem(118) ) ->setBaseItemTypeAndMaterial(eBaseItemType_utensil, eMaterial_glass)->setTextureName(L"glassBottle")->setDescriptionId(IDS_ITEM_GLASS_BOTTLE)->setUseDescriptionId(IDS_DESC_GLASS_BOTTLE); + Item::potion = (PotionItem *) ( ( new PotionItem(117) ) ->setIconName(L"potion")->setDescriptionId(IDS_ITEM_POTION)->setUseDescriptionId(IDS_DESC_POTION) ); + Item::glassBottle = (new BottleItem(118) ) ->setBaseItemTypeAndMaterial(eBaseItemType_utensil, eMaterial_glass)->setIconName(L"glassBottle")->setDescriptionId(IDS_ITEM_GLASS_BOTTLE)->setUseDescriptionId(IDS_DESC_GLASS_BOTTLE); - Item::spiderEye = (new FoodItem(119, 2, FoodConstants::FOOD_SATURATION_GOOD, false) ) ->setEatEffect(MobEffect::poison->id, 5, 0, 1.0f)->setTextureName(L"spiderEye")->setDescriptionId(IDS_ITEM_SPIDER_EYE)->setUseDescriptionId(IDS_DESC_SPIDER_EYE)->setPotionBrewingFormula(PotionBrewing::MOD_SPIDEREYE); - Item::fermentedSpiderEye = (new Item(120) ) ->setTextureName(L"fermentedSpiderEye")->setDescriptionId(IDS_ITEM_FERMENTED_SPIDER_EYE)->setUseDescriptionId(IDS_DESC_FERMENTED_SPIDER_EYE)->setPotionBrewingFormula(PotionBrewing::MOD_FERMENTEDEYE); + Item::spiderEye = (new FoodItem(119, 2, FoodConstants::FOOD_SATURATION_GOOD, false) ) ->setEatEffect(MobEffect::poison->id, 5, 0, 1.0f)->setIconName(L"spiderEye")->setDescriptionId(IDS_ITEM_SPIDER_EYE)->setUseDescriptionId(IDS_DESC_SPIDER_EYE)->setPotionBrewingFormula(PotionBrewing::MOD_SPIDEREYE); + Item::fermentedSpiderEye = (new Item(120) ) ->setIconName(L"fermentedSpiderEye")->setDescriptionId(IDS_ITEM_FERMENTED_SPIDER_EYE)->setUseDescriptionId(IDS_DESC_FERMENTED_SPIDER_EYE)->setPotionBrewingFormula(PotionBrewing::MOD_FERMENTEDEYE); - Item::blazePowder = (new Item(121) ) ->setTextureName(L"blazePowder")->setDescriptionId(IDS_ITEM_BLAZE_POWDER)->setUseDescriptionId(IDS_DESC_BLAZE_POWDER)->setPotionBrewingFormula(PotionBrewing::MOD_BLAZEPOWDER); - Item::magmaCream = (new Item(122) ) ->setTextureName(L"magmaCream")->setDescriptionId(IDS_ITEM_MAGMA_CREAM)->setUseDescriptionId(IDS_DESC_MAGMA_CREAM)->setPotionBrewingFormula(PotionBrewing::MOD_MAGMACREAM); + Item::blazePowder = (new Item(121) ) ->setIconName(L"blazePowder")->setDescriptionId(IDS_ITEM_BLAZE_POWDER)->setUseDescriptionId(IDS_DESC_BLAZE_POWDER)->setPotionBrewingFormula(PotionBrewing::MOD_BLAZEPOWDER); + Item::magmaCream = (new Item(122) ) ->setIconName(L"magmaCream")->setDescriptionId(IDS_ITEM_MAGMA_CREAM)->setUseDescriptionId(IDS_DESC_MAGMA_CREAM)->setPotionBrewingFormula(PotionBrewing::MOD_MAGMACREAM); - Item::brewingStand = (new TilePlanterItem(123, Tile::brewingStand) ) ->setBaseItemTypeAndMaterial(eBaseItemType_device, eMaterial_blaze)->setTextureName(L"brewingStand")->setDescriptionId(IDS_ITEM_BREWING_STAND)->setUseDescriptionId(IDS_DESC_BREWING_STAND); - Item::cauldron = (new TilePlanterItem(124, Tile::cauldron) ) ->setBaseItemTypeAndMaterial(eBaseItemType_utensil, eMaterial_iron)->setTextureName(L"cauldron")->setDescriptionId(IDS_ITEM_CAULDRON)->setUseDescriptionId(IDS_DESC_CAULDRON); - Item::eyeOfEnder = (new EnderEyeItem(125) ) ->setBaseItemTypeAndMaterial(eBaseItemType_pockettool, eMaterial_ender)->setTextureName(L"eyeOfEnder")->setDescriptionId(IDS_ITEM_EYE_OF_ENDER)->setUseDescriptionId(IDS_DESC_EYE_OF_ENDER); - Item::speckledMelon = (new Item(126) ) ->setBaseItemTypeAndMaterial(eBaseItemType_giltFruit, eMaterial_melon)->setTextureName(L"speckledMelon")->setDescriptionId(IDS_ITEM_SPECKLED_MELON)->setUseDescriptionId(IDS_DESC_SPECKLED_MELON)->setPotionBrewingFormula(PotionBrewing::MOD_SPECKLEDMELON); + Item::brewingStand = (new TilePlanterItem(123, Tile::brewingStand) ) ->setBaseItemTypeAndMaterial(eBaseItemType_device, eMaterial_blaze)->setIconName(L"brewingStand")->setDescriptionId(IDS_ITEM_BREWING_STAND)->setUseDescriptionId(IDS_DESC_BREWING_STAND); + Item::cauldron = (new TilePlanterItem(124, Tile::cauldron) ) ->setBaseItemTypeAndMaterial(eBaseItemType_utensil, eMaterial_iron)->setIconName(L"cauldron")->setDescriptionId(IDS_ITEM_CAULDRON)->setUseDescriptionId(IDS_DESC_CAULDRON); + Item::eyeOfEnder = (new EnderEyeItem(125) ) ->setBaseItemTypeAndMaterial(eBaseItemType_pockettool, eMaterial_ender)->setIconName(L"eyeOfEnder")->setDescriptionId(IDS_ITEM_EYE_OF_ENDER)->setUseDescriptionId(IDS_DESC_EYE_OF_ENDER); + Item::speckledMelon = (new Item(126) ) ->setBaseItemTypeAndMaterial(eBaseItemType_giltFruit, eMaterial_melon)->setIconName(L"speckledMelon")->setDescriptionId(IDS_ITEM_SPECKLED_MELON)->setUseDescriptionId(IDS_DESC_SPECKLED_MELON)->setPotionBrewingFormula(PotionBrewing::MOD_SPECKLEDMELON); - Item::monsterPlacer = (new MonsterPlacerItem(127)) ->setTextureName(L"monsterPlacer")->setDescriptionId(IDS_ITEM_MONSTER_SPAWNER)->setUseDescriptionId(IDS_DESC_MONSTER_SPAWNER); + Item::spawnEgg = (new SpawnEggItem(127)) ->setIconName(L"monsterPlacer")->setDescriptionId(IDS_ITEM_MONSTER_SPAWNER)->setUseDescriptionId(IDS_DESC_MONSTER_SPAWNER); // 4J Stu - Brought this forward - Item::expBottle = (new ExperienceItem(128)) ->setTextureName(L"expBottle")->setDescriptionId(IDS_ITEM_EXP_BOTTLE)->setUseDescriptionId(IDS_DESC_EXP_BOTTLE); + Item::expBottle = (new ExperienceItem(128)) ->setIconName(L"expBottle")->setDescriptionId(IDS_ITEM_EXP_BOTTLE)->setUseDescriptionId(IDS_DESC_EXP_BOTTLE); - Item::record_01 = ( new RecordingItem(2000, L"13") ) ->setTextureName(L"record")->setDescriptionId(IDS_ITEM_RECORD_01)->setUseDescriptionId(IDS_DESC_RECORD); - Item::record_02 = ( new RecordingItem(2001, L"cat") ) ->setTextureName(L"record")->setDescriptionId(IDS_ITEM_RECORD_02)->setUseDescriptionId(IDS_DESC_RECORD); + Item::record_01 = ( new RecordingItem(2000, L"13") ) ->setIconName(L"record")->setDescriptionId(IDS_ITEM_RECORD_01)->setUseDescriptionId(IDS_DESC_RECORD); + Item::record_02 = ( new RecordingItem(2001, L"cat") ) ->setIconName(L"record")->setDescriptionId(IDS_ITEM_RECORD_02)->setUseDescriptionId(IDS_DESC_RECORD); // 4J - new records brought forward from 1.2.3 - Item::record_03 = ( new RecordingItem(2002, L"blocks") ) ->setTextureName(L"record")->setDescriptionId(IDS_ITEM_RECORD_03)->setUseDescriptionId(IDS_DESC_RECORD); - Item::record_04 = ( new RecordingItem(2003, L"chirp") ) ->setTextureName(L"record")->setDescriptionId(IDS_ITEM_RECORD_04)->setUseDescriptionId(IDS_DESC_RECORD); - Item::record_05 = ( new RecordingItem(2004, L"far") ) ->setTextureName(L"record")->setDescriptionId(IDS_ITEM_RECORD_05)->setUseDescriptionId(IDS_DESC_RECORD); - Item::record_06 = ( new RecordingItem(2005, L"mall") ) ->setTextureName(L"record")->setDescriptionId(IDS_ITEM_RECORD_06)->setUseDescriptionId(IDS_DESC_RECORD); - Item::record_07 = ( new RecordingItem(2006, L"mellohi") ) ->setTextureName(L"record")->setDescriptionId(IDS_ITEM_RECORD_07)->setUseDescriptionId(IDS_DESC_RECORD); - Item::record_09 = ( new RecordingItem(2007, L"stal") ) ->setTextureName(L"record")->setDescriptionId(IDS_ITEM_RECORD_08)->setUseDescriptionId(IDS_DESC_RECORD); - Item::record_10 = ( new RecordingItem(2008, L"strad") ) ->setTextureName(L"record")->setDescriptionId(IDS_ITEM_RECORD_09)->setUseDescriptionId(IDS_DESC_RECORD); - Item::record_11 = ( new RecordingItem(2009, L"ward") ) ->setTextureName(L"record")->setDescriptionId(IDS_ITEM_RECORD_10)->setUseDescriptionId(IDS_DESC_RECORD); - Item::record_12 = ( new RecordingItem(2010, L"11") ) ->setTextureName(L"record")->setDescriptionId(IDS_ITEM_RECORD_11)->setUseDescriptionId(IDS_DESC_RECORD); - Item::record_08 = ( new RecordingItem(2011, L"where are we now") ) ->setTextureName(L"record")->setDescriptionId(IDS_ITEM_RECORD_12)->setUseDescriptionId(IDS_DESC_RECORD); - + Item::record_03 = ( new RecordingItem(2002, L"blocks") ) ->setIconName(L"record")->setDescriptionId(IDS_ITEM_RECORD_03)->setUseDescriptionId(IDS_DESC_RECORD); + Item::record_04 = ( new RecordingItem(2003, L"chirp") ) ->setIconName(L"record")->setDescriptionId(IDS_ITEM_RECORD_04)->setUseDescriptionId(IDS_DESC_RECORD); + Item::record_05 = ( new RecordingItem(2004, L"far") ) ->setIconName(L"record")->setDescriptionId(IDS_ITEM_RECORD_05)->setUseDescriptionId(IDS_DESC_RECORD); + Item::record_06 = ( new RecordingItem(2005, L"mall") ) ->setIconName(L"record")->setDescriptionId(IDS_ITEM_RECORD_06)->setUseDescriptionId(IDS_DESC_RECORD); + Item::record_07 = ( new RecordingItem(2006, L"mellohi") ) ->setIconName(L"record")->setDescriptionId(IDS_ITEM_RECORD_07)->setUseDescriptionId(IDS_DESC_RECORD); + Item::record_09 = ( new RecordingItem(2007, L"stal") ) ->setIconName(L"record")->setDescriptionId(IDS_ITEM_RECORD_08)->setUseDescriptionId(IDS_DESC_RECORD); + Item::record_10 = ( new RecordingItem(2008, L"strad") ) ->setIconName(L"record")->setDescriptionId(IDS_ITEM_RECORD_09)->setUseDescriptionId(IDS_DESC_RECORD); + Item::record_11 = ( new RecordingItem(2009, L"ward") ) ->setIconName(L"record")->setDescriptionId(IDS_ITEM_RECORD_10)->setUseDescriptionId(IDS_DESC_RECORD); + Item::record_12 = ( new RecordingItem(2010, L"11") ) ->setIconName(L"record")->setDescriptionId(IDS_ITEM_RECORD_11)->setUseDescriptionId(IDS_DESC_RECORD); + Item::record_08 = ( new RecordingItem(2011, L"where are we now") ) ->setIconName(L"record")->setDescriptionId(IDS_ITEM_RECORD_12)->setUseDescriptionId(IDS_DESC_RECORD); // TU9 // putting the fire charge in as a torch, so that it stacks without being near the middle of the selection boxes - Item::fireball = (new FireChargeItem(129)) ->setBaseItemTypeAndMaterial(eBaseItemType_torch, eMaterial_setfire)->setTextureName(L"fireball")->setDescriptionId(IDS_ITEM_FIREBALL)->setUseDescriptionId(IDS_DESC_FIREBALL); - Item::frame = (new HangingEntityItem(133,eTYPE_ITEM_FRAME)) ->setBaseItemTypeAndMaterial(eBaseItemType_HangingItem, eMaterial_glass)->setTextureName(L"frame")->setDescriptionId(IDS_ITEM_ITEMFRAME)->setUseDescriptionId(IDS_DESC_ITEMFRAME); - Item::netherbrick = (new Item(149)) ->setTextureName(L"netherbrick")->setDescriptionId(IDS_ITEM_NETHERBRICK)->setUseDescriptionId(IDS_DESC_ITEM_NETHERBRICK); + Item::fireball = (new FireChargeItem(129)) ->setBaseItemTypeAndMaterial(eBaseItemType_torch, eMaterial_setfire)->setIconName(L"fireball")->setDescriptionId(IDS_ITEM_FIREBALL)->setUseDescriptionId(IDS_DESC_FIREBALL); + Item::frame = (new HangingEntityItem(133,eTYPE_ITEM_FRAME)) ->setBaseItemTypeAndMaterial(eBaseItemType_HangingItem, eMaterial_glass)->setIconName(L"frame")->setDescriptionId(IDS_ITEM_ITEMFRAME)->setUseDescriptionId(IDS_DESC_ITEMFRAME); + // TU12 - Item::skull = (new SkullItem(141)) ->setTextureName(L"skull")->setDescriptionId(IDS_ITEM_SKULL)->setUseDescriptionId(IDS_DESC_SKULL); + Item::skull = (new SkullItem(141)) ->setIconName(L"skull")->setDescriptionId(IDS_ITEM_SKULL)->setUseDescriptionId(IDS_DESC_SKULL); // TU14 //Item::writingBook = (new WritingBookItem(130))->setIcon(11, 11)->setDescriptionId("writingBook"); //Item::writtenBook = (new WrittenBookItem(131))->setIcon(12, 11)->setDescriptionId("writtenBook"); - Item::emerald = (new Item(132)) ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_emerald)->setTextureName(L"emerald")->setDescriptionId(IDS_ITEM_EMERALD)->setUseDescriptionId(IDS_DESC_EMERALD); + Item::emerald = (new Item(132)) ->setBaseItemTypeAndMaterial(eBaseItemType_treasure, eMaterial_emerald)->setIconName(L"emerald")->setDescriptionId(IDS_ITEM_EMERALD)->setUseDescriptionId(IDS_DESC_EMERALD); - Item::flowerPot = (new TilePlanterItem(134, Tile::flowerPot)) ->setTextureName(L"flowerPot")->setDescriptionId(IDS_FLOWERPOT)->setUseDescriptionId(IDS_DESC_FLOWERPOT); + Item::flowerPot = (new TilePlanterItem(134, Tile::flowerPot)) ->setIconName(L"flowerPot")->setDescriptionId(IDS_FLOWERPOT)->setUseDescriptionId(IDS_DESC_FLOWERPOT); - Item::carrots = (new SeedFoodItem(135, 4, FoodConstants::FOOD_SATURATION_NORMAL, Tile::carrots_Id, Tile::farmland_Id)) ->setTextureName(L"carrots")->setDescriptionId(IDS_CARROTS)->setUseDescriptionId(IDS_DESC_CARROTS); - Item::potato = (new SeedFoodItem(136, 1, FoodConstants::FOOD_SATURATION_LOW, Tile::potatoes_Id, Tile::farmland_Id)) ->setTextureName(L"potato")->setDescriptionId(IDS_POTATO)->setUseDescriptionId(IDS_DESC_POTATO); - Item::potatoBaked = (new FoodItem(137, 6, FoodConstants::FOOD_SATURATION_NORMAL, false)) ->setTextureName(L"potatoBaked")->setDescriptionId(IDS_ITEM_POTATO_BAKED)->setUseDescriptionId(IDS_DESC_POTATO_BAKED); - Item::potatoPoisonous = (new FoodItem(138, 2, FoodConstants::FOOD_SATURATION_LOW, false)) ->setEatEffect(MobEffect::poison->id, 5, 0, .6f)->setTextureName(L"potatoPoisonous")->setDescriptionId(IDS_ITEM_POTATO_POISONOUS)->setUseDescriptionId(IDS_DESC_POTATO_POISONOUS); + Item::carrots = (new SeedFoodItem(135, 4, FoodConstants::FOOD_SATURATION_NORMAL, Tile::carrots_Id, Tile::farmland_Id)) ->setIconName(L"carrots")->setDescriptionId(IDS_CARROTS)->setUseDescriptionId(IDS_DESC_CARROTS); + Item::potato = (new SeedFoodItem(136, 1, FoodConstants::FOOD_SATURATION_LOW, Tile::potatoes_Id, Tile::farmland_Id)) ->setIconName(L"potato")->setDescriptionId(IDS_POTATO)->setUseDescriptionId(IDS_DESC_POTATO); + Item::potatoBaked = (new FoodItem(137, 6, FoodConstants::FOOD_SATURATION_NORMAL, false)) ->setIconName(L"potatoBaked")->setDescriptionId(IDS_ITEM_POTATO_BAKED)->setUseDescriptionId(IDS_DESC_POTATO_BAKED); + Item::potatoPoisonous = (new FoodItem(138, 2, FoodConstants::FOOD_SATURATION_LOW, false)) ->setEatEffect(MobEffect::poison->id, 5, 0, .6f)->setIconName(L"potatoPoisonous")->setDescriptionId(IDS_ITEM_POTATO_POISONOUS)->setUseDescriptionId(IDS_DESC_POTATO_POISONOUS); - Item::carrotGolden = (new FoodItem(140, 6, FoodConstants::FOOD_SATURATION_SUPERNATURAL, false)) ->setBaseItemTypeAndMaterial(eBaseItemType_giltFruit, eMaterial_carrot)->setTextureName(L"carrotGolden")->setPotionBrewingFormula(PotionBrewing::MOD_GOLDENCARROT)->setDescriptionId(IDS_ITEM_CARROT_GOLDEN)->setUseDescriptionId(IDS_DESC_CARROT_GOLDEN); + Item::emptyMap = (EmptyMapItem *) (new EmptyMapItem(139))->setIconName(L"map_empty")->setDescriptionId(IDS_ITEM_MAP_EMPTY)->setUseDescriptionId(IDS_DESC_MAP_EMPTY); - Item::carrotOnAStick = (new CarrotOnAStickItem(142)) ->setBaseItemTypeAndMaterial(eBaseItemType_rod, eMaterial_carrot)->setTextureName(L"carrotOnAStick")->setDescriptionId(IDS_ITEM_CARROT_ON_A_STICK)->setUseDescriptionId(IDS_DESC_CARROT_ON_A_STICK); - Item::pumpkinPie = (new FoodItem(144, 8, FoodConstants::FOOD_SATURATION_LOW, false)) ->setTextureName(L"pumpkinPie")->setDescriptionId(IDS_ITEM_PUMPKIN_PIE)->setUseDescriptionId(IDS_DESC_PUMPKIN_PIE); + Item::carrotGolden = (new FoodItem(140, 6, FoodConstants::FOOD_SATURATION_SUPERNATURAL, false)) ->setBaseItemTypeAndMaterial(eBaseItemType_giltFruit, eMaterial_carrot)->setIconName(L"carrotGolden")->setPotionBrewingFormula(PotionBrewing::MOD_GOLDENCARROT)->setDescriptionId(IDS_ITEM_CARROT_GOLDEN)->setUseDescriptionId(IDS_DESC_CARROT_GOLDEN); - EnchantedBookItem::enchantedBook = (EnchantedBookItem *)(new EnchantedBookItem(147)) ->setMaxStackSize(1)->setTextureName(L"enchantedBook")->setDescriptionId(IDS_ITEM_ENCHANTED_BOOK)->setUseDescriptionId(IDS_DESC_ENCHANTED_BOOK); - Item::netherQuartz = (new Item(150))->setTextureName(L"netherquartz")->setDescriptionId(IDS_ITEM_NETHER_QUARTZ)->setUseDescriptionId(IDS_DESC_NETHER_QUARTZ); -} + Item::carrotOnAStick = (new CarrotOnAStickItem(142)) ->setBaseItemTypeAndMaterial(eBaseItemType_rod, eMaterial_carrot)->setIconName(L"carrotOnAStick")->setDescriptionId(IDS_ITEM_CARROT_ON_A_STICK)->setUseDescriptionId(IDS_DESC_CARROT_ON_A_STICK); + Item::netherStar = (new SimpleFoiledItem(143)) ->setIconName(L"nether_star")->setDescriptionId(IDS_NETHER_STAR)->setUseDescriptionId(IDS_DESC_NETHER_STAR); + Item::pumpkinPie = (new FoodItem(144, 8, FoodConstants::FOOD_SATURATION_LOW, false)) ->setIconName(L"pumpkinPie")->setDescriptionId(IDS_ITEM_PUMPKIN_PIE)->setUseDescriptionId(IDS_DESC_PUMPKIN_PIE); + Item::fireworks = (new FireworksItem(145)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_fireworks, Item::eMaterial_undefined)->setIconName(L"fireworks")->setDescriptionId(IDS_FIREWORKS)->setUseDescriptionId(IDS_DESC_FIREWORKS); + Item::fireworksCharge = (new FireworksChargeItem(146)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_fireworks, Item::eMaterial_undefined)->setIconName(L"fireworks_charge")->setDescriptionId(IDS_FIREWORKS_CHARGE)->setUseDescriptionId(IDS_DESC_FIREWORKS_CHARGE); + EnchantedBookItem::enchantedBook = (EnchantedBookItem *)(new EnchantedBookItem(147)) ->setMaxStackSize(1)->setIconName(L"enchantedBook")->setDescriptionId(IDS_ITEM_ENCHANTED_BOOK)->setUseDescriptionId(IDS_DESC_ENCHANTED_BOOK); + Item::comparator = (new TilePlanterItem(148, Tile::comparator_off)) ->setIconName(L"comparator")->setDescriptionId(IDS_ITEM_COMPARATOR)->setUseDescriptionId(IDS_DESC_COMPARATOR); + Item::netherbrick = (new Item(149)) ->setIconName(L"netherbrick")->setDescriptionId(IDS_ITEM_NETHERBRICK)->setUseDescriptionId(IDS_DESC_ITEM_NETHERBRICK); + Item::netherQuartz = (new Item(150)) ->setIconName(L"netherquartz")->setDescriptionId(IDS_ITEM_NETHER_QUARTZ)->setUseDescriptionId(IDS_DESC_NETHER_QUARTZ); + Item::minecart_tnt = (new MinecartItem(151, Minecart::TYPE_TNT)) ->setIconName(L"minecart_tnt")->setDescriptionId(IDS_ITEM_MINECART_TNT)->setUseDescriptionId(IDS_DESC_MINECART_TNT); + Item::minecart_hopper = (new MinecartItem(152, Minecart::TYPE_HOPPER)) ->setIconName(L"minecart_hopper")->setDescriptionId(IDS_ITEM_MINECART_HOPPER)->setUseDescriptionId(IDS_DESC_MINECART_HOPPER); + + Item::horseArmorMetal = (new Item(161)) ->setIconName(L"iron_horse_armor")->setMaxStackSize(1)->setDescriptionId(IDS_ITEM_IRON_HORSE_ARMOR)->setUseDescriptionId(IDS_DESC_IRON_HORSE_ARMOR); + Item::horseArmorGold = (new Item(162)) ->setIconName(L"gold_horse_armor")->setMaxStackSize(1)->setDescriptionId(IDS_ITEM_GOLD_HORSE_ARMOR)->setUseDescriptionId(IDS_DESC_GOLD_HORSE_ARMOR); + Item::horseArmorDiamond = (new Item(163)) ->setIconName(L"diamond_horse_armor")->setMaxStackSize(1)->setDescriptionId(IDS_ITEM_DIAMOND_HORSE_ARMOR)->setUseDescriptionId(IDS_DESC_DIAMOND_HORSE_ARMOR); + Item::lead = (new LeashItem(164)) ->setBaseItemTypeAndMaterial(eBaseItemType_pockettool, eMaterial_undefined)->setIconName(L"lead")->setDescriptionId(IDS_ITEM_LEAD)->setUseDescriptionId(IDS_DESC_LEAD); + Item::nameTag = (new NameTagItem(165)) ->setIconName(L"name_tag")->setDescriptionId(IDS_ITEM_NAME_TAG)->setUseDescriptionId(IDS_DESC_NAME_TAG);} // 4J Stu - We need to do this after the staticCtor AND after staticCtors for other class @@ -476,7 +504,7 @@ void Item::staticInit() } -_Tier::Tier(int level, int uses, float speed, int damage, int enchantmentValue) : +_Tier::Tier(int level, int uses, float speed, float damage, int enchantmentValue) : level( level ), uses( uses ), speed( speed ), @@ -496,7 +524,7 @@ float _Tier::getSpeed() const return speed; } -int _Tier::getAttackDamageBonus() const +float _Tier::getAttackDamageBonus() const { return damage; } @@ -519,7 +547,7 @@ int _Tier::getTierItemId() const } else if (this == Tier::STONE) { - return Tile::stoneBrick_Id; + return Tile::cobblestone_Id; } else if (this == Tier::GOLD) { @@ -582,13 +610,18 @@ int Item::getMaterial() return this->m_iMaterial; } -Item *Item::setTextureName(const wstring &name) +Item *Item::setIconName(const wstring &name) { m_textureName = name; return this; } +wstring Item::getIconName() +{ + return m_textureName; +} + Item *Item::setMaxStackSize(int max) { maxStackSize = max; @@ -610,11 +643,6 @@ Icon *Item::getIcon(shared_ptr itemInstance) return getIcon(itemInstance->getAuxValue()); } -const bool Item::useOn(shared_ptr itemInstance, Level *level, int x, int y, int z, int face, bool bTestUseOnOnly) -{ - return false; -} - bool Item::useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { return false; @@ -625,7 +653,7 @@ float Item::getDestroySpeed(shared_ptr itemInstance, Tile *tile) return 1; } -bool Item::TestUse(Level *level, shared_ptr player) +bool Item::TestUse(shared_ptr itemInstance, Level *level, shared_ptr player) { return false; } @@ -689,7 +717,7 @@ bool Item::canBeDepleted() * @param attacker * @return */ -bool Item::hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker) +bool Item::hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker) { return false; } @@ -705,7 +733,7 @@ bool Item::hurtEnemy(shared_ptr itemInstance, shared_ptr mob, * @param owner * @return */ -bool Item::mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner) +bool Item::mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner) { return false; } @@ -720,14 +748,14 @@ bool Item::canDestroySpecial(Tile *tile) return false; } -bool Item::interactEnemy(shared_ptr itemInstance, shared_ptr mob) +bool Item::interactEnemy(shared_ptr itemInstance, shared_ptr player, shared_ptr mob) { return false; } Item *Item::handEquipped() { - this->m_handEquipped = true; + m_handEquipped = true; return this; } @@ -864,7 +892,7 @@ bool Item::hasPotionBrewingFormula() return !potionBrewingFormula.empty(); } -void Item::appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings) +void Item::appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced) { } @@ -935,6 +963,11 @@ Icon *Item::getLayerIcon(int auxValue, int spriteLayer) return getIcon(auxValue); } +bool Item::mayBePlacedInAdventureMode() +{ + return true; +} + bool Item::isValidRepairItem(shared_ptr source, shared_ptr repairItem) { return false; @@ -945,6 +978,11 @@ void Item::registerIcons(IconRegister *iconRegister) icon = iconRegister->registerIcon(m_textureName); } +attrAttrModMap *Item::getDefaultAttributeModifiers() +{ + return new attrAttrModMap(); +} + /* 4J: These are necesary on the PS3. @@ -984,7 +1022,7 @@ const int Item::pickAxe_gold_Id ; const int Item::hatchet_gold_Id ; const int Item::string_Id ; const int Item::feather_Id ; -const int Item::sulphur_Id ; +const int Item::gunpowder_Id ; const int Item::hoe_wood_Id ; const int Item::hoe_stone_Id ; const int Item::hoe_iron_Id ; @@ -993,10 +1031,10 @@ const int Item::hoe_gold_Id ; const int Item::seeds_wheat_Id ; const int Item::wheat_Id ; const int Item::bread_Id ; -const int Item::helmet_cloth_Id ; -const int Item::chestplate_cloth_Id ; -const int Item::leggings_cloth_Id ; -const int Item::boots_cloth_Id ; +const int Item::helmet_leather_Id ; +const int Item::chestplate_leather_Id ; +const int Item::leggings_leather_Id ; +const int Item::boots_leather_Id ; const int Item::helmet_chain_Id ; const int Item::chestplate_chain_Id ; const int Item::leggings_chain_Id ; @@ -1030,7 +1068,7 @@ const int Item::redStone_Id ; const int Item::snowBall_Id ; const int Item::boat_Id ; const int Item::leather_Id ; -const int Item::milk_Id ; +const int Item::bucket_milk_Id ; const int Item::brick_Id ; const int Item::clay_Id ; const int Item::reeds_Id ; @@ -1051,7 +1089,7 @@ const int Item::bone_Id ; const int Item::sugar_Id ; const int Item::cake_Id ; const int Item::bed_Id ; -const int Item::diode_Id ; +const int Item::repeater_Id ; const int Item::cookie_Id ; const int Item::map_Id ; const int Item::shears_Id ; @@ -1067,7 +1105,7 @@ const int Item::enderPearl_Id ; const int Item::blazeRod_Id ; const int Item::ghastTear_Id ; const int Item::goldNugget_Id ; -const int Item::netherStalkSeeds_Id ; +const int Item::netherwart_seeds_Id; const int Item::potion_Id ; const int Item::glassBottle_Id ; const int Item::spiderEye_Id ; @@ -1078,7 +1116,7 @@ const int Item::brewingStand_Id ; const int Item::cauldron_Id ; const int Item::eyeOfEnder_Id ; const int Item::speckledMelon_Id ; -const int Item::monsterPlacer_Id ; +const int Item::spawnEgg_Id; const int Item::expBottle_Id ; const int Item::skull_Id ; const int Item::record_01_Id ; diff --git a/Minecraft.World/Item.h b/Minecraft.World/Item.h index 727fc661..0f9a8b1b 100644 --- a/Minecraft.World/Item.h +++ b/Minecraft.World/Item.h @@ -20,12 +20,16 @@ class ArmorItem; class BowItem; class FishingRodItem; class EnchantedBookItem; +class EmptyMapItem; #define ITEM_ICON_COLUMNS 16 class Item : public enable_shared_from_this { +protected: + //static const UUID BASE_ATTACK_DAMAGE_UUID; + public: static const int ITEM_NUM_COUNT = 32000; @@ -79,7 +83,14 @@ public: eMaterial_emerald, eMaterial_quartz, eMaterial_apple, - eMaterial_carrot + eMaterial_carrot, + eMaterial_redstone, + eMaterial_coal, + eMaterial_paper, + eMaterial_book, + eMaterial_bookshelf, + eMaterial_wheat, + } eMaterial; @@ -123,6 +134,12 @@ public: eBaseItemType_rod, eBaseItemType_giltFruit, eBaseItemType_carpet, + eBaseItemType_clay, + eBaseItemType_glass, + eBaseItemType_redstoneContainer, + eBaseItemType_fireworks, + eBaseItemType_lever, + eBaseItemType_paper, eBaseItemType_MAXTYPES, } eBaseItemType; @@ -146,25 +163,20 @@ public: const int level; const int uses; const float speed; - const int damage; + const float damage; const int enchantmentValue; // 4J Stu - Had to make this public but was protected // We shouldn't be creating these except the static initialisation public: - Tier(int level, int uses, float speed, int damage, int enchantmentValue); + Tier(int level, int uses, float speed, float damage, int enchantmentValue); public: int getUses() const; - float getSpeed() const; - - int getAttackDamageBonus() const; - + float getAttackDamageBonus() const; int getLevel() const; - int getEnchantmentValue() const; - int getTierItemId() const; }; @@ -216,7 +228,7 @@ public: static Item *string; static Item *feather; - static Item *sulphur; + static Item *gunpowder; static Item *hoe_wood; static Item *hoe_stone; @@ -228,10 +240,10 @@ public: static Item *wheat; static Item *bread; - static ArmorItem *helmet_cloth; - static ArmorItem *chestplate_cloth; - static ArmorItem *leggings_cloth; - static ArmorItem *boots_cloth; + static ArmorItem *helmet_leather; + static ArmorItem *chestplate_leather; + static ArmorItem *leggings_leather; + static ArmorItem *boots_leather; static ArmorItem *helmet_chain; static ArmorItem *chestplate_chain; @@ -276,7 +288,7 @@ public: static Item *boat; static Item *leather; - static Item *milk; + static Item *bucket_milk; static Item *brick; static Item *clay; static Item *reeds; @@ -300,7 +312,7 @@ public: static Item *bed; - static Item *diode; + static Item *repeater; static Item *cookie; static MapItem *map; @@ -324,7 +336,7 @@ public: static Item *ghastTear; static Item *goldNugget; - static Item *netherStalkSeeds; + static Item *netherwart_seeds; static PotionItem *potion; static Item *glassBottle; @@ -340,7 +352,7 @@ public: static Item *eyeOfEnder; static Item *speckledMelon; - static Item *monsterPlacer; + static Item *spawnEgg; static Item *expBottle; @@ -362,7 +374,6 @@ public: // TU9 static Item *fireball; static Item *frame; - static Item *netherbrick; // TU14 //static Item writingBook; @@ -377,13 +388,29 @@ public: static Item *potatoBaked; static Item *potatoPoisonous; + static EmptyMapItem *emptyMap; + static Item *carrotGolden; static Item *carrotOnAStick; + static Item *netherStar; static Item *pumpkinPie; + + static Item *fireworks; + static Item *fireworksCharge; static Item *netherQuartz; + static Item *comparator; + static Item *netherbrick; static EnchantedBookItem *enchantedBook; + static Item *minecart_tnt; + static Item *minecart_hopper; + + static Item *horseArmorMetal; + static Item *horseArmorGold; + static Item *horseArmorDiamond; + static Item *lead; + static Item *nameTag; static const int shovel_iron_Id = 256; @@ -419,7 +446,7 @@ public: static const int hatchet_gold_Id = 286; static const int string_Id = 287; static const int feather_Id = 288; - static const int sulphur_Id = 289; + static const int gunpowder_Id = 289; static const int hoe_wood_Id = 290; static const int hoe_stone_Id = 291; static const int hoe_iron_Id = 292; @@ -429,10 +456,10 @@ public: static const int wheat_Id = 296; static const int bread_Id = 297; - static const int helmet_cloth_Id = 298; - static const int chestplate_cloth_Id = 299; - static const int leggings_cloth_Id = 300; - static const int boots_cloth_Id = 301; + static const int helmet_leather_Id = 298; + static const int chestplate_leather_Id = 299; + static const int leggings_leather_Id = 300; + static const int boots_leather_Id = 301; static const int helmet_chain_Id = 302; static const int chestplate_chain_Id = 303; @@ -471,7 +498,7 @@ public: static const int snowBall_Id = 332; static const int boat_Id = 333; static const int leather_Id = 334; - static const int milk_Id = 335; + static const int bucket_milk_Id = 335; static const int brick_Id = 336; static const int clay_Id = 337; static const int reeds_Id = 338; @@ -492,7 +519,7 @@ public: static const int sugar_Id = 353; static const int cake_Id = 354; static const int bed_Id = 355; - static const int diode_Id = 356; + static const int repeater_Id = 356; static const int cookie_Id = 357; static const int map_Id = 358; @@ -514,7 +541,7 @@ public: static const int blazeRod_Id = 369; static const int ghastTear_Id = 370; static const int goldNugget_Id = 371; - static const int netherStalkSeeds_Id = 372; + static const int netherwart_seeds_Id = 372; static const int potion_Id = 373; static const int glassBottle_Id = 374; static const int spiderEye_Id = 375; @@ -527,7 +554,7 @@ public: static const int speckledMelon_Id = 382; // 1.1 - static const int monsterPlacer_Id = 383; + static const int spawnEgg_Id = 383; static const int expBottle_Id = 384; @@ -552,7 +579,6 @@ public: // TU9 static const int fireball_Id = 385; static const int itemFrame_Id = 389; - static const int netherbrick_Id = 405; // TU14 //static const int writingBook_Id = 130; @@ -567,14 +593,30 @@ public: static const int potatoBaked_Id = 393; static const int potatoPoisonous_Id = 394; + static const int emptyMap_Id = 395; static const int carrotGolden_Id = 396; static const int carrotOnAStick_Id = 398; + static const int netherStar_Id = 399; static const int pumpkinPie_Id = 400; + static const int fireworks_Id = 401; + static const int fireworksCharge_Id = 402; + static const int enchantedBook_Id = 403; + + static const int comparator_Id = 404; + static const int netherbrick_Id = 405; static const int netherQuartz_Id = 406; + static const int minecart_tnt_Id = 407; + static const int minecart_hopper_Id = 408; + + static const int horseArmorMetal_Id = 417; + static const int horseArmorGold_Id = 418; + static const int horseArmorDiamond_Id = 419; + static const int lead_Id = 420; + static const int nameTag_Id = 421; public: const int id; @@ -610,7 +652,8 @@ protected: public: // 4J Using per-item textures now - Item *setTextureName(const wstring &name); + Item *setIconName(const wstring &name); + wstring getIconName(); Item *setMaxStackSize(int max); Item *setBaseItemTypeAndMaterial(int iType,int iMaterial); int getBaseItemType(); @@ -620,11 +663,9 @@ public: virtual Icon *getIcon(int auxValue); Icon *getIcon(shared_ptr itemInstance); - const bool useOn(shared_ptr itemInstance, Level *level, int x, int y, int z, int face, bool bTestUseOnOnly=false); - virtual bool useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); virtual float getDestroySpeed(shared_ptr itemInstance, Tile *tile); - virtual bool TestUse(Level *level, shared_ptr player); + virtual bool TestUse(shared_ptr itemInstance, Level *level, shared_ptr player); virtual shared_ptr use(shared_ptr itemInstance, Level *level, shared_ptr player); virtual shared_ptr useTimeDepleted(shared_ptr itemInstance, Level *level, shared_ptr player); virtual int getMaxStackSize(); @@ -651,7 +692,7 @@ public: * @param attacker * @return */ - virtual bool hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker); + virtual bool hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker); /** * Returns true when the item was used to mine more efficiently @@ -664,10 +705,10 @@ public: * @param owner * @return */ - virtual bool mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner); + virtual bool mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner); virtual int getAttackDamage(shared_ptr entity); virtual bool canDestroySpecial(Tile *tile); - virtual bool interactEnemy(shared_ptr itemInstance, shared_ptr mob); + virtual bool interactEnemy(shared_ptr itemInstance, shared_ptr player, shared_ptr mob); Item *handEquipped(); virtual bool isHandEquipped(); virtual bool isMirroredArt(); @@ -700,7 +741,7 @@ protected: public: virtual wstring getPotionBrewingFormula(); virtual bool hasPotionBrewingFormula(); - virtual void appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced, vector &unformattedStrings); // 4J Added unformattedStrings + virtual void appendHoverText(shared_ptr itemInstance, shared_ptr player, vector *lines, bool advanced); virtual wstring getHoverName(shared_ptr itemInstance); virtual bool isFoil(shared_ptr itemInstance); virtual const Rarity *getRarity(shared_ptr itemInstance); @@ -713,6 +754,8 @@ public: virtual int getEnchantmentValue(); virtual bool hasMultipleSpriteLayers(); virtual Icon *getLayerIcon(int auxValue, int spriteLayer); + virtual bool mayBePlacedInAdventureMode(); virtual bool isValidRepairItem(shared_ptr source, shared_ptr repairItem); virtual void registerIcons(IconRegister *iconRegister); + virtual attrAttrModMap *getDefaultAttributeModifiers(); }; diff --git a/Minecraft.World/ItemDispenseBehaviors.cpp b/Minecraft.World/ItemDispenseBehaviors.cpp new file mode 100644 index 00000000..f66afe31 --- /dev/null +++ b/Minecraft.World/ItemDispenseBehaviors.cpp @@ -0,0 +1,457 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.item.h" +#include "net.minecraft.world.entity.projectile.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.tile.entity.h" +#include "net.minecraft.world.item.h" +#include "ItemDispenseBehaviors.h" + +/* Arrow */ + +shared_ptr ArrowDispenseBehavior::getProjectile(Level *world, Position *position) +{ + shared_ptr arrow = shared_ptr(new Arrow(world, position->getX(), position->getY(), position->getZ())); + arrow->pickup = Arrow::PICKUP_ALLOWED; + + return arrow; +} + +/* ThrownEgg */ + +shared_ptr EggDispenseBehavior::getProjectile(Level *world, Position *position) +{ + return shared_ptr(new ThrownEgg(world, position->getX(), position->getY(), position->getZ())); +} + + +/* Snowball */ + +shared_ptr SnowballDispenseBehavior::getProjectile(Level *world, Position *position) +{ + return shared_ptr(new Snowball(world, position->getX(), position->getY(), position->getZ())); +} + + +/* Exp Bottle */ + +shared_ptr ExpBottleDispenseBehavior::getProjectile(Level *world, Position *position) +{ + return shared_ptr(new ThrownExpBottle(world, position->getX(), position->getY(), position->getZ())); +} + +float ExpBottleDispenseBehavior::getUncertainty() +{ + return AbstractProjectileDispenseBehavior::getUncertainty() * .5f; +} + +float ExpBottleDispenseBehavior::getPower() +{ + return AbstractProjectileDispenseBehavior::getPower() * 1.25f; +} + + +/* Thrown Potion */ + +ThrownPotionDispenseBehavior::ThrownPotionDispenseBehavior(int potionValue) +{ + m_potionValue = potionValue; +} + +shared_ptr ThrownPotionDispenseBehavior::getProjectile(Level *world, Position *position) +{ + return shared_ptr(new ThrownPotion(world, position->getX(), position->getY(), position->getZ(), m_potionValue)); +} + +float ThrownPotionDispenseBehavior::getUncertainty() +{ + return AbstractProjectileDispenseBehavior::getUncertainty() * .5f; +} + +float ThrownPotionDispenseBehavior::getPower() +{ + return AbstractProjectileDispenseBehavior::getPower() * 1.25f; +} + + +/* Potion */ + +shared_ptr PotionDispenseBehavior::dispense(BlockSource *source, shared_ptr dispensed) +{ + if (PotionItem::isThrowable(dispensed->getAuxValue())) + { + return ThrownPotionDispenseBehavior(dispensed->getAuxValue()).dispense(source, dispensed); + } + else + { + return DefaultDispenseItemBehavior::dispense(source, dispensed); + } +} + + +/* SpawnEggItem */ + +shared_ptr SpawnEggDispenseBehavior::execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome) +{ + FacingEnum *facing = DispenserTile::getFacing(source->getData()); + + // Spawn entity in the middle of the block in front of the dispenser + double spawnX = source->getX() + facing->getStepX(); + double spawnY = source->getBlockY() + .2f; // Above pressure plates + double spawnZ = source->getZ() + facing->getStepZ(); + + int iResult = 0; + shared_ptr entity = SpawnEggItem::spawnMobAt(source->getWorld(), dispensed->getAuxValue(), spawnX, spawnY, spawnZ, &iResult); + + // 4J-JEV: Added in-case spawn limit is encountered. + if (entity == NULL) + { + outcome = LEFT_ITEM; + return dispensed; + } + + if (entity->instanceof(eTYPE_MOB) && dispensed->hasCustomHoverName()) + { + dynamic_pointer_cast(entity)->setCustomName(dispensed->getHoverName()); + } + + outcome = ACTIVATED_ITEM; + + dispensed->remove(1); + return dispensed; +} + + +/* Fireworks*/ + +shared_ptr FireworksDispenseBehavior::execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome) +{ + Level *world = source->getWorld(); + if ( world->countInstanceOf(eTYPE_PROJECTILE,false) >= Level::MAX_DISPENSABLE_PROJECTILES ) + { + outcome = LEFT_ITEM; + return dispensed; + } + + FacingEnum *facing = DispenserTile::getFacing(source->getData()); + + double spawnX = source->getX() + facing->getStepX(); + double spawnY = source->getBlockY() + .2f; + double spawnZ = source->getZ() + facing->getStepZ(); + + shared_ptr firework = shared_ptr(new FireworksRocketEntity(world, spawnX, spawnY, spawnZ, dispensed)); + source->getWorld()->addEntity(firework); + + outcome = ACTIVATED_ITEM; + + dispensed->remove(1); + return dispensed; +} + +void FireworksDispenseBehavior::playSound(BlockSource *source, eOUTCOME outcome) +{ + // 4J-JEV: This is exactly the same as the default at the moment. + //source->getWorld()->levelEvent(LevelEvent::SOUND_CLICK, source->getBlockX(), source->getBlockY(), source->getBlockZ(), 0); + + DefaultDispenseItemBehavior::playSound(source,outcome); +} + + +/* Fireballs */ + +shared_ptr FireballDispenseBehavior::execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome) +{ + Level *world = source->getWorld(); + if (world->countInstanceOf(eTYPE_SMALL_FIREBALL,true) >= Level::MAX_DISPENSABLE_FIREBALLS) + { + outcome = LEFT_ITEM; + return dispensed; + } + + FacingEnum *facing = DispenserTile::getFacing(source->getData()); + + Position *position = DispenserTile::getDispensePosition(source); + double spawnX = position->getX() + facing->getStepX() * .3f; + double spawnY = position->getY() + facing->getStepX() * .3f; + double spawnZ = position->getZ() + facing->getStepZ() * .3f; + + delete position; + + Random *random = world->random; + + double dirX = random->nextGaussian() * .05 + facing->getStepX(); + double dirY = random->nextGaussian() * .05 + facing->getStepY(); + double dirZ = random->nextGaussian() * .05 + facing->getStepZ(); + + world->addEntity(shared_ptr(new SmallFireball(world, spawnX, spawnY, spawnZ, dirX, dirY, dirZ))); + + outcome = ACTIVATED_ITEM; + + dispensed->remove(1); + return dispensed; +} + +void FireballDispenseBehavior::playSound(BlockSource *source, eOUTCOME outcome) +{ + if (outcome == ACTIVATED_ITEM) + { + source->getWorld()->levelEvent(LevelEvent::SOUND_BLAZE_FIREBALL, source->getBlockX(), source->getBlockY(), source->getBlockZ(), 0); + } + else + { + DefaultDispenseItemBehavior::playSound(source, outcome); + } +} + + +/* Boats */ + +BoatDispenseBehavior::BoatDispenseBehavior() : DefaultDispenseItemBehavior() +{ + defaultDispenseItemBehavior = new DefaultDispenseItemBehavior(); +} + +BoatDispenseBehavior::~BoatDispenseBehavior() +{ + delete defaultDispenseItemBehavior; +} + +shared_ptr BoatDispenseBehavior::execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome) +{ + FacingEnum *facing = DispenserTile::getFacing(source->getData()); + Level *world = source->getWorld(); + + // Spawn the boat 'just' outside the dispenser, it overlaps 2 'pixels' now. + double spawnX = source->getX() + facing->getStepX() * (1 + 2.0f / 16); + double spawnY = source->getY() + facing->getStepY() * (1 + 2.0f / 16); + double spawnZ = source->getZ() + facing->getStepZ() * (1 + 2.0f / 16); + + int frontX = source->getBlockX() + facing->getStepX(); + int frontY = source->getBlockY() + facing->getStepY(); + int frontZ = source->getBlockZ() + facing->getStepZ(); + Material *inFront = world->getMaterial(frontX, frontY, frontZ); + + double yOffset; + + // 4J: If we're at limit, just dispense item (instead of adding boat) + if (world->countInstanceOf(eTYPE_BOAT, true) >= Level::MAX_XBOX_BOATS) + { + return defaultDispenseItemBehavior->dispense(source, dispensed); + } + + if (Material::water == inFront) + { + yOffset = 1; + } + else if (Material::air == inFront && Material::water == world->getMaterial(frontX, frontY - 1, frontZ)) + { + yOffset = 0; + } + else + { + return defaultDispenseItemBehavior->dispense(source, dispensed); + } + + outcome = ACTIVATED_ITEM; + + shared_ptr boat = shared_ptr(new Boat(world, spawnX, spawnY + yOffset, spawnZ)); + world->addEntity(boat); + + dispensed->remove(1); + return dispensed; +} + +void BoatDispenseBehavior::playSound(BlockSource *source, eOUTCOME outcome) +{ + // 4J-JEV: This is exactly the same as the default at the moment. + //source->getWorld()->levelEvent(LevelEvent::SOUND_CLICK, source->getBlockX(), source->getBlockY(), source->getBlockZ(), 0); + DefaultDispenseItemBehavior::playSound(source,outcome); +} + + +/* FilledBucket */ + +shared_ptr FilledBucketDispenseBehavior::execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome) +{ + BucketItem *bucket = (BucketItem *)dispensed->getItem(); + int sourceX = source->getBlockX(); + int sourceY = source->getBlockY(); + int sourceZ = source->getBlockZ(); + + FacingEnum *facing = DispenserTile::getFacing(source->getData()); + if (bucket->emptyBucket(source->getWorld(), sourceX + facing->getStepX(), sourceY + facing->getStepY(), sourceZ + facing->getStepZ())) + { + dispensed->id = Item::bucket_empty->id; + dispensed->count = 1; + + outcome = ACTIVATED_ITEM; + return dispensed; + } + + return DefaultDispenseItemBehavior::dispense(source, dispensed); +} + + +/* EmptyBucket */ + +shared_ptr EmptyBucketDispenseBehavior::execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome) +{ + FacingEnum *facing = DispenserTile::getFacing(source->getData()); + Level *world = source->getWorld(); + + int targetX = source->getBlockX() + facing->getStepX(); + int targetY = source->getBlockY() + facing->getStepY(); + int targetZ = source->getBlockZ() + facing->getStepZ(); + + Material *material = world->getMaterial(targetX, targetY, targetZ); + int dataValue = world->getData(targetX, targetY, targetZ); + + Item *targetType; + if (Material::water == material && dataValue == 0) + { + targetType = Item::bucket_water; + } + else if (Material::lava == material && dataValue == 0) + { + targetType = Item::bucket_lava; + } + else + { + return DefaultDispenseItemBehavior::execute(source, dispensed, outcome); + } + + world->removeTile(targetX, targetY, targetZ); + if (--dispensed->count == 0) + { + dispensed->id = targetType->id; + dispensed->count = 1; + } + else if (dynamic_pointer_cast(source->getEntity())->addItem(shared_ptr(new ItemInstance(targetType))) < 0) + { + DefaultDispenseItemBehavior::dispense(source, shared_ptr(new ItemInstance(targetType))); + } + + outcome = ACTIVATED_ITEM; + return dispensed; +} + + +/* Flint and Steel */ + +shared_ptr FlintAndSteelDispenseBehavior::execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome) +{ + outcome = ACTIVATED_ITEM; + + FacingEnum *facing = DispenserTile::getFacing(source->getData()); + Level *world = source->getWorld(); + + int targetX = source->getBlockX() + facing->getStepX(); + int targetY = source->getBlockY() + facing->getStepY(); + int targetZ = source->getBlockZ() + facing->getStepZ(); + + if (world->isEmptyTile(targetX, targetY, targetZ)) + { + world->setTileAndUpdate(targetX, targetY, targetZ, Tile::fire_Id); + + if (dispensed->hurt(1, world->random)) + { + dispensed->count = 0; + } + } + else if (world->getTile(targetX, targetY, targetZ) == Tile::tnt_Id) + { + Tile::tnt->destroy(world, targetX, targetY, targetZ, 1); + world->removeTile(targetX, targetY, targetZ); + } + else + { + outcome = LEFT_ITEM; + } + + return dispensed; +} + +void FlintAndSteelDispenseBehavior::playSound(BlockSource *source, eOUTCOME outcome) +{ + if (outcome == ACTIVATED_ITEM) + { + source->getWorld()->levelEvent(LevelEvent::SOUND_CLICK, source->getBlockX(), source->getBlockY(), source->getBlockZ(), 0); + } + else + { + source->getWorld()->levelEvent(LevelEvent::SOUND_CLICK_FAIL, source->getBlockX(), source->getBlockY(), source->getBlockZ(), 0); + } +} + + +/* Dye */ + +shared_ptr DyeDispenseBehavior::execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome) +{ + if (dispensed->getAuxValue() == DyePowderItem::WHITE) + { + FacingEnum *facing = DispenserTile::getFacing(source->getData()); + Level *world = source->getWorld(); + + int targetX = source->getBlockX() + facing->getStepX(); + int targetY = source->getBlockY() + facing->getStepY(); + int targetZ = source->getBlockZ() + facing->getStepZ(); + + if (DyePowderItem::growCrop(dispensed, world, targetX, targetY, targetZ, false)) + { + if (!world->isClientSide) world->levelEvent(LevelEvent::PARTICLES_PLANT_GROWTH, targetX, targetY, targetZ, 0); + outcome = ACTIVATED_ITEM; + } + else + { + outcome = LEFT_ITEM; + } + + + return dispensed; + } + else + { + return DefaultDispenseItemBehavior::execute(source, dispensed, outcome); + } +} + +void DyeDispenseBehavior::playSound(BlockSource *source, eOUTCOME outcome) +{ + if (outcome == ACTIVATED_ITEM) + { + source->getWorld()->levelEvent(LevelEvent::SOUND_CLICK, source->getBlockX(), source->getBlockY(), source->getBlockZ(), 0); + } + else + { + source->getWorld()->levelEvent(LevelEvent::SOUND_CLICK_FAIL, source->getBlockX(), source->getBlockY(), source->getBlockZ(), 0); + } +} + + +/* TNT */ + +shared_ptr TntDispenseBehavior::execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome) +{ + FacingEnum *facing = DispenserTile::getFacing(source->getData()); + Level *world = source->getWorld(); + + if( world->newPrimedTntAllowed() && app.GetGameHostOption(eGameHostOption_TNT) ) + { + int targetX = source->getBlockX() + facing->getStepX(); + int targetY = source->getBlockY() + facing->getStepY(); + int targetZ = source->getBlockZ() + facing->getStepZ(); + + shared_ptr tnt = shared_ptr(new PrimedTnt(world, targetX + 0.5f, targetY + 0.5f, targetZ + 0.5f, nullptr)); + world->addEntity(tnt); + + outcome = ACTIVATED_ITEM; + + dispensed->count--; + } + else + { + outcome = LEFT_ITEM; + } + return dispensed; +} \ No newline at end of file diff --git a/Minecraft.World/ItemDispenseBehaviors.h b/Minecraft.World/ItemDispenseBehaviors.h new file mode 100644 index 00000000..4635c8a4 --- /dev/null +++ b/Minecraft.World/ItemDispenseBehaviors.h @@ -0,0 +1,117 @@ +#pragma once +#include "DefaultDispenseItemBehavior.h" +#include "AbstractProjectileDispenseBehavior.h" + +class ArrowDispenseBehavior : public AbstractProjectileDispenseBehavior +{ +protected: + virtual shared_ptr getProjectile(Level *world, Position *position); +}; + +class EggDispenseBehavior : public AbstractProjectileDispenseBehavior +{ +protected: + virtual shared_ptr getProjectile(Level *world, Position *position); +}; + +class SnowballDispenseBehavior : public AbstractProjectileDispenseBehavior +{ +protected: + virtual shared_ptr getProjectile(Level *world, Position *position); +}; + +class ExpBottleDispenseBehavior : public AbstractProjectileDispenseBehavior +{ +protected: + virtual shared_ptr getProjectile(Level *world, Position *position); + virtual float getUncertainty(); + virtual float getPower(); +}; + +class ThrownPotionDispenseBehavior : public AbstractProjectileDispenseBehavior +{ +private: + int m_potionValue; +public: + ThrownPotionDispenseBehavior(int potionValue); +protected: + virtual shared_ptr getProjectile(Level *world, Position *position); + virtual float getUncertainty(); + virtual float getPower(); +}; + +class PotionDispenseBehavior : public DefaultDispenseItemBehavior +{ +public: + virtual shared_ptr dispense(BlockSource *source, shared_ptr dispensed); +}; + +class SpawnEggDispenseBehavior : public DefaultDispenseItemBehavior +{ +public: + virtual shared_ptr execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome); +}; + +class FireworksDispenseBehavior : public DefaultDispenseItemBehavior +{ +public: + virtual shared_ptr execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome); +protected: + virtual void playSound(BlockSource *source, eOUTCOME outcome); +}; + +class FireballDispenseBehavior : public DefaultDispenseItemBehavior +{ +public: + virtual shared_ptr execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome); +protected: + virtual void playSound(BlockSource *source, eOUTCOME outcome); +}; + +class BoatDispenseBehavior : public DefaultDispenseItemBehavior +{ +public: + BoatDispenseBehavior(); + virtual ~BoatDispenseBehavior(); + virtual shared_ptr execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome); +protected: + virtual void playSound(BlockSource *source, eOUTCOME outcome); +private: + DefaultDispenseItemBehavior *defaultDispenseItemBehavior; +}; + +class FilledBucketDispenseBehavior : public DefaultDispenseItemBehavior +{ +public: + virtual shared_ptr execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome); +}; + +class EmptyBucketDispenseBehavior : public DefaultDispenseItemBehavior +{ +public: + virtual shared_ptr execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome); +}; + +class FlintAndSteelDispenseBehavior : public DefaultDispenseItemBehavior +{ + // bool success; // 4J-JEV: Removed because we have something cleaner for this now. +public: + shared_ptr execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome); +protected: + virtual void playSound(BlockSource *source, eOUTCOME outcome); +}; + +class DyeDispenseBehavior : public DefaultDispenseItemBehavior +{ + // bool success; // 4J-JEV: Removed because we have something cleaner for this now. +public: + virtual shared_ptr execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome); +protected: + virtual void playSound(BlockSource *source, eOUTCOME outcome); +}; + +class TntDispenseBehavior : public DefaultDispenseItemBehavior +{ +protected: + virtual shared_ptr execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome); +}; \ No newline at end of file diff --git a/Minecraft.World/ItemEntity.cpp b/Minecraft.World/ItemEntity.cpp index eb7684a6..e6bdffa5 100644 --- a/Minecraft.World/ItemEntity.cpp +++ b/Minecraft.World/ItemEntity.cpp @@ -94,7 +94,7 @@ void ItemEntity::tick() xd = (random->nextFloat() - random->nextFloat()) * 0.2f; zd = (random->nextFloat() - random->nextFloat()) * 0.2f; MemSect(31); - level->playSound(shared_from_this(), eSoundType_RANDOM_FIZZ, 0.4f, 2.0f + random->nextFloat() * 0.4f); + playSound(eSoundType_RANDOM_FIZZ, 0.4f, 2.0f + random->nextFloat() * 0.4f); MemSect(0); } @@ -184,13 +184,15 @@ void ItemEntity::burn(int dmg) } -bool ItemEntity::hurt(DamageSource *source, int damage) +bool ItemEntity::hurt(DamageSource *source, float damage) { // 4J - added next line: found whilst debugging an issue with item entities getting into a bad state when being created by a cactus, since entities insides cactuses get hurt // and therefore depending on the timing of things they could get removed from the client when they weren't supposed to be. Are there really any cases were we would want // an itemEntity to be locally hurt? - if (level->isClientSide ) return false; + if (level->isClientSide ) return false; + if (isInvulnerable()) return false; + if (getItem() != NULL && getItem()->id == Item::netherStar_Id && source->isExplosion()) return false; markHurt(); health -= damage; if (health <= 0) @@ -254,7 +256,7 @@ void ItemEntity::playerTouch(shared_ptr player) if (item->id == Item::blazeRod_Id) player->awardStat(GenericStats::blazeRod(), GenericStats::param_blazeRod()); - level->playSound(shared_from_this(), eSoundType_RANDOM_POP, 0.2f, ((random->nextFloat() - random->nextFloat()) * 0.7f + 1.0f) * 2.0f); + playSound(eSoundType_RANDOM_POP, 0.2f, ((random->nextFloat() - random->nextFloat()) * 0.7f + 1.0f) * 2.0f); player->take(shared_from_this(), orgCount); // System.out.println(item.count + ", " + orgCount); if (item->count <= 0) remove(); @@ -267,6 +269,13 @@ wstring ItemEntity::getAName() //return I18n.get("item." + item.getDescriptionId()); } +void ItemEntity::changeDimension(int i) +{ + Entity::changeDimension(i); + + if (!level->isClientSide) mergeWithNeighbours(); +} + shared_ptr ItemEntity::getItem() { shared_ptr result = getEntityData()->getItemInstance(DATA_ITEM); @@ -278,7 +287,7 @@ shared_ptr ItemEntity::getItem() app.DebugPrintf("Item entity %d has no item?!\n", entityId); //level.getLogger().severe("Item entity " + entityId + " has no item?!"); } - return shared_ptr(new ItemInstance(Tile::rock)); + return shared_ptr(new ItemInstance(Tile::stone)); } return result; diff --git a/Minecraft.World/ItemEntity.h b/Minecraft.World/ItemEntity.h index 1f42bc21..3b442b90 100644 --- a/Minecraft.World/ItemEntity.h +++ b/Minecraft.World/ItemEntity.h @@ -58,13 +58,13 @@ protected: virtual void burn(int dmg); public: - virtual bool hurt(DamageSource *source, int damage); + virtual bool hurt(DamageSource *source, float damage); virtual void addAdditonalSaveData(CompoundTag *entityTag); virtual void readAdditionalSaveData(CompoundTag *tag); virtual void playerTouch(shared_ptr player); virtual wstring getAName(); - + virtual void changeDimension(int i); shared_ptr getItem(); void setItem(shared_ptr item); virtual bool isAttackable(); diff --git a/Minecraft.World/ItemFrame.cpp b/Minecraft.World/ItemFrame.cpp index 141f0630..0d52b421 100644 --- a/Minecraft.World/ItemFrame.cpp +++ b/Minecraft.World/ItemFrame.cpp @@ -20,6 +20,8 @@ void ItemFrame::_init() // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); + + dropChance = 1; } ItemFrame::ItemFrame(Level *level) : HangingEntity( level ) @@ -39,19 +41,45 @@ void ItemFrame::defineSynchedData() getEntityData()->define(DATA_ROTATION, (byte) 0); } -void ItemFrame::dropItem() +bool ItemFrame::shouldRenderAtSqrDistance(double distance) { - 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..c83b67dd 100644 --- a/Minecraft.World/ItemInstance.cpp +++ b/Minecraft.World/ItemInstance.cpp @@ -3,6 +3,8 @@ #include "net.minecraft.locale.h" #include "net.minecraft.stats.h" #include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.entity.player.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.level.tile.h" @@ -10,8 +12,9 @@ #include "net.minecraft.world.item.enchantment.h" #include "Item.h" #include "ItemInstance.h" +#include "HtmlString.h" - +const wstring ItemInstance::ATTRIBUTE_MODIFIER_FORMAT = L"#.###"; const wchar_t *ItemInstance::TAG_ENCH_ID = L"id"; const wchar_t *ItemInstance::TAG_ENCH_LEVEL = L"lvl"; @@ -45,29 +48,33 @@ ItemInstance::ItemInstance(MapItem *item, int count) ItemInstance::ItemInstance(Tile *tile, int count, int auxValue) { - _init(tile->id, count, auxValue); + _init(tile->id, count, auxValue); } ItemInstance::ItemInstance(Item *item) { - _init(item->id, 1, 0); + _init(item->id, 1, 0); } ItemInstance::ItemInstance(Item *item, int count) { - _init(item->id, count, 0); + _init(item->id, count, 0); } ItemInstance::ItemInstance(Item *item, int count, int auxValue) { - _init(item->id, count, auxValue); + _init(item->id, count, auxValue); } ItemInstance::ItemInstance(int id, int count, int damage) { - _init(id,count,damage); + _init(id,count,damage); + if (auxValue < 0) + { + auxValue = 0; + } } shared_ptr ItemInstance::fromTag(CompoundTag *itemTag) @@ -98,12 +105,12 @@ shared_ptr ItemInstance::remove(int count) Item *ItemInstance::getItem() const { - return Item::items[id]; + return Item::items[id]; } Icon *ItemInstance::getIcon() { - return getItem()->getIcon(shared_from_this()); + return getItem()->getIcon(shared_from_this()); } int ItemInstance::getIconType() @@ -118,17 +125,17 @@ bool ItemInstance::useOn(shared_ptr player, Level *level, int x, int y, float ItemInstance::getDestroySpeed(Tile *tile) { - return getItem()->getDestroySpeed(shared_from_this(), tile); + return getItem()->getDestroySpeed(shared_from_this(), tile); } -bool ItemInstance::TestUse(Level *level, shared_ptr player) +bool ItemInstance::TestUse(shared_ptr itemInstance, Level *level, shared_ptr player) { - return getItem()->TestUse( level, player); + return getItem()->TestUse( itemInstance, level, player); } shared_ptr ItemInstance::use(Level *level, shared_ptr player) { - return getItem()->use(shared_from_this(), level, player); + return getItem()->use(shared_from_this(), level, player); } shared_ptr ItemInstance::useTimeDepleted(Level *level, shared_ptr player) @@ -138,135 +145,159 @@ shared_ptr ItemInstance::useTimeDepleted(Level *level, shared_ptr< CompoundTag *ItemInstance::save(CompoundTag *compoundTag) { - compoundTag->putShort(L"id", (short) id); - compoundTag->putByte(L"Count", (byte) count); - compoundTag->putShort(L"Damage", (short) auxValue); - if (this->tag != NULL) compoundTag->put(L"tag", tag->copy()); - return compoundTag; + compoundTag->putShort(L"id", (short) id); + compoundTag->putByte(L"Count", (byte) count); + compoundTag->putShort(L"Damage", (short) auxValue); + if (tag != NULL) compoundTag->put(L"tag", tag->copy()); + return compoundTag; } void ItemInstance::load(CompoundTag *compoundTag) { popTime = 0; - id = compoundTag->getShort(L"id"); - count = compoundTag->getByte(L"Count"); - auxValue = compoundTag->getShort(L"Damage"); + id = compoundTag->getShort(L"id"); + count = compoundTag->getByte(L"Count"); + auxValue = compoundTag->getShort(L"Damage"); + if (auxValue < 0) + { + auxValue = 0; + } if (compoundTag->contains(L"tag")) { + delete tag; tag = (CompoundTag *)compoundTag->getCompound(L"tag")->copy(); } } int ItemInstance::getMaxStackSize() { - return getItem()->getMaxStackSize(); + return getItem()->getMaxStackSize(); } bool ItemInstance::isStackable() { - return getMaxStackSize() > 1 && (!isDamageableItem() || !isDamaged()); + return getMaxStackSize() > 1 && (!isDamageableItem() || !isDamaged()); } bool ItemInstance::isDamageableItem() { - return Item::items[id]->getMaxDamage() > 0; + return Item::items[id]->getMaxDamage() > 0; } /** - * Returns true if this item type only can be stacked with items that have - * the same auxValue data. - * - * @return - */ +* Returns true if this item type only can be stacked with items that have +* the same auxValue data. +* +* @return +*/ bool ItemInstance::isStackedByData() { - return Item::items[id]->isStackedByData(); + return Item::items[id]->isStackedByData(); } bool ItemInstance::isDamaged() { - return isDamageableItem() && auxValue > 0; + return isDamageableItem() && auxValue > 0; } int ItemInstance::getDamageValue() { - return auxValue; + return auxValue; } int ItemInstance::getAuxValue() const { - return auxValue; + return auxValue; } void ItemInstance::setAuxValue(int value) { - auxValue = value; + auxValue = value; + if (auxValue < 0) + { + auxValue = 0; + } } int ItemInstance::getMaxDamage() { - return Item::items[id]->getMaxDamage(); + return Item::items[id]->getMaxDamage(); } -void ItemInstance::hurt(int i, shared_ptr owner) +bool ItemInstance::hurt(int dmg, Random *random) { - if (!isDamageableItem()) + if (!isDamageableItem()) { - return; - } - - 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) { - owner->breakItem(shared_from_this()); - count--; - if (count < 0) count = 0; - auxValue = 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::hurtEnemy(shared_ptr mob, shared_ptr attacker) +void ItemInstance::hurtAndBreak(int dmg, shared_ptr owner) { - //bool used = - Item::items[id]->hurtEnemy(shared_from_this(), mob, attacker); + shared_ptr player = dynamic_pointer_cast(owner); + if (player != NULL && player->abilities.instabuild) return; + if (!isDamageableItem()) return; + + if (hurt(dmg, owner->getRandom())) + { + owner->breakItem(shared_from_this()); + + count--; + if (player != NULL) + { + //player->awardStat(Stats::itemBroke[id], 1); + if (count == 0 && dynamic_cast( getItem() ) != NULL) + { + player->removeSelectedItem(); + } + } + if (count < 0) count = 0; + auxValue = 0; + } +} + +void ItemInstance::hurtEnemy(shared_ptr mob, shared_ptr 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) { - //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 @@ -313,16 +344,16 @@ bool ItemInstance::tagMatches(shared_ptr a, shared_ptr a, shared_ptr b) { - if (a == NULL && b == NULL) return true; - if (a == NULL || b == NULL) return false; - return a->matches(b); + if (a == NULL && b == NULL) return true; + if (a == NULL || b == NULL) return false; + return a->matches(b); } bool ItemInstance::matches(shared_ptr b) { - if (count != b->count) return false; - if (id != b->id) return false; - if (auxValue != b->auxValue) return false; + if (count != b->count) return false; + if (id != b->id) return false; + if (auxValue != b->auxValue) return false; if (tag == NULL && b->tag != NULL) { return false; @@ -331,25 +362,25 @@ bool ItemInstance::matches(shared_ptr b) { return false; } - return true; + return true; } /** - * Checks if this item is the same item as the other one, disregarding the - * 'count' value. - * - * @param b - * @return - */ +* Checks if this item is the same item as the other one, disregarding the +* 'count' value. +* +* @param b +* @return +*/ bool ItemInstance::sameItem(shared_ptr b) { - return id == b->id && auxValue == b->auxValue; + return id == b->id && auxValue == b->auxValue; } bool ItemInstance::sameItemWithTags(shared_ptr b) { - if (id != b->id) return false; - if (auxValue != b->auxValue) return false; + if (id != b->id) return false; + if (auxValue != b->auxValue) return false; if (tag == NULL && b->tag != NULL) { return false; @@ -358,41 +389,41 @@ bool ItemInstance::sameItemWithTags(shared_ptr b) { return false; } - return true; + return true; } // 4J Stu - Added this for the one time when we compare with a non-shared pointer bool ItemInstance::sameItem_not_shared(ItemInstance *b) { - return id == b->id && auxValue == b->auxValue; + return id == b->id && auxValue == b->auxValue; } unsigned int ItemInstance::getUseDescriptionId() { - return Item::items[id]->getUseDescriptionId(shared_from_this()); + return Item::items[id]->getUseDescriptionId(shared_from_this()); } unsigned int ItemInstance::getDescriptionId(int iData /*= -1*/) { - return Item::items[id]->getDescriptionId(shared_from_this()); + return Item::items[id]->getDescriptionId(shared_from_this()); } ItemInstance *ItemInstance::setDescriptionId(unsigned int id) { // 4J Stu - I don't think this function is ever used. It if is, it should probably return shared_from_this() assert(false); - return this; + return this; } shared_ptr ItemInstance::clone(shared_ptr item) { - return item == NULL ? nullptr : item->copy(); + return item == NULL ? nullptr : item->copy(); } wstring ItemInstance::toString() { - //return count + "x" + Item::items[id]->getDescriptionId() + "@" + auxValue; - + //return count + "x" + Item::items[id]->getDescriptionId() + "@" + auxValue; + std::wostringstream oss; // 4J-PB - TODO - temp fix until ore recipe issue is fixed if(Item::items[id]==NULL) @@ -408,8 +439,8 @@ wstring ItemInstance::toString() void ItemInstance::inventoryTick(Level *level, shared_ptr owner, int slot, bool selected) { - if (popTime > 0) popTime--; - Item::items[id]->inventoryTick(shared_from_this(), level, owner, slot, selected); + if (popTime > 0) popTime--; + Item::items[id]->inventoryTick(shared_from_this(), level, owner, slot, selected); } void ItemInstance::onCraftedBy(Level *level, shared_ptr player, int craftCount) @@ -422,12 +453,12 @@ void ItemInstance::onCraftedBy(Level *level, shared_ptr player, int craf GenericStats::param_itemsCrafted(id, auxValue, craftCount) ); - Item::items[id]->onCraftedBy(shared_from_this(), level, player); + Item::items[id]->onCraftedBy(shared_from_this(), level, player); } bool ItemInstance::equals(shared_ptr ii) { - return id == ii->id && count == ii->count && auxValue == ii->auxValue; + return id == ii->id && count == ii->count && auxValue == ii->auxValue; } int ItemInstance::getUseDuration() @@ -467,6 +498,7 @@ ListTag *ItemInstance::getEnchantmentTags() void ItemInstance::setTag(CompoundTag *tag) { + delete this->tag; this->tag = tag; } @@ -494,6 +526,24 @@ void ItemInstance::setHoverName(const wstring &name) tag->getCompound(L"display")->putString(L"Name", name); } +void ItemInstance::resetHoverName() +{ + if (tag == NULL) return; + if (!tag->contains(L"display")) return; + CompoundTag *display = tag->getCompound(L"display"); + display->remove(L"Name"); + + if (display->isEmpty()) + { + tag->remove(L"display"); + + if (tag->isEmpty()) + { + setTag(NULL); + } + } +} + bool ItemInstance::hasCustomHoverName() { if (tag == NULL) return false; @@ -501,49 +551,49 @@ bool ItemInstance::hasCustomHoverName() return tag->getCompound(L"display")->contains(L"Name"); } -vector *ItemInstance::getHoverText(shared_ptr player, bool advanced, vector &unformattedStrings) +vector *ItemInstance::getHoverText(shared_ptr player, bool advanced) { - vector *lines = new vector(); + vector *lines = new vector(); Item *item = Item::items[id]; - wstring title = getHoverName(); + 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; @@ -689,39 +870,4 @@ int ItemInstance::GetPotionStrength() { return (auxValue&MASK_LEVEL2EXTENDED)>>5; } -} - -// TU9 - -bool ItemInstance::isFramed() -{ - return frame != NULL; -} - -void ItemInstance::setFramed(shared_ptr frame) -{ - this->frame = frame; -} - -shared_ptr ItemInstance::getFrame() -{ - return frame; -} - -int ItemInstance::getBaseRepairCost() -{ - if (hasTag() && tag->contains(L"RepairCost")) - { - return tag->getInt(L"RepairCost"); - } - else - { - return 0; - } -} - -void ItemInstance::setRepairCost(int cost) -{ - if (!hasTag()) tag = new CompoundTag(); - tag->putInt(L"RepairCost", cost); -} +} \ No newline at end of file diff --git a/Minecraft.World/ItemInstance.h b/Minecraft.World/ItemInstance.h index c1e52177..034c72f8 100644 --- a/Minecraft.World/ItemInstance.h +++ b/Minecraft.World/ItemInstance.h @@ -3,39 +3,45 @@ using namespace std; #include "UseAnim.h" #include "com.mojang.nbt.h" +#include "Attribute.h" class Entity; class Level; class Player; class Mob; +class LivingEntity; class CompoundTag; class Enchantment; class Rarity; +class AttributeModifier; +class Random; // 4J-PB - added class MapItem; class ItemFrame; class Icon; +class HtmlString; // 4J Stu - While this is not really an abstract class, we don't want to make new instances of it, // mainly because there are too many ctors and that doesn't fit well into out macroisation setup class ItemInstance: public enable_shared_from_this { public: + static const wstring ATTRIBUTE_MODIFIER_FORMAT; static const wchar_t *TAG_ENCH_ID; - static const wchar_t *TAG_ENCH_LEVEL; + static const wchar_t *TAG_ENCH_LEVEL; int count; - int popTime; - int id; + int popTime; + int id; // 4J Stu - Brought forward for enchanting/game rules CompoundTag *tag; - /** - * This was previously the damage value, but is now used for different stuff - * depending on item / tile. Use the getter methods to make sure the value - * is interpreted correctly. - */ + /** + * This was previously the damage value, but is now used for different stuff + * depending on item / tile. Use the getter methods to make sure the value + * is interpreted correctly. + */ private: int auxValue; // 4J-PB - added for trading menu @@ -71,7 +77,7 @@ public: int getIconType(); bool useOn(shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); float getDestroySpeed(Tile *tile); - bool TestUse(Level *level, shared_ptr player); + bool TestUse(shared_ptr itemInstance, Level *level, shared_ptr player); shared_ptr use(Level *level, shared_ptr player); shared_ptr useTimeDepleted(Level *level, shared_ptr player); CompoundTag *save(CompoundTag *compoundTag); @@ -85,12 +91,12 @@ public: int getAuxValue() const; void setAuxValue(int value); int getMaxDamage(); - void hurt(int i, shared_ptr owner); - void hurtEnemy(shared_ptr mob, shared_ptr attacker); + bool hurt(int dmg, Random *random); + void hurtAndBreak(int dmg, shared_ptr owner); + void hurtEnemy(shared_ptr mob, shared_ptr attacker); void mineBlock(Level *level, int tile, int x, int y, int z, shared_ptr owner); - int getAttackDamage(shared_ptr entity); bool canDestroySpecial(Tile *tile); - bool interactEnemy(shared_ptr mob); + bool interactEnemy(shared_ptr player, shared_ptr mob); shared_ptr copy() const; ItemInstance *copy_not_shared() const; // 4J Stu - Added for use in recipes static bool tagMatches(shared_ptr a, shared_ptr b); // 4J Brought forward from 1.2 @@ -128,27 +134,27 @@ public: void setTag(CompoundTag *tag); wstring getHoverName(); void setHoverName(const wstring &name); + void resetHoverName(); bool hasCustomHoverName(); - vector *getHoverText(shared_ptr player, bool advanced, vector &unformattedStrings); - vector *getHoverTextOnly(shared_ptr player, bool advanced, vector &unformattedStrings); // 4J Added + vector *getHoverText(shared_ptr player, bool advanced); + vector *getHoverTextOnly(shared_ptr player, bool advanced); // 4J Added bool isFoil(); const Rarity *getRarity(); bool isEnchantable(); void enchant(const Enchantment *enchantment, int level); bool isEnchanted(); void addTagElement(wstring name, Tag *tag); + bool mayBePlacedInAdventureMode(); + bool isFramed(); + void setFramed(shared_ptr frame); + shared_ptr getFrame(); + int getBaseRepairCost(); + void setRepairCost(int cost); + attrAttrModMap *getAttributeModifiers(); // 4J Added void set4JData(int data); int get4JData(); bool hasPotionStrengthBar(); int GetPotionStrength(); - - // TU9 - bool isFramed(); - void setFramed(shared_ptr frame); - shared_ptr getFrame(); - - int getBaseRepairCost(); - void setRepairCost(int cost); }; \ No newline at end of file diff --git a/Minecraft.World/JukeboxTile.cpp b/Minecraft.World/JukeboxTile.cpp new file mode 100644 index 00000000..cf53a751 --- /dev/null +++ b/Minecraft.World/JukeboxTile.cpp @@ -0,0 +1,167 @@ +#include "stdafx.h" +#include "net.minecraft.world.level.redstone.h" +#include "net.minecraft.world.entity.item.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.h" +#include "net.minecraft.world.h" +#include "JukeboxTile.h" +#include "LevelEvent.h" + +JukeboxTile::Entity::Entity() : TileEntity() +{ + record = nullptr; +} + +void JukeboxTile::Entity::load(CompoundTag *tag) +{ + TileEntity::load(tag); + + if (tag->contains(L"RecordItem")) + { + setRecord(ItemInstance::fromTag(tag->getCompound(L"RecordItem"))); + } + else if (tag->getInt(L"Record") > 0) + { + setRecord(shared_ptr( new ItemInstance(tag->getInt(L"Record"), 1, 0))); + } +} + +void JukeboxTile::Entity::save(CompoundTag *tag) +{ + TileEntity::save(tag); + + if (getRecord() != NULL) + { + tag->putCompound(L"RecordItem", getRecord()->save(new CompoundTag())); + + tag->putInt(L"Record", getRecord()->id); + } +} + +// 4J Added +shared_ptr JukeboxTile::Entity::clone() +{ + shared_ptr result = shared_ptr( new JukeboxTile::Entity() ); + TileEntity::clone(result); + + result->record = record; + + return result; +} + +shared_ptr JukeboxTile::Entity::getRecord() +{ + return record; +} + +void JukeboxTile::Entity::setRecord(shared_ptr record) +{ + this->record = record; + setChanged(); +} + +JukeboxTile::JukeboxTile(int id) : BaseEntityTile(id, Material::wood) +{ + iconTop = NULL; +} + +Icon *JukeboxTile::getTexture(int face, int data) +{ + if (face == Facing::UP) + { + return iconTop; + } + return icon; +} + +// 4J-PB - Adding a TestUse for tooltip display +bool JukeboxTile::TestUse(Level *level, int x, int y, int z, shared_ptr player) +{ + // if the jukebox is empty, return true + if (level->getData(x, y, z) == 0) return false; + return true; +} + +bool JukeboxTile::use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly/*=false*/) // 4J added soundOnly param +{ + if (soundOnly) return false; + if (level->getData(x, y, z) == 0) return false; + dropRecording(level, x, y, z); + return true; +} + +void JukeboxTile::setRecord(Level *level, int x, int y, int z, shared_ptr record) +{ + if (level->isClientSide) return; + + shared_ptr rte = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + rte->setRecord(record->copy()); + rte->setChanged(); + + level->setData(x, y, z, 1, Tile::UPDATE_CLIENTS); +} + +void JukeboxTile::dropRecording(Level *level, int x, int y, int z) +{ + if (level->isClientSide) return; + + shared_ptr rte = dynamic_pointer_cast( level->getTileEntity(x, y, z) ); + if( rte == NULL ) return; + + shared_ptr oldRecord = rte->getRecord(); + if (oldRecord == NULL) return; + + + level->levelEvent(LevelEvent::SOUND_PLAY_RECORDING, x, y, z, 0); + // 4J-PB- the level event will play the music + //level->playStreamingMusic(L"", x, y, z); + rte->setRecord(nullptr); + rte->setChanged(); + level->setData(x, y, z, 0, Tile::UPDATE_CLIENTS); + + float s = 0.7f; + double xo = level->random->nextFloat() * s + (1 - s) * 0.5; + double yo = level->random->nextFloat() * s + (1 - s) * 0.2 + 0.6; + double zo = level->random->nextFloat() * s + (1 - s) * 0.5; + + shared_ptr itemInstance = oldRecord->copy(); + + shared_ptr item = shared_ptr( new ItemEntity(level, x + xo, y + yo, z + zo, itemInstance ) ); + item->throwTime = 10; + level->addEntity(item); +} + +void JukeboxTile::onRemove(Level *level, int x, int y, int z, int id, int data) +{ + dropRecording(level, x, y, z); + Tile::onRemove(level, x, y, z, id, data); +} + +void JukeboxTile::spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonus) +{ + if (level->isClientSide) return; + Tile::spawnResources(level, x, y, z, data, odds, 0); +} + +shared_ptr JukeboxTile::newTileEntity(Level *level) +{ + return shared_ptr( new JukeboxTile::Entity() ); +} + +void JukeboxTile::registerIcons(IconRegister *iconRegister) +{ + icon = iconRegister->registerIcon(getIconName() + L"_side"); + iconTop = iconRegister->registerIcon(getIconName() + L"_top"); +} + +bool JukeboxTile::hasAnalogOutputSignal() +{ + return true; +} + +int JukeboxTile::getAnalogOutputSignal(Level *level, int x, int y, int z, int dir) +{ + shared_ptr record = dynamic_pointer_cast( level->getTileEntity(x, y, z))->getRecord(); + return record == NULL ? Redstone::SIGNAL_NONE : record->id + 1 - Item::record_01_Id; +} \ No newline at end of file diff --git a/Minecraft.World/JukeboxTile.h b/Minecraft.World/JukeboxTile.h new file mode 100644 index 00000000..dd592872 --- /dev/null +++ b/Minecraft.World/JukeboxTile.h @@ -0,0 +1,55 @@ +#pragma once + +#include "BaseEntityTile.h" +#include "CompoundTag.h" +#include "TileEntity.h" + +class CompoundTag; +class ChunkRebuildData; + +class JukeboxTile : public BaseEntityTile +{ + friend class Tile; + friend class ChunkRebuildData; +public: + class Entity : public TileEntity + { + public: + eINSTANCEOF GetType() { return eTYPE_RECORDPLAYERTILE; } + static TileEntity *create() { return new JukeboxTile::Entity(); } + + private: + shared_ptr record; + + public: + Entity(); + + virtual void load(CompoundTag *tag); + virtual void save(CompoundTag *tag); + virtual shared_ptr getRecord(); + virtual void setRecord(shared_ptr record); + + // 4J Added + shared_ptr clone(); + }; + +private: + Icon *iconTop; + +protected: + JukeboxTile(int id); + +public: + virtual Icon *getTexture(int face, int data); + virtual bool TestUse(Level *level, int x, int y, int z, shared_ptr player); + virtual bool use(Level *level, int x, int y, int z, shared_ptr player, int clickedFace, float clickX, float clickY, float clickZ, bool soundOnly = false); // 4J added soundOnly param + void setRecord(Level *level, int x, int y, int z, shared_ptr record); + void dropRecording(Level *level, int x, int y, int z); + virtual void onRemove(Level *level, int x, int y, int z, int id, int data); + virtual void spawnResources(Level *level, int x, int y, int z, int data, float odds, int playerBonus); + + virtual shared_ptr newTileEntity(Level *level); + virtual void registerIcons(IconRegister *iconRegister); + virtual bool hasAnalogOutputSignal(); + virtual int getAnalogOutputSignal(Level *level, int x, int y, int z, int dir); +}; diff --git a/Minecraft.World/JungleBiome.cpp b/Minecraft.World/JungleBiome.cpp index ba30a896..1388e97f 100644 --- a/Minecraft.World/JungleBiome.cpp +++ b/Minecraft.World/JungleBiome.cpp @@ -12,7 +12,7 @@ JungleBiome::JungleBiome(int id) : Biome(id) decorator->grassCount = 25; decorator->flowerCount = 4; - enemies.push_back(new MobSpawnerData(eTYPE_OZELOT, 2, 1, 1)); + enemies.push_back(new MobSpawnerData(eTYPE_OCELOT, 2, 1, 1)); // make chicken a lot more common in the jungle friendlies.push_back(new MobSpawnerData(eTYPE_CHICKEN, 10, 4, 4)); diff --git a/Minecraft.World/KillCommand.cpp b/Minecraft.World/KillCommand.cpp index 30a7880e..c726b21f 100644 --- a/Minecraft.World/KillCommand.cpp +++ b/Minecraft.World/KillCommand.cpp @@ -2,6 +2,7 @@ #include "net.minecraft.commands.h" #include "net.minecraft.world.entity.player.h" #include "net.minecraft.world.damagesource.h" +#include "BasicTypeContainers.h" #include "KillCommand.h" EGameCommand KillCommand::getId() @@ -9,11 +10,17 @@ EGameCommand KillCommand::getId() return eGameCommand_Kill; } +int KillCommand::getPermissionLevel() +{ + return LEVEL_ALL; +} + void KillCommand::execute(shared_ptr source, byteArray commandData) { shared_ptr player = dynamic_pointer_cast(source); - player->hurt(DamageSource::outOfWorld, 1000); + player->hurt(DamageSource::outOfWorld, Float::MAX_VALUE); source->sendMessage(L"Ouch. That look like it hurt."); +//source.sendMessage(ChatMessageComponent.forTranslation("commands.kill.success")); } \ No newline at end of file diff --git a/Minecraft.World/KillCommand.h b/Minecraft.World/KillCommand.h index a88b2069..50db2c79 100644 --- a/Minecraft.World/KillCommand.h +++ b/Minecraft.World/KillCommand.h @@ -6,5 +6,6 @@ class KillCommand : public Command { public: virtual EGameCommand getId(); + virtual int getPermissionLevel(); virtual void execute(shared_ptr source, byteArray commandData); }; \ No newline at end of file diff --git a/Minecraft.World/LadderTile.cpp b/Minecraft.World/LadderTile.cpp index 32f35ed8..438d2bbf 100644 --- a/Minecraft.World/LadderTile.cpp +++ b/Minecraft.World/LadderTile.cpp @@ -15,8 +15,8 @@ AABB *LadderTile::getAABB(Level *level, int x, int y, int z) AABB *LadderTile::getTileAABB(Level *level, int x, int y, int z) { - updateShape(level, x, y, z); - return Tile::getTileAABB(level, x, y, z); + updateShape(level, x, y, z); + return Tile::getTileAABB(level, x, y, z); } void LadderTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param @@ -57,53 +57,53 @@ int LadderTile::getRenderShape() bool LadderTile::mayPlace(Level *level, int x, int y, int z) { - if (level->isSolidBlockingTile(x - 1, y, z)) + if (level->isSolidBlockingTile(x - 1, y, z)) { - return true; - } + return true; + } else if (level->isSolidBlockingTile(x + 1, y, z)) { - return true; + return true; } else if (level->isSolidBlockingTile(x, y, z - 1)) { - return true; - } + return true; + } else if (level->isSolidBlockingTile(x, y, z + 1)) { - return true; - } - return false; + return true; + } + return false; } int LadderTile::getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue) { - int dir = level->getData(x, y, z); + int dir = level->getData(x, y, z); - if ((dir == 0 || face == 2) && level->isSolidBlockingTile(x, y, z + 1)) dir = 2; - if ((dir == 0 || face == 3) && level->isSolidBlockingTile(x, y, z - 1)) dir = 3; - if ((dir == 0 || face == 4) && level->isSolidBlockingTile(x + 1, y, z)) dir = 4; - if ((dir == 0 || face == 5) && level->isSolidBlockingTile(x - 1, y, z)) dir = 5; + if ((dir == 0 || face == 2) && level->isSolidBlockingTile(x, y, z + 1)) dir = 2; + if ((dir == 0 || face == 3) && level->isSolidBlockingTile(x, y, z - 1)) dir = 3; + if ((dir == 0 || face == 4) && level->isSolidBlockingTile(x + 1, y, z)) dir = 4; + if ((dir == 0 || face == 5) && level->isSolidBlockingTile(x - 1, y, z)) dir = 5; - return dir; + return dir; } void LadderTile::neighborChanged(Level *level, int x, int y, int z, int type) { - int face = level->getData(x, y, z); - bool ok = false; + 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/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..6304aa62 100644 --- a/Minecraft.World/MapItemSavedData.cpp +++ b/Minecraft.World/MapItemSavedData.cpp @@ -31,6 +31,8 @@ MapItemSavedData::HoldingPlayer::HoldingPlayer(shared_ptr player, const tick = 0; sendPosTick = 0; + step = 0; + hasSentInitial = false; // java ctor //this->player = player; @@ -50,6 +52,15 @@ MapItemSavedData::HoldingPlayer::~HoldingPlayer() charArray MapItemSavedData::HoldingPlayer::nextUpdatePacket(shared_ptr itemInstance) { + if (!hasSentInitial) + { + charArray data(2); + data[0] = HEADER_METADATA; + data[1] = parent->scale; + + hasSentInitial = true; + return data; + } if (--sendPosTick < 0) { sendPosTick = 4; @@ -128,8 +139,7 @@ charArray MapItemSavedData::HoldingPlayer::nextUpdatePacket(shared_ptr servPlayer = dynamic_pointer_cast(player); for (int d = 0; d < 10; d++) { - int column = (tick * 11) % (MapItem::IMAGE_WIDTH); - tick++; + int column = (tick++ * 11) % (MapItem::IMAGE_WIDTH); if (rowsDirtyMin[column] >= 0) { @@ -137,7 +147,7 @@ charArray MapItemSavedData::HoldingPlayer::nextUpdatePacket(shared_ptrgetInt(L"zCenter"); scale = tag->getByte(L"scale"); if (scale < 0) scale = 0; - if (scale > 4) scale = 4; + if (scale > MAX_SCALE) scale = MAX_SCALE; int width = tag->getShort(L"width"); int height = tag->getShort(L"height"); @@ -332,7 +341,7 @@ void MapItemSavedData::tickCarriedBy(shared_ptr player, shared_ptrgetFrame()->dir * 90) * 16 / 360); if (dimension < 0) { - int s = step / 10; + int s = (int) (playerLevel->getLevelData()->getDayTime() / 10); rot = (char) ((s * s * 34187121 + s * 121) >> 15 & 15); } #ifdef _LARGE_WORLDS @@ -412,7 +421,7 @@ void MapItemSavedData::tickCarriedBy(shared_ptr player, shared_ptryRot * 16 / 360 + 0.5); if (dimension < 0) { - int s = step / 10; + int s = (int) (playerLevel->getLevelData()->getDayTime() / 10); rot = (char) ((s * s * 34187121 + s * 121) >> 15 & 15); } @@ -494,7 +503,7 @@ void MapItemSavedData::setDirty(int x, int y0, int y1) void MapItemSavedData::handleComplexItemData(charArray &data) { - if (data[0] == 0) + if (data[0] == HEADER_COLOURS) { int xx = data[1] & 0xff; int yy = data[2] & 0xff; @@ -505,7 +514,7 @@ void MapItemSavedData::handleComplexItemData(charArray &data) setDirty(); } - else if (data[0] == 1) + else if (data[0] == HEADER_DECORATIONS) { for( unsigned int i = 0; i < decorations.size(); i++ ) { @@ -529,6 +538,29 @@ void MapItemSavedData::handleComplexItemData(charArray &data) decorations.push_back(new MapDecoration(img, x, y, rot, entityId, visible)); } } + else if (data[0] == HEADER_METADATA) + { + scale = data[1]; + } +} + +shared_ptr MapItemSavedData::getHoldingPlayer(shared_ptr player) +{ + shared_ptr hp = nullptr; + AUTO_VAR(it,carriedByPlayers.find(player)); + + if (it == carriedByPlayers.end()) + { + hp = shared_ptr( new HoldingPlayer(player, this) ); + carriedByPlayers[player] = hp; + carriedBy.push_back(hp); + } + else + { + hp = it->second; + } + + return hp; } // 4J Added diff --git a/Minecraft.World/MapItemSavedData.h b/Minecraft.World/MapItemSavedData.h index fcbe5e30..21322644 100644 --- a/Minecraft.World/MapItemSavedData.h +++ b/Minecraft.World/MapItemSavedData.h @@ -5,6 +5,11 @@ class MapItemSavedData : public SavedData { +private: + static const int HEADER_COLOURS = 0; + static const int HEADER_DECORATIONS = 1; + static const int HEADER_METADATA = 2; + public: static const int MAP_SIZE = 64; static const int MAX_SCALE = 4; @@ -37,6 +42,12 @@ public: int sendPosTick; charArray lastSentDecorations; + public: + int step; + + private: + bool hasSentInitial; + protected: const MapItemSavedData *parent; @@ -52,10 +63,10 @@ public: char dimension; byte scale; byteArray colors; - int step; vector > carriedBy; private: + typedef unordered_map , shared_ptr , PlayerKeyHash, PlayerKeyEq> playerHoldingPlayerMapType; playerHoldingPlayerMapType carriedByPlayers; @@ -82,6 +93,7 @@ public: using SavedData::setDirty; void setDirty(int x, int y0, int y1); void handleComplexItemData(charArray &data); + shared_ptr getHoldingPlayer(shared_ptr player); // 4J Stu Added void mergeInMapData(shared_ptr dataToAdd); diff --git a/Minecraft.World/McRegionChunkStorage.cpp b/Minecraft.World/McRegionChunkStorage.cpp index a11cb1c1..d02125a6 100644 --- a/Minecraft.World/McRegionChunkStorage.cpp +++ b/Minecraft.World/McRegionChunkStorage.cpp @@ -160,6 +160,13 @@ LevelChunk *McRegionChunkStorage::load(Level *level, int x, int z) #endif delete chunkData; } +#ifndef _CONTENT_PACKAGE + if(levelChunk && app.DebugSettingsOn() && app.GetGameSettingsDebugMask(ProfileManager.GetPrimaryPad())&(1L<reloadBiomes(); + } +#endif return levelChunk; } diff --git a/Minecraft.World/MegaTreeFeature.cpp b/Minecraft.World/MegaTreeFeature.cpp index 77e06e30..09195fb4 100644 --- a/Minecraft.World/MegaTreeFeature.cpp +++ b/Minecraft.World/MegaTreeFeature.cpp @@ -55,10 +55,10 @@ bool MegaTreeFeature::place(Level *level, Random *random, int x, int y, int z) int belowTile = level->getTile(x, y - 1, z); if ((belowTile != Tile::grass_Id && belowTile != Tile::dirt_Id) || y >= Level::maxBuildHeight - treeHeight - 1) return false; - level->setTileNoUpdate(x, y - 1, z, Tile::dirt_Id); - level->setTileNoUpdate(x + 1, y - 1, z, Tile::dirt_Id); - level->setTileNoUpdate(x, y - 1, z + 1, Tile::dirt_Id); - level->setTileNoUpdate(x + 1, y - 1, z + 1, Tile::dirt_Id); + level->setTileAndData(x, y - 1, z, Tile::dirt_Id, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x + 1, y - 1, z, Tile::dirt_Id, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x, y - 1, z + 1, Tile::dirt_Id, 0, Tile::UPDATE_CLIENTS); + level->setTileAndData(x + 1, y - 1, z + 1, Tile::dirt_Id, 0, Tile::UPDATE_CLIENTS); PIXBeginNamedEvent(0,"MegaTree placing leaves, %d, %d, %d", x, z, y+treeHeight); placeLeaves(level, x, z, y + treeHeight, 2, random); @@ -189,7 +189,7 @@ void MegaTreeFeature::placeLeaves(Level *level, int x, int z, int topPosition, i PIXBeginNamedEvent(0,"Getting tile"); int t = level->getTile(xx, yy, zz); PIXEndNamedEvent(); - if (!Tile::solid[t]) + if (t == 0 || t == Tile::leaves_Id) { PIXBeginNamedEvent(0,"Placing block"); placeBlock(level, xx, yy, zz, Tile::leaves_Id, leafType); diff --git a/Minecraft.World/MeleeAttackGoal.cpp b/Minecraft.World/MeleeAttackGoal.cpp index f3aa6455..7003609e 100644 --- a/Minecraft.World/MeleeAttackGoal.cpp +++ b/Minecraft.World/MeleeAttackGoal.cpp @@ -8,12 +8,12 @@ #include "net.minecraft.world.phys.h" #include "MeleeAttackGoal.h" -void MeleeAttackGoal::_init(Mob *mob, float speed, bool trackTarget) +void MeleeAttackGoal::_init(PathfinderMob *mob, double speedModifier, bool trackTarget) { this->attackType = eTYPE_NOTSET; this->mob = mob; - this->level = mob->level; - this->speed = speed; + level = mob->level; + this->speedModifier = speedModifier; this->trackTarget = trackTarget; setRequiredControlFlags(Control::MoveControlFlag | Control::LookControlFlag); @@ -23,15 +23,15 @@ void MeleeAttackGoal::_init(Mob *mob, float speed, bool trackTarget) timeToRecalcPath = 0; } -MeleeAttackGoal::MeleeAttackGoal(Mob *mob, eINSTANCEOF attackType, float speed, bool trackTarget) +MeleeAttackGoal::MeleeAttackGoal(PathfinderMob *mob, eINSTANCEOF attackType, double speedModifier, bool trackTarget) { - _init(mob, speed, trackTarget); + _init(mob, speedModifier, trackTarget); this->attackType = attackType; } -MeleeAttackGoal::MeleeAttackGoal(Mob *mob, float speed, bool trackTarget) +MeleeAttackGoal::MeleeAttackGoal(PathfinderMob *mob, double speedModifier, bool trackTarget) { - _init(mob,speed,trackTarget); + _init(mob,speedModifier,trackTarget); } MeleeAttackGoal::~MeleeAttackGoal() @@ -41,56 +41,56 @@ MeleeAttackGoal::~MeleeAttackGoal() bool MeleeAttackGoal::canUse() { - shared_ptr bestTarget = mob->getTarget(); - if (bestTarget == NULL) return false; - if(!bestTarget->isAlive()) return false; - if (attackType != eTYPE_NOTSET && (attackType & bestTarget->GetType()) != attackType) return false; - target = weak_ptr(bestTarget); + shared_ptr target = mob->getTarget(); + if (target == NULL) return false; + if (!target->isAlive()) return false; + if (attackType != NULL && !target->instanceof(attackType)) return false; delete path; - path = mob->getNavigation()->createPath(target.lock()); + path = mob->getNavigation()->createPath(target); return path != NULL; } bool MeleeAttackGoal::canContinueToUse() { - shared_ptr bestTarget = mob->getTarget(); - if (bestTarget == NULL) return false; - if (target.lock() == NULL || !target.lock()->isAlive()) return false; + shared_ptr target = mob->getTarget(); + if (target == NULL) return false; + if (!target->isAlive()) return false; if (!trackTarget) return !mob->getNavigation()->isDone(); - if (!mob->isWithinRestriction(Mth::floor(target.lock()->x), Mth::floor(target.lock()->y), Mth::floor(target.lock()->z))) return false; + if (!mob->isWithinRestriction(Mth::floor(target->x), Mth::floor(target->y), Mth::floor(target->z))) return false; return true; } void MeleeAttackGoal::start() { - mob->getNavigation()->moveTo(path, speed); + mob->getNavigation()->moveTo(path, speedModifier); path = NULL; timeToRecalcPath = 0; } void MeleeAttackGoal::stop() { - target = weak_ptr(); mob->getNavigation()->stop(); } void MeleeAttackGoal::tick() { - mob->getLookControl()->setLookAt(target.lock(), 30, 30); - if (trackTarget || mob->getSensing()->canSee(target.lock())) + shared_ptr target = mob->getTarget(); + mob->getLookControl()->setLookAt(target, 30, 30); + if (trackTarget || mob->getSensing()->canSee(target)) { if (--timeToRecalcPath <= 0) { timeToRecalcPath = 4 + mob->getRandom()->nextInt(7); - mob->getNavigation()->moveTo(target.lock(), speed); + mob->getNavigation()->moveTo(target, speedModifier); } } attackTime = max(attackTime - 1, 0); - double meleeRadiusSqr = (mob->bbWidth * 2) * (mob->bbWidth * 2); - if (mob->distanceToSqr(target.lock()->x, target.lock()->bb->y0, target.lock()->z) > meleeRadiusSqr) return; + double meleeRadiusSqr = (mob->bbWidth * 2) * (mob->bbWidth * 2) + target->bbWidth; + if (mob->distanceToSqr(target->x, target->bb->y0, target->z) > meleeRadiusSqr) return; if (attackTime > 0) return; attackTime = 20; - mob->doHurtTarget(target.lock()); + if (mob->getCarriedItem() != NULL) mob->swing(); + mob->doHurtTarget(target); } diff --git a/Minecraft.World/MeleeAttackGoal.h b/Minecraft.World/MeleeAttackGoal.h index c8f5e19d..dd6b1958 100644 --- a/Minecraft.World/MeleeAttackGoal.h +++ b/Minecraft.World/MeleeAttackGoal.h @@ -3,28 +3,26 @@ #include "Goal.h" class Level; -class Mob; +class PathfinderMob; class Path; class MeleeAttackGoal : public Goal { private: Level *level; - Mob *mob; // Owner of this goal - weak_ptr target; - + PathfinderMob *mob; // Owner of this goal int attackTime; - float speed; + double speedModifier; bool trackTarget; Path *path; eINSTANCEOF attackType; int timeToRecalcPath; - void _init(Mob *mob, float speed, bool trackTarget); + void _init(PathfinderMob *mob, double speedModifier, bool trackTarget); public: - MeleeAttackGoal(Mob *mob, eINSTANCEOF attackType, float speed, bool trackTarget); - MeleeAttackGoal(Mob *mob, float speed, bool trackTarget); + MeleeAttackGoal(PathfinderMob *mob, eINSTANCEOF attackType, double speedModifier, bool trackTarget); + MeleeAttackGoal(PathfinderMob *mob, double speedModifier, bool trackTarget); ~MeleeAttackGoal(); virtual bool canUse(); diff --git a/Minecraft.World/MelonTile.cpp b/Minecraft.World/MelonTile.cpp index 881eadc2..298ae61f 100644 --- a/Minecraft.World/MelonTile.cpp +++ b/Minecraft.World/MelonTile.cpp @@ -4,9 +4,6 @@ #include "net.minecraft.world.h" #include "Facing.h" -const wstring MelonTile::TEX = L"melon_side"; -const wstring MelonTile::TEX_TOP = L"melon_top"; - MelonTile::MelonTile(int id) : Tile(id, Material::vegetable) { iconTop = NULL; @@ -40,6 +37,6 @@ int MelonTile::getResourceCountForLootBonus(int bonusLevel, Random *random) void MelonTile::registerIcons(IconRegister *iconRegister) { - icon = iconRegister->registerIcon(TEX); - iconTop = iconRegister->registerIcon(TEX_TOP); + icon = iconRegister->registerIcon(getIconName() + L"_side"); + iconTop = iconRegister->registerIcon(getIconName() + L"_top"); } \ No newline at end of file diff --git a/Minecraft.World/MelonTile.h b/Minecraft.World/MelonTile.h index 029cb1cb..1b3d1a35 100644 --- a/Minecraft.World/MelonTile.h +++ b/Minecraft.World/MelonTile.h @@ -6,19 +6,16 @@ class MelonTile : public Tile { friend class ChunkRebuildData; private: - static const wstring TEX; - static const wstring TEX_TOP; - Icon *iconTop; // 4J Stu - I don't know why this is protected in Java -//protected: + //protected: public: MelonTile(int id); public: virtual Icon *getTexture(int face, int data); - virtual int getResource(int data, Random *random, int playerBonusLevel); - virtual int getResourceCount(Random *random); + virtual int getResource(int data, Random *random, int playerBonusLevel); + virtual int getResourceCount(Random *random); virtual int getResourceCountForLootBonus(int bonusLevel, Random *random); void registerIcons(IconRegister *iconRegister); }; \ No newline at end of file diff --git a/Minecraft.World/MenuBackup.cpp b/Minecraft.World/MenuBackup.cpp index 6d09f3e3..b6d3ba09 100644 --- a/Minecraft.World/MenuBackup.cpp +++ b/Minecraft.World/MenuBackup.cpp @@ -15,11 +15,11 @@ MenuBackup::MenuBackup(shared_ptr inventory, AbstractContainerMenu *m void MenuBackup::save(short changeUid) { - ItemInstanceArray *backup = new ItemInstanceArray( (int)menu->slots->size() + 1 ); + ItemInstanceArray *backup = new ItemInstanceArray( (int)menu->slots.size() + 1 ); (*backup)[0] = ItemInstance::clone(inventory->getCarried()); - for (unsigned int i = 0; i < menu->slots->size(); i++) + for (unsigned int i = 0; i < menu->slots.size(); i++) { - (*backup)[i + 1] = ItemInstance::clone(menu->slots->at(i)->getItem()); + (*backup)[i + 1] = ItemInstance::clone(menu->slots.at(i)->getItem()); } // TODO Is unordered_map use correct? // Was backups.put(changeUid, backup); @@ -39,9 +39,9 @@ void MenuBackup::rollback(short changeUid) ItemInstanceArray *backup = backups->at(changeUid); backups->clear(); inventory->setCarried( (*backup)[0] ); - for (unsigned int i = 0; i < menu->slots->size(); i++) + for (unsigned int i = 0; i < menu->slots.size(); i++) { - menu->slots->at(i)->set( (*backup)[i + 1] ); + menu->slots.at(i)->set( (*backup)[i + 1] ); } } \ No newline at end of file diff --git a/Minecraft.World/Merchant.h b/Minecraft.World/Merchant.h index 8b4b7a69..f47e2acb 100644 --- a/Minecraft.World/Merchant.h +++ b/Minecraft.World/Merchant.h @@ -13,5 +13,5 @@ public: virtual void overrideOffers(MerchantRecipeList *recipeList) = 0; virtual void notifyTrade(MerchantRecipe *activeRecipe) = 0; virtual void notifyTradeUpdated(shared_ptr item) = 0; - virtual int getDisplayName() = 0; + virtual wstring getDisplayName() = 0; }; \ No newline at end of file diff --git a/Minecraft.World/MerchantContainer.cpp b/Minecraft.World/MerchantContainer.cpp index cadbe4e3..cd3fde5e 100644 --- a/Minecraft.World/MerchantContainer.cpp +++ b/Minecraft.World/MerchantContainer.cpp @@ -90,11 +90,21 @@ void MerchantContainer::setItem(unsigned int slot, shared_ptr item } } -int MerchantContainer::getName() +wstring MerchantContainer::getName() { return merchant->getDisplayName(); } +wstring MerchantContainer::getCustomName() +{ + return L""; +} + +bool MerchantContainer::hasCustomName() +{ + return false; +} + int MerchantContainer::getMaxStackSize() { return Container::LARGE_MAX_STACK_SIZE; @@ -113,6 +123,11 @@ void MerchantContainer::stopOpen() { } +bool MerchantContainer::canPlaceItem(int slot, shared_ptr item) +{ + return true; +} + void MerchantContainer::setChanged() { updateSellItem(); diff --git a/Minecraft.World/MerchantContainer.h b/Minecraft.World/MerchantContainer.h index efba13d6..91893c1b 100644 --- a/Minecraft.World/MerchantContainer.h +++ b/Minecraft.World/MerchantContainer.h @@ -30,11 +30,14 @@ private: public: shared_ptr removeItemNoUpdate(int slot); void setItem(unsigned int slot, shared_ptr item); - int getName(); + wstring getName(); + wstring getCustomName(); + bool hasCustomName(); int getMaxStackSize(); bool stillValid(shared_ptr player); void startOpen(); void stopOpen(); + bool canPlaceItem(int slot, shared_ptr item); void setChanged(); void updateSellItem(); MerchantRecipe *getActiveRecipe(); diff --git a/Minecraft.World/MerchantMenu.cpp b/Minecraft.World/MerchantMenu.cpp index a6dfca1f..52ce34f9 100644 --- a/Minecraft.World/MerchantMenu.cpp +++ b/Minecraft.World/MerchantMenu.cpp @@ -69,7 +69,7 @@ shared_ptr MerchantMenu::quickMoveStack(shared_ptr player, shared_ptr clicked = nullptr; Slot *slot = NULL; - if(slotIndex < slots->size()) slot = slots->at(slotIndex); + if(slotIndex < slots.size()) slot = slots.at(slotIndex); if (slot != NULL && slot->hasItem()) { shared_ptr stack = slot->getItem(); diff --git a/Minecraft.World/MineShaftFeature.cpp b/Minecraft.World/MineShaftFeature.cpp index ac4d0c3f..78178de0 100644 --- a/Minecraft.World/MineShaftFeature.cpp +++ b/Minecraft.World/MineShaftFeature.cpp @@ -1,6 +1,32 @@ #include "stdafx.h" #include "net.minecraft.world.level.levelgen.structure.h" #include "JavaMath.h" +#include "Mth.h" + +const wstring MineShaftFeature::OPTION_CHANCE = L"chance"; + +MineShaftFeature::MineShaftFeature() +{ + chance = 0.01; +} + +wstring MineShaftFeature::getFeatureName() +{ + return L"Mineshaft"; +} + +MineShaftFeature::MineShaftFeature(unordered_map options) +{ + chance = 0.01; + + for(AUTO_VAR(it,options.begin()); it != options.end(); ++it) + { + if (it->first.compare(OPTION_CHANCE) == 0) + { + chance = Mth::getDouble(it->second, chance); + } + } +} bool MineShaftFeature::isFeatureChunk(int x, int z, bool bIsSuperflat) { @@ -11,7 +37,7 @@ bool MineShaftFeature::isFeatureChunk(int x, int z, bool bIsSuperflat) forcePlacement = levelGenOptions->isFeatureChunk(x,z,eFeature_Mineshaft); } - return forcePlacement || (random->nextInt(100) == 0 && random->nextInt(80) < max(abs(x), abs(z))); + return forcePlacement || (random->nextDouble() < chance && random->nextInt(80) < max(abs(x), abs(z))); } StructureStart *MineShaftFeature::createStructureStart(int x, int z) diff --git a/Minecraft.World/MineShaftFeature.h b/Minecraft.World/MineShaftFeature.h index 698010ec..cec786c6 100644 --- a/Minecraft.World/MineShaftFeature.h +++ b/Minecraft.World/MineShaftFeature.h @@ -4,6 +4,19 @@ class MineShaftFeature : public StructureFeature { +public: + static const wstring OPTION_CHANCE; + +private: + double chance; + +public: + MineShaftFeature(); + + wstring getFeatureName(); + + MineShaftFeature(unordered_map options); + protected: virtual bool isFeatureChunk(int x, int z, bool bIsSuperflat=false); virtual StructureStart *createStructureStart(int x, int z); diff --git a/Minecraft.World/MineShaftPieces.cpp b/Minecraft.World/MineShaftPieces.cpp index fe13b49f..844514dc 100644 --- a/Minecraft.World/MineShaftPieces.cpp +++ b/Minecraft.World/MineShaftPieces.cpp @@ -1,4 +1,5 @@ #include "stdafx.h" +#include "net.minecraft.world.entity.item.h" #include "net.minecraft.world.level.levelgen.structure.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.level.tile.h" @@ -12,7 +13,7 @@ WeighedTreasureArray MineShaftPieces::smallTreasureItems;; void MineShaftPieces::staticCtor() { - smallTreasureItems = WeighedTreasureArray(11); + smallTreasureItems = WeighedTreasureArray(13); smallTreasureItems[0] = new WeighedTreasure(Item::ironIngot_Id, 0, 1, 5, 10); smallTreasureItems[1] = new WeighedTreasure(Item::goldIngot_Id, 0, 1, 3, 5); smallTreasureItems[2] = new WeighedTreasure(Item::redStone_Id, 0, 4, 9, 5); @@ -23,8 +24,18 @@ void MineShaftPieces::staticCtor() smallTreasureItems[7] = new WeighedTreasure(Item::pickAxe_iron_Id, 0, 1, 1, 1); smallTreasureItems[8] = new WeighedTreasure(Tile::rail_Id, 0, 4, 8, 1); smallTreasureItems[9] = new WeighedTreasure(Item::seeds_melon_Id, 0, 2, 4, 10); - // 4J-PB - Adding from 1.2.3 smallTreasureItems[10] = new WeighedTreasure(Item::seeds_pumpkin_Id, 0, 2, 4, 10); + // very rare for shafts ... + smallTreasureItems[11] = new WeighedTreasure(Item::saddle_Id, 0, 1, 1, 3); + smallTreasureItems[12] = new WeighedTreasure(Item::horseArmorMetal_Id, 0, 1, 1, 1); +} + +void MineShaftPieces::loadStatic() +{ + StructureFeatureIO::setPieceId( eStructurePiece_MineShaftCorridor, MineShaftCorridor::Create, L"MSCorridor"); + StructureFeatureIO::setPieceId( eStructurePiece_MineShaftCrossing, MineShaftCrossing::Create, L"MSCrossing"); + StructureFeatureIO::setPieceId( eStructurePiece_MineShaftRoom, MineShaftRoom::Create, L"MSRoom"); + StructureFeatureIO::setPieceId( eStructurePiece_MineShaftStairs, MineShaftStairs::Create, L"MSStairs"); } StructurePiece *MineShaftPieces::createRandomShaftPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth) @@ -80,6 +91,10 @@ StructurePiece *MineShaftPieces::generateAndAddPiece(StructurePiece *startPiece, return newPiece; } +MineShaftPieces::MineShaftRoom::MineShaftRoom() +{ + // for reflection +} MineShaftPieces::MineShaftRoom::MineShaftRoom(int genDepth, Random *random, int west, int north) : StructurePiece(genDepth) { @@ -199,6 +214,46 @@ bool MineShaftPieces::MineShaftRoom::postProcess(Level *level, Random *random, B return true; } +void MineShaftPieces::MineShaftRoom::addAdditonalSaveData(CompoundTag *tag) +{ + ListTag *entrances = new ListTag(L"Entrances"); + for (AUTO_VAR(it,childEntranceBoxes.begin()); it != childEntranceBoxes.end(); ++it) + { + BoundingBox *bb =*it; + entrances->add(bb->createTag(L"")); + } + tag->put(L"Entrances", entrances); +} + +void MineShaftPieces::MineShaftRoom::readAdditonalSaveData(CompoundTag *tag) +{ + ListTag *entrances = (ListTag *) tag->getList(L"Entrances"); + for (int i = 0; i < entrances->size(); i++) + { + childEntranceBoxes.push_back(new BoundingBox(entrances->get(i)->data)); + } +} + +MineShaftPieces::MineShaftCorridor::MineShaftCorridor() +{ + // for reflection +} + +void MineShaftPieces::MineShaftCorridor::addAdditonalSaveData(CompoundTag *tag) +{ + tag->putBoolean(L"hr", hasRails); + tag->putBoolean(L"sc", spiderCorridor); + tag->putBoolean(L"hps", hasPlacedSpider); + tag->putInt(L"Num", numSections); +} + +void MineShaftPieces::MineShaftCorridor::readAdditonalSaveData(CompoundTag *tag) +{ + hasRails = tag->getBoolean(L"hr"); + spiderCorridor = tag->getBoolean(L"sc"); + hasPlacedSpider = tag->getBoolean(L"hps"); + numSections = tag->getInt(L"Num"); +} MineShaftPieces::MineShaftCorridor::MineShaftCorridor(int genDepth, Random *random, BoundingBox *corridorBox, int direction) : StructurePiece(genDepth) @@ -370,6 +425,27 @@ void MineShaftPieces::MineShaftCorridor::addChildren(StructurePiece *startPiece, } } +bool MineShaftPieces::MineShaftCorridor::createChest(Level *level, BoundingBox *chunkBB, Random *random, int x, int y, int z, WeighedTreasureArray treasure, int numRolls) +{ + int worldX = getWorldX(x, z); + int worldY = getWorldY(y); + int worldZ = getWorldZ(x, z); + + if (chunkBB->isInside(worldX, worldY, worldZ)) + { + if (level->getTile(worldX, worldY, worldZ) == 0) + { + level->setTileAndData(worldX, worldY, worldZ, Tile::rail_Id, getOrientationData(Tile::rail_Id, random->nextBoolean() ? RailTile::DIR_FLAT_X : RailTile::DIR_FLAT_Z), Tile::UPDATE_CLIENTS); + shared_ptr chest = shared_ptr( new MinecartChest(level, worldX + 0.5f, worldY + 0.5f, worldZ + 0.5f) ); + WeighedTreasure::addChestItems(random, treasure, chest, numRolls); + level->addEntity(chest); + return true; + } + } + + return false; +} + bool MineShaftPieces::MineShaftCorridor::postProcess(Level *level, Random *random, BoundingBox *chunkBB) { if (edgesLiquid(level, chunkBB)) @@ -439,9 +515,9 @@ bool MineShaftPieces::MineShaftCorridor::postProcess(Level *level, Random *rando if (chunkBB->isInside(x, y, newZ)) { hasPlacedSpider = true; - level->setTile(x, y, newZ, Tile::mobSpawner_Id); + level->setTileAndData(x, y, newZ, Tile::mobSpawner_Id, 0, Tile::UPDATE_CLIENTS); shared_ptr entity = dynamic_pointer_cast( level->getTileEntity(x, y, newZ) ); - if (entity != NULL) entity->setEntityId(L"CaveSpider"); + if (entity != NULL) entity->getSpawner()->setEntityId(L"CaveSpider"); } } } @@ -466,7 +542,7 @@ bool MineShaftPieces::MineShaftCorridor::postProcess(Level *level, Random *rando int floor = getBlock(level, x0 + 1, y0 - 1, z, chunkBB); if (floor > 0 && Tile::solid[floor]) { - maybeGenerateBlock(level, chunkBB, random, .7f, x0 + 1, y0, z, Tile::rail_Id, getOrientationData(Tile::rail_Id, RailTile::DIR_FLAT_Z)); + maybeGenerateBlock(level, chunkBB, random, .7f, x0 + 1, y0, z, Tile::rail_Id, getOrientationData(Tile::rail_Id, BaseRailTile::DIR_FLAT_Z)); } } } @@ -474,6 +550,23 @@ bool MineShaftPieces::MineShaftCorridor::postProcess(Level *level, Random *rando return true; } +MineShaftPieces::MineShaftCrossing::MineShaftCrossing() +{ + // for reflection +} + +void MineShaftPieces::MineShaftCrossing::addAdditonalSaveData(CompoundTag *tag) +{ + tag->putBoolean(L"tf", isTwoFloored); + tag->putInt(L"D", direction); +} + +void MineShaftPieces::MineShaftCrossing::readAdditonalSaveData(CompoundTag *tag) +{ + isTwoFloored = tag->getBoolean(L"tf"); + direction = tag->getInt(L"D"); +} + MineShaftPieces::MineShaftCrossing::MineShaftCrossing(int genDepth, Random *random, BoundingBox *crossingBox, int direction) : StructurePiece(genDepth), direction(direction), isTwoFloored( crossingBox->getYSpan() > DEFAULT_SHAFT_HEIGHT ) { @@ -609,6 +702,10 @@ bool MineShaftPieces::MineShaftCrossing::postProcess(Level *level, Random *rando return true; } +MineShaftPieces::MineShaftStairs::MineShaftStairs() +{ + // for reflection +} MineShaftPieces::MineShaftStairs::MineShaftStairs(int genDepth, Random *random, BoundingBox *stairsBox, int direction) : StructurePiece(genDepth) { @@ -616,6 +713,15 @@ MineShaftPieces::MineShaftStairs::MineShaftStairs(int genDepth, Random *random, boundingBox = stairsBox; } + +void MineShaftPieces::MineShaftStairs::addAdditonalSaveData(CompoundTag *tag) +{ +} + +void MineShaftPieces::MineShaftStairs::readAdditonalSaveData(CompoundTag *tag) +{ +} + BoundingBox *MineShaftPieces::MineShaftStairs::findStairs(list *pieces, Random *random, int footX, int footY, int footZ, int direction) { // stairs are two steps in, 5x5 steps down, two steps out diff --git a/Minecraft.World/MineShaftPieces.h b/Minecraft.World/MineShaftPieces.h index 5f9cf000..c2278467 100644 --- a/Minecraft.World/MineShaftPieces.h +++ b/Minecraft.World/MineShaftPieces.h @@ -11,6 +11,10 @@ private: static const int MAX_DEPTH = 8; // 1.2.3 change +public: + static void loadStatic(); + +private: static StructurePiece *createRandomShaftPiece(list *pieces, Random *random, int footX, int footY, int footZ, int direction, int genDepth); static StructurePiece *generateAndAddPiece(StructurePiece *startPiece, list *pieces, Random *random, int footX, int footY, int footZ, int direction, int depth); @@ -21,15 +25,24 @@ private: public: class MineShaftRoom : public StructurePiece { + public: + static StructurePiece *Create() { return new MineShaftRoom(); } + virtual EStructurePiece GetType() { return eStructurePiece_MineShaftRoom; } + private: list childEntranceBoxes; public: + MineShaftRoom(); MineShaftRoom(int genDepth, Random *random, int west, int north); ~MineShaftRoom(); virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + + protected: + void addAdditonalSaveData(CompoundTag *tag); + void readAdditonalSaveData(CompoundTag *tag); }; /** @@ -38,17 +51,33 @@ public: */ class MineShaftCorridor : public StructurePiece { + public: + static StructurePiece *Create() { return new MineShaftCorridor(); } + virtual EStructurePiece GetType() { return eStructurePiece_MineShaftCorridor; } + private: bool hasRails; // was final bool spiderCorridor; // was final bool hasPlacedSpider; int numSections; + public: + MineShaftCorridor(); + + protected: + void addAdditonalSaveData(CompoundTag *tag); + void readAdditonalSaveData(CompoundTag *tag); + public: MineShaftCorridor(int genDepth, Random *random, BoundingBox *corridorBox, int direction); static BoundingBox *findCorridorSize(list *pieces, Random *random, int footX, int footY, int footZ, int direction); virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); + + protected: + virtual bool createChest(Level *level, BoundingBox *chunkBB, Random *random, int x, int y, int z, WeighedTreasureArray treasure, int numRolls); + + public: virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); }; @@ -58,9 +87,20 @@ public: */ class MineShaftCrossing : public StructurePiece { + public: + static StructurePiece *Create() { return new MineShaftCrossing(); } + virtual EStructurePiece GetType() { return eStructurePiece_MineShaftCrossing; } + private: - const int direction; - const bool isTwoFloored; + int direction; + bool isTwoFloored; + + public: + MineShaftCrossing(); + + protected: + void addAdditonalSaveData(CompoundTag *tag); + void readAdditonalSaveData(CompoundTag *tag); public: MineShaftCrossing(int genDepth, Random *random, BoundingBox *crossingBox, int direction); @@ -77,8 +117,18 @@ public: class MineShaftStairs : public StructurePiece { public: + static StructurePiece *Create() { return new MineShaftStairs(); } + virtual EStructurePiece GetType() { return eStructurePiece_MineShaftStairs; } + + public: + MineShaftStairs(); MineShaftStairs(int genDepth, Random *random, BoundingBox *stairsBox, int direction); + protected: + void addAdditonalSaveData(CompoundTag *tag); + void readAdditonalSaveData(CompoundTag *tag); + + public: static BoundingBox *findStairs(list *pieces, Random *random, int footX, int footY, int footZ, int direction); virtual void addChildren(StructurePiece *startPiece, list *pieces, Random *random); virtual bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); diff --git a/Minecraft.World/MineShaftStart.cpp b/Minecraft.World/MineShaftStart.cpp index badd3a04..eaf9f7c8 100644 --- a/Minecraft.World/MineShaftStart.cpp +++ b/Minecraft.World/MineShaftStart.cpp @@ -1,7 +1,12 @@ #include "stdafx.h" #include "net.minecraft.world.level.levelgen.structure.h" -MineShaftStart::MineShaftStart(Level *level, Random *random, int chunkX, int chunkZ) +MineShaftStart::MineShaftStart() +{ + // for reflection +} + +MineShaftStart::MineShaftStart(Level *level, Random *random, int chunkX, int chunkZ) : StructureStart(chunkX, chunkZ) { MineShaftPieces::MineShaftRoom *mineShaftRoom = new MineShaftPieces::MineShaftRoom(0, random, (chunkX << 4) + 2, (chunkZ << 4) + 2); pieces.push_back(mineShaftRoom); diff --git a/Minecraft.World/MineShaftStart.h b/Minecraft.World/MineShaftStart.h index b46e3d67..7afb9b62 100644 --- a/Minecraft.World/MineShaftStart.h +++ b/Minecraft.World/MineShaftStart.h @@ -5,5 +5,10 @@ class MineShaftStart : public StructureStart { public: + static StructureStart *Create() { return new MineShaftStart(); } + virtual EStructureStart GetType() { return eStructureStart_MineShaftStart; } + +public: + MineShaftStart(); MineShaftStart(Level *level, Random *random, int chunkX, int chunkZ); }; \ No newline at end of file diff --git a/Minecraft.World/Minecart.cpp b/Minecraft.World/Minecart.cpp index 2b8fbb95..48787f55 100644 --- a/Minecraft.World/Minecart.cpp +++ b/Minecraft.World/Minecart.cpp @@ -1,4 +1,5 @@ #include "stdafx.h" +#include "net.minecraft.world.level.dimension.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.phys.h" @@ -8,6 +9,8 @@ #include "net.minecraft.world.entity.animal.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.damagesource.h" +#include "..\Minecraft.Client\MinecraftServer.h" +#include "..\Minecraft.Client\ServerLevel.h" #include "com.mojang.nbt.h" #include "Minecart.h" #include "SharedConstants.h" @@ -16,89 +19,23 @@ const int Minecart::EXITS[][2][3] = { // // - { - { - +0, +0, -1 - }, { - +0, +0, +1 - } - }, // 0 - { - { - -1, +0, +0 - }, { - +1, +0, +0 - } - }, // 1 - { - { - -1, -1, +0 - }, { - +1, +0, +0 - } - }, // 2 - { - { - -1, +0, +0 - }, { - +1, -1, +0 - } - }, // 3 - { - { - +0, +0, -1 - }, { - +0, -1, +1 - } - }, // 4 - { - { - +0, -1, -1 - }, { - +0, +0, +1 - } - }, // 5 + {{+0, +0, -1}, {+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..61d0d32b --- /dev/null +++ b/Minecraft.World/MinecartContainer.cpp @@ -0,0 +1,233 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.item.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.inventory.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.redstone.h" +#include "MinecartContainer.h" + +void MinecartContainer::_init() +{ + items = ItemInstanceArray(9 * 4); + dropEquipment = true; + + // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that + // the derived version of the function is called + this->defineSynchedData(); +} + +MinecartContainer::MinecartContainer(Level *level) : Minecart(level) +{ + _init(); +} + +MinecartContainer::MinecartContainer(Level *level, double x, double y, double z) : Minecart(level, x, y, z) +{ + _init(); +} + +void MinecartContainer::destroy(DamageSource *source) +{ + Minecart::destroy(source); + + for (int i = 0; i < getContainerSize(); i++) + { + shared_ptr item = getItem(i); + if (item != NULL) + { + float xo = random->nextFloat() * 0.8f + 0.1f; + float yo = random->nextFloat() * 0.8f + 0.1f; + float zo = random->nextFloat() * 0.8f + 0.1f; + + while (item->count > 0) + { + int count = random->nextInt(21) + 10; + if (count > item->count) count = item->count; + item->count -= count; + + shared_ptr itemEntity = shared_ptr( new ItemEntity(level, x + xo, y + yo, z + zo, shared_ptr( new ItemInstance(item->id, count, item->getAuxValue()))) ); + float pow = 0.05f; + itemEntity->xd = (float) random->nextGaussian() * pow; + itemEntity->yd = (float) random->nextGaussian() * pow + 0.2f; + itemEntity->zd = (float) random->nextGaussian() * pow; + level->addEntity(itemEntity); + } + } + } +} + +shared_ptr MinecartContainer::getItem(unsigned int slot) +{ + return items[slot]; +} + +shared_ptr MinecartContainer::removeItem(unsigned int slot, int count) +{ + if (items[slot] != NULL) + { + if (items[slot]->count <= count) + { + shared_ptr item = items[slot]; + items[slot] = nullptr; + return item; + } + else + { + shared_ptr i = items[slot]->remove(count); + if (items[slot]->count == 0) items[slot] = nullptr; + return i; + } + } + return nullptr; +} + +shared_ptr MinecartContainer::removeItemNoUpdate(int slot) +{ + if (items[slot] != NULL) + { + shared_ptr item = items[slot]; + items[slot] = nullptr; + return item; + } + return nullptr; +} + +void MinecartContainer::setItem(unsigned int slot, shared_ptr item) +{ + items[slot] = item; + if (item != NULL && item->count > getMaxStackSize()) item->count = getMaxStackSize(); +} + +void MinecartContainer::setChanged() +{ +} + +bool MinecartContainer::stillValid(shared_ptr player) +{ + if (removed) return false; + if (player->distanceToSqr(shared_from_this()) > 8 * 8) return false; + return true; +} + +void MinecartContainer::startOpen() +{ +} + +void MinecartContainer::stopOpen() +{ +} + +bool MinecartContainer::canPlaceItem(int slot, shared_ptr item) +{ + return true; +} + +wstring MinecartContainer::getName() +{ + return hasCustomName() ? getCustomName() : app.GetString(IDS_CONTAINER_MINECART); +} + +int MinecartContainer::getMaxStackSize() +{ + return Container::LARGE_MAX_STACK_SIZE; +} + +void MinecartContainer::changeDimension(int i) +{ + dropEquipment = false; + Minecart::changeDimension(i); +} + +void MinecartContainer::remove() +{ + if (dropEquipment) + { + for (int i = 0; i < getContainerSize(); i++) + { + shared_ptr item = getItem(i); + if (item != NULL) + { + float xo = random->nextFloat() * 0.8f + 0.1f; + float yo = random->nextFloat() * 0.8f + 0.1f; + float zo = random->nextFloat() * 0.8f + 0.1f; + + while (item->count > 0) + { + int count = random->nextInt(21) + 10; + if (count > item->count) count = item->count; + item->count -= count; + + shared_ptr itemEntity = shared_ptr( new ItemEntity(level, x + xo, y + yo, z + zo, shared_ptr( new ItemInstance(item->id, count, item->getAuxValue())))); + + if (item->hasTag()) + { + itemEntity->getItem()->setTag((CompoundTag *) item->getTag()->copy()); + } + + float pow = 0.05f; + itemEntity->xd = (float) random->nextGaussian() * pow; + itemEntity->yd = (float) random->nextGaussian() * pow + 0.2f; + itemEntity->zd = (float) random->nextGaussian() * pow; + level->addEntity(itemEntity); + } + } + } + } + + Minecart::remove(); +} + +void MinecartContainer::addAdditonalSaveData(CompoundTag *base) +{ + Minecart::addAdditonalSaveData(base); + + ListTag *listTag = new ListTag(); + + for (int i = 0; i < items.length; i++) + { + if (items[i] != NULL) + { + CompoundTag *tag = new CompoundTag(); + tag->putByte(L"Slot", (byte) i); + items[i]->save(tag); + listTag->add(tag); + } + } + base->put(L"Items", listTag); +} + +void MinecartContainer::readAdditionalSaveData(CompoundTag *base) +{ + Minecart::readAdditionalSaveData(base); + + ListTag *inventoryList = (ListTag *) base->getList(L"Items"); + delete [] items.data; + items = ItemInstanceArray(getContainerSize()); + for (int i = 0; i < inventoryList->size(); i++) + { + CompoundTag *tag = inventoryList->get(i); + int slot = tag->getByte(L"Slot") & 0xff; + if (slot >= 0 && slot < items.length) items[slot] = ItemInstance::fromTag(tag); + } +} + +bool MinecartContainer::interact(shared_ptr player) +{ + if (!level->isClientSide) + { + player->openContainer( dynamic_pointer_cast(shared_from_this())); + } + + return true; +} + +void MinecartContainer::applyNaturalSlowdown() +{ + shared_ptr container = dynamic_pointer_cast(shared_from_this()); + int emptiness = Redstone::SIGNAL_MAX - AbstractContainerMenu::getRedstoneSignalFromContainer(container); + float keep = 0.98f + (emptiness * 0.001f); + + xd *= keep; + yd *= 0; + zd *= keep; +} \ No newline at end of file diff --git a/Minecraft.World/MinecartContainer.h b/Minecraft.World/MinecartContainer.h new file mode 100644 index 00000000..89517658 --- /dev/null +++ b/Minecraft.World/MinecartContainer.h @@ -0,0 +1,48 @@ +#pragma once + +#include "Minecart.h" +#include "Container.h" + +class MinecartContainer : public Minecart, public virtual Container +{ +private: + ItemInstanceArray items; + bool dropEquipment; + + void _init(); + +public: + MinecartContainer(Level *level); + MinecartContainer(Level *level, double x, double y, double z); + + virtual void destroy(DamageSource *source); + virtual shared_ptr getItem(unsigned int slot); + virtual shared_ptr removeItem(unsigned int slot, int count); + virtual shared_ptr removeItemNoUpdate(int slot); + virtual void setItem(unsigned int slot, shared_ptr item); + virtual void setChanged(); + virtual bool stillValid(shared_ptr player); + virtual void startOpen(); + virtual void stopOpen(); + virtual bool canPlaceItem(int slot, shared_ptr item); + virtual wstring getName(); + virtual int getMaxStackSize(); + virtual void changeDimension(int i); + virtual void remove(); + +protected: + virtual void addAdditonalSaveData(CompoundTag *base); + virtual void readAdditionalSaveData(CompoundTag *base); + +public: + virtual bool interact(shared_ptr player); + +protected: + virtual void applyNaturalSlowdown(); + +public: + + // 4J Stu - For container + virtual bool hasCustomName() { return Minecart::hasCustomName(); } + virtual wstring getCustomName() { return Minecart::getCustomName(); } +}; \ No newline at end of file diff --git a/Minecraft.World/MinecartFurnace.cpp b/Minecraft.World/MinecartFurnace.cpp new file mode 100644 index 00000000..24950d5c --- /dev/null +++ b/Minecraft.World/MinecartFurnace.cpp @@ -0,0 +1,179 @@ +#include "stdafx.h" +#include "net.minecraft.world.damagesource.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.network.packet.h" +#include "MinecartFurnace.h" + +MinecartFurnace::MinecartFurnace(Level *level) : Minecart(level) +{ + defineSynchedData(); + + fuel = 0; + xPush = zPush = 0.0f; +} + +MinecartFurnace::MinecartFurnace(Level *level, double x, double y, double z) : Minecart(level, x, y, z) +{ + defineSynchedData(); + + fuel = 0; + xPush = zPush = 0.0f; +} + +// 4J Added +int MinecartFurnace::getContainerType() +{ + return ContainerOpenPacket::MINECART_HOPPER; +} + +int MinecartFurnace::getType() +{ + return TYPE_FURNACE; +} + +void MinecartFurnace::defineSynchedData() +{ + Minecart::defineSynchedData(); + entityData->define(DATA_ID_FUEL, (byte) 0); +} + +void MinecartFurnace::tick() +{ + Minecart::tick(); + + if (fuel > 0) + { + fuel--; + } + if (fuel <= 0) + { + xPush = zPush = 0; + } + setHasFuel(fuel > 0); + + if (hasFuel() && random->nextInt(4) == 0) + { + level->addParticle(eParticleType_largesmoke, x, y + 0.8, z, 0, 0, 0); + } +} + +void MinecartFurnace::destroy(DamageSource *source) +{ + Minecart::destroy(source); + + if (!source->isExplosion()) + { + spawnAtLocation(shared_ptr(new ItemInstance(Tile::furnace, 1)), 0); + } +} + +void MinecartFurnace::moveAlongTrack(int xt, int yt, int zt, double maxSpeed, double slideSpeed, int tile, int data) +{ + Minecart::moveAlongTrack(xt, yt, zt, maxSpeed, slideSpeed, tile, data); + + double sd = xPush * xPush + zPush * zPush; + if (sd > 0.01 * 0.01 && xd * xd + zd * zd > 0.001) + { + sd = Mth::sqrt(sd); + xPush /= sd; + zPush /= sd; + + if (xPush * xd + zPush * zd < 0) + { + xPush = 0; + zPush = 0; + } + else + { + xPush = xd; + zPush = zd; + } + } +} + +void MinecartFurnace::applyNaturalSlowdown() +{ + double sd = xPush * xPush + zPush * zPush; + + if (sd > 0.01 * 0.01) + { + sd = Mth::sqrt(sd); + xPush /= sd; + zPush /= sd; + double speed = 0.05; + xd *= 0.8f; + yd *= 0; + zd *= 0.8f; + xd += xPush * speed; + zd += zPush * speed; + } + else + { + xd *= 0.98f; + yd *= 0; + zd *= 0.98f; + } + + Minecart::applyNaturalSlowdown(); +} + +bool MinecartFurnace::interact(shared_ptr player) +{ + shared_ptr selected = player->inventory->getSelected(); + if (selected != NULL && selected->id == Item::coal_Id) + { + if (!player->abilities.instabuild && --selected->count == 0) player->inventory->setItem(player->inventory->selected, nullptr); + fuel += SharedConstants::TICKS_PER_SECOND * 180; + + } + xPush = x - player->x; + zPush = z - player->z; + + return true; +} + +void MinecartFurnace::addAdditonalSaveData(CompoundTag *base) +{ + Minecart::addAdditonalSaveData(base); + base->putDouble(L"PushX", xPush); + base->putDouble(L"PushZ", zPush); + base->putShort(L"Fuel", (short) fuel); +} + +void MinecartFurnace::readAdditionalSaveData(CompoundTag *base) +{ + Minecart::readAdditionalSaveData(base); + xPush = base->getDouble(L"PushX"); + zPush = base->getDouble(L"PushZ"); + fuel = base->getShort(L"Fuel"); +} + +bool MinecartFurnace::hasFuel() +{ + return (entityData->getByte(DATA_ID_FUEL) & 1) != 0; +} + +void MinecartFurnace::setHasFuel(bool fuel) +{ + if (fuel) + { + entityData->set(DATA_ID_FUEL, (byte) (entityData->getByte(DATA_ID_FUEL) | 1)); + } + else + { + entityData->set(DATA_ID_FUEL, (byte) (entityData->getByte(DATA_ID_FUEL) & ~1)); + } +} + +Tile *MinecartFurnace::getDefaultDisplayTile() +{ + return Tile::furnace_lit; +} + +int MinecartFurnace::getDefaultDisplayData() +{ + return 2; +} \ No newline at end of file diff --git a/Minecraft.World/MinecartFurnace.h b/Minecraft.World/MinecartFurnace.h new file mode 100644 index 00000000..aa8bf9e0 --- /dev/null +++ b/Minecraft.World/MinecartFurnace.h @@ -0,0 +1,51 @@ +#pragma once + +#include "Minecart.h" + +class MinecartFurnace : public Minecart +{ +public: + eINSTANCEOF GetType() { return eTYPE_MINECART_FURNACE; }; + static Entity *create(Level *level) { return new MinecartFurnace(level); } + +private: + static const int DATA_ID_FUEL = 16; + +private: + int fuel; + +public: + double xPush, zPush; + + MinecartFurnace(Level *level); + MinecartFurnace(Level *level, double x, double y, double z); + + // 4J added + virtual int getContainerType(); + + int getType(); + +protected: + void defineSynchedData(); + +public: + void tick(); + void destroy(DamageSource *source); + +protected: + void moveAlongTrack(int xt, int yt, int zt, double maxSpeed, double slideSpeed, int tile, int data); + void applyNaturalSlowdown(); + +public: + bool interact(shared_ptr player); + +protected: + void addAdditonalSaveData(CompoundTag *base); + void readAdditionalSaveData(CompoundTag *base); + bool hasFuel(); + void setHasFuel(bool fuel); + +public: + Tile *getDefaultDisplayTile(); + int getDefaultDisplayData(); +}; \ No newline at end of file diff --git a/Minecraft.World/MinecartHopper.cpp b/Minecraft.World/MinecartHopper.cpp new file mode 100644 index 00000000..8bf02f8f --- /dev/null +++ b/Minecraft.World/MinecartHopper.cpp @@ -0,0 +1,165 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.tile.entity.h" +#include "net.minecraft.world.entity.item.h" +#include "net.minecraft.world.phys.h" +#include "MinecartHopper.h" + +const int MinecartHopper::MOVE_ITEM_SPEED = HopperTileEntity::MOVE_ITEM_SPEED / 2; + +void MinecartHopper::_init() +{ + enabled = true; + cooldownTime = -1; + + // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that + // the derived version of the function is called + this->defineSynchedData(); +} + +MinecartHopper::MinecartHopper(Level *level) : MinecartContainer(level) +{ + _init(); +} + +MinecartHopper::MinecartHopper(Level *level, double x, double y, double z) : MinecartContainer(level, x, y, z) +{ + _init(); +} + +int MinecartHopper::getType() +{ + return TYPE_HOPPER; +} + +Tile *MinecartHopper::getDefaultDisplayTile() +{ + return Tile::hopper; +} + +int MinecartHopper::getDefaultDisplayOffset() +{ + return 1; +} + +unsigned int MinecartHopper::getContainerSize() +{ + return 5; +} + +bool MinecartHopper::interact(shared_ptr player) +{ + if (!level->isClientSide) + { + player->openHopper(dynamic_pointer_cast(shared_from_this())); + } + + return true; +} + +void MinecartHopper::activateMinecart(int xt, int yt, int zt, bool state) +{ + bool newEnabled = !state; + + if (newEnabled != isEnabled()) + { + setEnabled(newEnabled); + } +} + +bool MinecartHopper::isEnabled() +{ + return enabled; +} + +void MinecartHopper::setEnabled(bool enabled) +{ + this->enabled = enabled; +} + +Level *MinecartHopper::getLevel() +{ + return level; +} + +double MinecartHopper::getLevelX() +{ + return x; +} + +double MinecartHopper::getLevelY() +{ + return y; +} + +double MinecartHopper::getLevelZ() +{ + return z; +} + +void MinecartHopper::tick() +{ + MinecartContainer::tick(); + + if (!level->isClientSide && isAlive() && isEnabled()) + { + cooldownTime--; + if (!isOnCooldown()) + { + setCooldown(0); + + if (suckInItems()) + { + setCooldown(MOVE_ITEM_SPEED); + MinecartContainer::setChanged(); + } + } + } +} + +bool MinecartHopper::suckInItems() +{ + if (HopperTileEntity::suckInItems(this)) return true; + + vector > *items = level->getEntitiesOfClass(typeid(ItemEntity), bb->grow(0.25f, 0, 0.25f), EntitySelector::ENTITY_STILL_ALIVE); + + if (items->size() > 0) + { + HopperTileEntity::addItem( this, dynamic_pointer_cast(items->at(0)) ); + } + delete items; + + return false; +} + +void MinecartHopper::destroy(DamageSource *source) +{ + MinecartContainer::destroy(source); + + spawnAtLocation(Tile::hopper_Id, 1, 0); +} + +void MinecartHopper::addAdditonalSaveData(CompoundTag *base) +{ + MinecartContainer::addAdditonalSaveData(base); + base->putInt(L"TransferCooldown", cooldownTime); +} + +void MinecartHopper::readAdditionalSaveData(CompoundTag *base) +{ + MinecartContainer::readAdditionalSaveData(base); + cooldownTime = base->getInt(L"TransferCooldown"); +} + +void MinecartHopper::setCooldown(int time) +{ + cooldownTime = time; +} + +bool MinecartHopper::isOnCooldown() +{ + return cooldownTime > 0; +} \ No newline at end of file diff --git a/Minecraft.World/MinecartHopper.h b/Minecraft.World/MinecartHopper.h new file mode 100644 index 00000000..874bab6a --- /dev/null +++ b/Minecraft.World/MinecartHopper.h @@ -0,0 +1,64 @@ +#pragma once + +#include "MinecartContainer.h" +#include "Hopper.h" + +class MinecartHopper : public MinecartContainer, public Hopper +{ +public: + eINSTANCEOF GetType() { return eTYPE_MINECART_HOPPER; }; + static Entity *create(Level *level) { return new MinecartHopper(level); } + +public: + static const int MOVE_ITEM_SPEED; + +private: + bool enabled; + int cooldownTime; + + void _init(); + +public: + MinecartHopper(Level *level); + MinecartHopper(Level *level, double x, double y, double z); + + virtual int getType(); + virtual Tile *getDefaultDisplayTile(); + virtual int getDefaultDisplayOffset(); + virtual unsigned int getContainerSize(); + virtual bool interact(shared_ptr player); + virtual void activateMinecart(int xt, int yt, int zt, bool state); + virtual bool isEnabled(); + virtual void setEnabled(bool enabled); + virtual Level *getLevel(); + virtual double getLevelX(); + virtual double getLevelY(); + virtual double getLevelZ(); + virtual void tick(); + virtual bool suckInItems(); + virtual void destroy(DamageSource *source); + +protected: + virtual void addAdditonalSaveData(CompoundTag *base); + virtual void readAdditionalSaveData(CompoundTag *base); + +public: + void setCooldown(int time); + bool isOnCooldown(); + + // 4J For Hopper + virtual shared_ptr getItem(unsigned int slot) { return MinecartContainer::getItem(slot); } + virtual shared_ptr removeItem(unsigned int slot, int count) { return MinecartContainer::removeItem(slot, count); } + virtual shared_ptr removeItemNoUpdate(int slot) { return MinecartContainer::removeItemNoUpdate(slot); } + virtual void setItem(unsigned int slot, shared_ptr item) { MinecartContainer::setItem(slot, item); } + virtual wstring getName() { return MinecartContainer::getName(); } + virtual wstring getCustomName() { return MinecartContainer::getCustomName(); } + virtual bool hasCustomName() { return MinecartContainer::hasCustomName(); } + virtual int getMaxStackSize() { return MinecartContainer::getMaxStackSize(); } + + virtual void setChanged() { MinecartContainer::setChanged(); } + virtual bool stillValid(shared_ptr player) { return MinecartContainer::stillValid(player); } + virtual void startOpen() { MinecartContainer::startOpen(); } + virtual void stopOpen() { MinecartContainer::stopOpen(); } + virtual bool canPlaceItem(int slot, shared_ptr item) { return MinecartContainer::canPlaceItem(slot, item); } +}; \ No newline at end of file diff --git a/Minecraft.World/MinecartItem.cpp b/Minecraft.World/MinecartItem.cpp index 3b062ccf..6100be65 100644 --- a/Minecraft.World/MinecartItem.cpp +++ b/Minecraft.World/MinecartItem.cpp @@ -6,10 +6,68 @@ #include "ItemInstance.h" #include "MinecartItem.h" + +shared_ptr MinecartItem::MinecartDispenseBehavior::execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome) +{ + FacingEnum *facing = DispenserTile::getFacing(source->getData()); + Level *world = source->getWorld(); + + // Spawn the minecart 'just' outside the dispenser, it overlaps 2 'pixels' now. + // Also at half-block-height so it can connect with sloped rails + double spawnX = source->getX() + facing->getStepX() * (1 + 2.0f / 16); + double spawnY = source->getY() + facing->getStepY() * (1 + 2.0f / 16); + double spawnZ = source->getZ() + facing->getStepZ() * (1 + 2.0f / 16); + + int frontX = source->getBlockX() + facing->getStepX(); + int frontY = source->getBlockY() + facing->getStepY(); + int frontZ = source->getBlockZ() + facing->getStepZ(); + int inFront = world->getTile(frontX, frontY, frontZ); + + // 4J: If we're at limit, just dispense item (instead of adding minecart) + if (world->countInstanceOf(eTYPE_MINECART, false) >= Level::MAX_CONSOLE_MINECARTS) + { + outcome = DISPENCED_ITEM; + return defaultDispenseItemBehavior.dispense(source, dispensed); + } + + double yOffset; + if (BaseRailTile::isRail(inFront)) + { + yOffset = 0; + } + else if (inFront == 0 && BaseRailTile::isRail(world->getTile(frontX, frontY - 1, frontZ))) + { + yOffset = -1; + } + else + { + outcome = DISPENCED_ITEM; + return defaultDispenseItemBehavior.dispense(source, dispensed); + } + + outcome = ACTIVATED_ITEM; + + shared_ptr minecart = Minecart::createMinecart(world, spawnX, spawnY + yOffset, spawnZ, ((MinecartItem *) dispensed->getItem())->type); + if (dispensed->hasCustomHoverName()) + { + minecart->setCustomName(dispensed->getHoverName()); + } + world->addEntity(minecart); + + dispensed->remove(1); + return dispensed; +} + +void MinecartItem::MinecartDispenseBehavior::playSound(BlockSource *source) +{ + source->getWorld()->levelEvent(LevelEvent::SOUND_CLICK, source->getBlockX(), source->getBlockY(), source->getBlockZ(), 0); +} + MinecartItem::MinecartItem(int id, int type) : Item(id) { - this->maxStackSize = 1; + maxStackSize = 1; this->type = type; + DispenserTile::REGISTRY.add(this, new MinecartDispenseBehavior()); } bool MinecartItem::useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) @@ -17,13 +75,18 @@ bool MinecartItem::useOn(shared_ptr instance, shared_ptr p // 4J-PB - Adding a test only version to allow tooltips to be displayed int targetType = level->getTile(x, y, z); - if (RailTile::isRail(targetType)) + if (BaseRailTile::isRail(targetType)) { if(!bTestUseOnOnly) { if (!level->isClientSide) { - level->addEntity(shared_ptr( new Minecart(level, x + 0.5f, y + 0.5f, z + 0.5f, type) ) ); + shared_ptr cart = Minecart::createMinecart(level, x + 0.5f, y + 0.5f, z + 0.5f, type); + if (instance->hasCustomHoverName()) + { + cart->setCustomName(instance->getHoverName()); + } + level->addEntity(cart); } instance->count--; } diff --git a/Minecraft.World/MinecartItem.h b/Minecraft.World/MinecartItem.h index c63082a1..ed06ff1f 100644 --- a/Minecraft.World/MinecartItem.h +++ b/Minecraft.World/MinecartItem.h @@ -2,9 +2,23 @@ using namespace std; #include "Item.h" +#include "DefaultDispenseItemBehavior.h" class MinecartItem : public Item { +private: + class MinecartDispenseBehavior : public DefaultDispenseItemBehavior + { + private: + DefaultDispenseItemBehavior defaultDispenseItemBehavior; + + public: + virtual shared_ptr execute(BlockSource *source, shared_ptr dispensed, eOUTCOME &outcome); + + protected: + virtual void playSound(BlockSource *source); + }; + public: int type; diff --git a/Minecraft.World/MinecartRideable.cpp b/Minecraft.World/MinecartRideable.cpp new file mode 100644 index 00000000..a006a2bc --- /dev/null +++ b/Minecraft.World/MinecartRideable.cpp @@ -0,0 +1,39 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.level.h" +#include "MinecartRideable.h" + + +MinecartRideable::MinecartRideable(Level *level) : Minecart(level) +{ + + // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that + // the derived version of the function is called + this->defineSynchedData(); +} + +MinecartRideable::MinecartRideable(Level *level, double x, double y, double z) : Minecart(level, x, y, z) +{ + + // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that + // the derived version of the function is called + this->defineSynchedData(); +} + +bool MinecartRideable::interact(shared_ptr player) +{ + if (rider.lock() != NULL && rider.lock()->instanceof(eTYPE_PLAYER) && rider.lock() != player) return true; + if (rider.lock() != NULL && rider.lock() != player) return false; + if (!level->isClientSide) + { + player->ride(shared_from_this()); + } + + return true; +} + +int MinecartRideable::getType() +{ + return TYPE_RIDEABLE; +} \ No newline at end of file diff --git a/Minecraft.World/MinecartRideable.h b/Minecraft.World/MinecartRideable.h new file mode 100644 index 00000000..e6156acc --- /dev/null +++ b/Minecraft.World/MinecartRideable.h @@ -0,0 +1,17 @@ +#pragma once + +#include "Minecart.h" + +class MinecartRideable : public Minecart +{ +public: + eINSTANCEOF GetType() { return eTYPE_MINECART_RIDEABLE; }; + static Entity *create(Level *level) { return new MinecartRideable(level); } + +public: + MinecartRideable(Level *level); + MinecartRideable(Level *level, double x, double y, double z); + + virtual bool interact(shared_ptr player); + virtual int getType(); +}; \ No newline at end of file diff --git a/Minecraft.World/MinecartSpawner.cpp b/Minecraft.World/MinecartSpawner.cpp new file mode 100644 index 00000000..3fcd4ef0 --- /dev/null +++ b/Minecraft.World/MinecartSpawner.cpp @@ -0,0 +1,95 @@ +#include "stdafx.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "MinecartSpawner.h" + +MinecartSpawner::MinecartMobSpawner::MinecartMobSpawner(MinecartSpawner *parent) +{ + m_parent = parent; +} + +void MinecartSpawner::MinecartMobSpawner::broadcastEvent(int id) +{ + m_parent->level->broadcastEntityEvent(m_parent->shared_from_this(), (byte) id); +} + +Level *MinecartSpawner::MinecartMobSpawner::getLevel() +{ + return m_parent->level; +} + +int MinecartSpawner::MinecartMobSpawner::getX() +{ + return Mth::floor(m_parent->x); +} + +int MinecartSpawner::MinecartMobSpawner::getY() +{ + return Mth::floor(m_parent->y); +} + +int MinecartSpawner::MinecartMobSpawner::getZ() +{ + return Mth::floor(m_parent->z); +} + +MinecartSpawner::MinecartSpawner(Level *level) : Minecart(level) +{ + // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that + // the derived version of the function is called + this->defineSynchedData(); + + spawner = new MinecartMobSpawner(this); +} + +MinecartSpawner::MinecartSpawner(Level *level, double x, double y, double z) : Minecart(level, x, y, z) +{ + // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that + // the derived version of the function is called + this->defineSynchedData(); + + spawner = new MinecartMobSpawner(this); +} + +MinecartSpawner::~MinecartSpawner() +{ + delete spawner; +} + +int MinecartSpawner::getType() +{ + return TYPE_SPAWNER; +} + +Tile *MinecartSpawner::getDefaultDisplayTile() +{ + return Tile::mobSpawner; +} + +void MinecartSpawner::readAdditionalSaveData(CompoundTag *tag) +{ + Minecart::readAdditionalSaveData(tag); + spawner->load(tag); +} + +void MinecartSpawner::addAdditonalSaveData(CompoundTag *tag) +{ + Minecart::addAdditonalSaveData(tag); + spawner->save(tag); +} + +void MinecartSpawner::handleEntityEvent(byte eventId) +{ + spawner->onEventTriggered(eventId); +} + +void MinecartSpawner::tick() +{ + Minecart::tick(); + spawner->tick(); +} + +BaseMobSpawner *MinecartSpawner::getSpawner() +{ + return spawner; +} \ No newline at end of file diff --git a/Minecraft.World/MinecartSpawner.h b/Minecraft.World/MinecartSpawner.h new file mode 100644 index 00000000..a0b7944f --- /dev/null +++ b/Minecraft.World/MinecartSpawner.h @@ -0,0 +1,45 @@ +#pragma once + +#include "Minecart.h" +#include "BaseMobSpawner.h" + +class MinecartSpawner : public Minecart +{ +public: + eINSTANCEOF GetType() { return eTYPE_MINECART_SPAWNER; }; + static Entity *create(Level *level) { return new MinecartSpawner(level); } + +private: + BaseMobSpawner *spawner; + + class MinecartMobSpawner : public BaseMobSpawner + { + private: + MinecartSpawner *m_parent; + + public: + MinecartMobSpawner(MinecartSpawner *parent); + void broadcastEvent(int id); + Level *getLevel(); + int getX(); + int getY(); + int getZ(); + }; + +public: + MinecartSpawner(Level *level); + MinecartSpawner(Level *level, double x, double y, double z); + virtual ~MinecartSpawner(); + + virtual int getType(); + virtual Tile *getDefaultDisplayTile(); + +protected: + virtual void readAdditionalSaveData(CompoundTag *tag); + virtual void addAdditonalSaveData(CompoundTag *tag); + +public: + virtual void handleEntityEvent(byte eventId); + virtual void tick(); + virtual BaseMobSpawner *getSpawner(); +}; \ No newline at end of file diff --git a/Minecraft.World/MinecartTNT.cpp b/Minecraft.World/MinecartTNT.cpp new file mode 100644 index 00000000..26cac5cf --- /dev/null +++ b/Minecraft.World/MinecartTNT.cpp @@ -0,0 +1,168 @@ +#include "stdafx.h" +#include "net.minecraft.world.damagesource.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "MinecartTNT.h" + +void MinecartTNT::_init() +{ + // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that + // the derived version of the function is called + this->defineSynchedData(); + + fuse = -1; +} + +MinecartTNT::MinecartTNT(Level *level) : Minecart(level) +{ + _init(); +} + +MinecartTNT::MinecartTNT(Level *level, double x, double y, double z) : Minecart(level, x, y, z) +{ + _init(); +} + +int MinecartTNT::getType() +{ + return TYPE_TNT; +} + +Tile *MinecartTNT::getDefaultDisplayTile() +{ + return Tile::tnt; +} + +void MinecartTNT::tick() +{ + Minecart::tick(); + + if (fuse > 0) + { + fuse--; + level->addParticle(eParticleType_smoke, x, y + 0.5f, z, 0, 0, 0); + } + else if (fuse == 0) + { + explode(xd * xd + zd * zd); + } + + if (horizontalCollision) + { + double speedSqr = xd * xd + zd * zd; + + if (speedSqr >= 0.01f) + { + explode(speedSqr); + } + } +} + +void MinecartTNT::destroy(DamageSource *source) +{ + Minecart::destroy(source); + + double speedSqr = xd * xd + zd * zd; + + if (!source->isExplosion()) + { + spawnAtLocation( shared_ptr( new ItemInstance(Tile::tnt, 1) ), 0); + } + + if (source->isFire() || source->isExplosion() || speedSqr >= 0.01f) + { + explode(speedSqr); + } +} + +void MinecartTNT::explode(double speedSqr) +{ + if (!level->isClientSide) + { + double speed = sqrt(speedSqr); + if (speed > 5) speed = 5; + level->explode(shared_from_this(), x, y, z, (float) (4 + random->nextDouble() * 1.5f * speed), true); + remove(); + } +} + +void MinecartTNT::causeFallDamage(float distance) +{ + if (distance >= 3) + { + float power = distance / 10; + explode(power * power); + } + + Minecart::causeFallDamage(distance); +} + +void MinecartTNT::activateMinecart(int xt, int yt, int zt, bool state) +{ + if (state && fuse < 0) + { + primeFuse(); + } +} + +void MinecartTNT::handleEntityEvent(byte eventId) +{ + if (eventId == EVENT_PRIME) + { + primeFuse(); + } + else + { + Minecart::handleEntityEvent(eventId); + } +} + +void MinecartTNT::primeFuse() +{ + fuse = 80; + + if (!level->isClientSide) + { + level->broadcastEntityEvent(shared_from_this(), EVENT_PRIME); + level->playEntitySound(shared_from_this(), eSoundType_RANDOM_FUSE, 1, 1.0f); + } +} + +int MinecartTNT::getFuse() +{ + return fuse; +} + +bool MinecartTNT::isPrimed() +{ + return fuse > -1; +} + +float MinecartTNT::getTileExplosionResistance(Explosion *explosion, Level *level, int x, int y, int z, Tile *tile) +{ + if (isPrimed() && (BaseRailTile::isRail(tile->id) || BaseRailTile::isRail(level, x, y + 1, z))) + { + return 0; + } + + return Minecart::getTileExplosionResistance(explosion, level, x, y, z, tile); +} + +bool MinecartTNT::shouldTileExplode(Explosion *explosion, Level *level, int x, int y, int z, int id, float power) +{ + if (isPrimed() && (BaseRailTile::isRail(id) || BaseRailTile::isRail(level, x, y + 1, z))) return false; + + return Minecart::shouldTileExplode(explosion, level, x, y, z, id, power); +} + +void MinecartTNT::readAdditionalSaveData(CompoundTag *tag) +{ + Minecart::readAdditionalSaveData(tag); + if (tag->contains(L"TNTFuse")) fuse = tag->getInt(L"TNTFuse"); +} + +void MinecartTNT::addAdditonalSaveData(CompoundTag *tag) +{ + Minecart::addAdditonalSaveData(tag); + tag->putInt(L"TNTFuse", fuse); +} \ No newline at end of file diff --git a/Minecraft.World/MinecartTNT.h b/Minecraft.World/MinecartTNT.h new file mode 100644 index 00000000..8637803c --- /dev/null +++ b/Minecraft.World/MinecartTNT.h @@ -0,0 +1,43 @@ +#pragma once + +#include "Minecart.h" + +class MinecartTNT : public Minecart +{ +public: + eINSTANCEOF GetType() { return eTYPE_MINECART_TNT; }; + static Entity *create(Level *level) { return new MinecartTNT(level); } + +private: + static const byte EVENT_PRIME = 10; + + int fuse; + + void _init(); + +public: + MinecartTNT(Level *level); + MinecartTNT(Level *level, double x, double y, double z); + + virtual int getType(); + virtual Tile *getDefaultDisplayTile(); + virtual void tick(); + virtual void destroy(DamageSource *source); + +protected: + virtual void explode(double speedSqr); + virtual void causeFallDamage(float distance); + +public: + virtual void activateMinecart(int xt, int yt, int zt, bool state); + virtual void handleEntityEvent(byte eventId); + virtual void primeFuse(); + virtual int getFuse(); + virtual bool isPrimed(); + virtual float getTileExplosionResistance(Explosion *explosion, Level *level, int x, int y, int z, Tile *tile); + virtual bool shouldTileExplode(Explosion *explosion, Level *level, int x, int y, int z, int id, float power); + +protected: + virtual void readAdditionalSaveData(CompoundTag *tag); + virtual void addAdditonalSaveData(CompoundTag *tag); +}; \ No newline at end of file diff --git a/Minecraft.World/Minecraft.World.cpp b/Minecraft.World/Minecraft.World.cpp index 30495443..1ee6eb47 100644 --- a/Minecraft.World/Minecraft.World.cpp +++ b/Minecraft.World/Minecraft.World.cpp @@ -1,43 +1,21 @@ #include "stdafx.h" -#include "Packet.h" -#include "MaterialColor.h" -#include "Material.h" -#include "Tile.h" -#include "HatchetItem.h" -#include "PickaxeItem.h" -#include "ShovelItem.h" -#include "BlockReplacements.h" -#include "Biome.h" -#include "Item.h" -#include "FurnaceRecipes.h" -#include "Recipes.h" -#include "Stats.h" -#include "Achievements.h" -#include "Skeleton.h" -#include "PigZombie.h" -#include "TileEntity.h" -#include "EntityIO.h" -#include "SharedConstants.h" -#include "MobCategory.h" -#include "LevelChunk.h" -#include "MineShaftPieces.h" -#include "StrongholdFeature.h" -#include "VillageFeature.h" -#include "LevelType.h" -#include "EnderMan.h" -#include "PotionBrewing.h" -#include "Enchantment.h" -#include "VillagePieces.h" -#include "RandomScatteredLargeFeature.h" +#include "net.minecraft.world.item.h" +#include "net.minecraft.world.item.alchemy.h" +#include "net.minecraft.world.item.crafting.h" +#include "net.minecraft.world.item.enchantment.h" +#include "net.minecraft.world.level.chunk.h" +#include "net.minecraft.world.level.chunk.storage.h" +#include "net.minecraft.world.level.levelgen.structure.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.tile.entity.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.monster.h" +#include "net.minecraft.world.entity.npc.h" +#include "net.minecraft.world.effect.h" #include "Minecraft.World.h" #include "..\Minecraft.Client\ServerLevel.h" -#include "SparseLightStorage.h" -#include "SparseDataStorage.h" -#include "McRegionChunkStorage.h" -#include "Villager.h" -#include "LevelSettings.h" #ifdef _DURANGO #include "DurangoStats.h" @@ -60,7 +38,8 @@ void MinecraftWorld_RunStaticCtors() PickaxeItem::staticCtor(); ShovelItem::staticCtor(); BlockReplacements::staticCtor(); - Biome::staticCtor(); + Biome::staticCtor(); + MobEffect::staticCtor(); Item::staticCtor(); FurnaceRecipes::staticCtor(); Recipes::staticCtor(); @@ -71,8 +50,6 @@ void MinecraftWorld_RunStaticCtors() Stats::staticCtor(); #endif //Achievements::staticCtor(); // 4J Stu - This is now called from within the Stats::staticCtor() - Skeleton::staticCtor(); - PigZombie::staticCtor(); TileEntity::staticCtor(); EntityIO::staticCtor(); MobCategory::staticCtor(); @@ -82,11 +59,15 @@ void MinecraftWorld_RunStaticCtors() LevelType::staticCtor(); - MineShaftPieces::staticCtor(); - StrongholdFeature::staticCtor(); - VillagePieces::Smithy::staticCtor(); - VillageFeature::staticCtor(); - RandomScatteredLargeFeature::staticCtor(); + { + StructureFeatureIO::staticCtor(); + + MineShaftPieces::staticCtor(); + StrongholdFeature::staticCtor(); + VillagePieces::Smithy::staticCtor(); + VillageFeature::staticCtor(); + RandomScatteredLargeFeature::staticCtor(); + } } EnderMan::staticCtor(); PotionBrewing::staticCtor(); @@ -101,4 +82,5 @@ void MinecraftWorld_RunStaticCtors() McRegionChunkStorage::staticCtor(); Villager::staticCtor(); GameType::staticCtor(); + BeaconTileEntity::staticCtor(); } diff --git a/Minecraft.World/Minecraft.World.vcxproj b/Minecraft.World/Minecraft.World.vcxproj index 5146b56c..eeef292f 100644 --- a/Minecraft.World/Minecraft.World.vcxproj +++ b/Minecraft.World/Minecraft.World.vcxproj @@ -17,6 +17,10 @@ ContentPackage_NO_TU PSVita + + ContentPackage_NO_TU + Win32 + ContentPackage_NO_TU x64 @@ -41,6 +45,10 @@ CONTENTPACKAGE_SYMBOLS PSVita + + CONTENTPACKAGE_SYMBOLS + Win32 + CONTENTPACKAGE_SYMBOLS x64 @@ -65,6 +73,10 @@ ContentPackage_Vita PSVita + + ContentPackage_Vita + Win32 + ContentPackage_Vita x64 @@ -89,6 +101,10 @@ ContentPackage PSVita + + ContentPackage + Win32 + ContentPackage x64 @@ -113,6 +129,10 @@ Debug PSVita + + Debug + Win32 + Debug x64 @@ -137,6 +157,10 @@ ReleaseForArt PSVita + + ReleaseForArt + Win32 + ReleaseForArt x64 @@ -161,6 +185,10 @@ Release PSVita + + Release + Win32 + Release x64 @@ -179,7 +207,6 @@ SAK SAK title - 10.0 @@ -232,7 +259,11 @@ StaticLibrary MultiByte v143 - 10.0 + + + StaticLibrary + MultiByte + v143 StaticLibrary @@ -243,13 +274,22 @@ StaticLibrary MultiByte v143 - 10.0 + + + StaticLibrary + MultiByte + v143 StaticLibrary MultiByte v143 + + StaticLibrary + MultiByte + v143 + StaticLibrary Unicode @@ -323,21 +363,41 @@ MultiByte v143 + + StaticLibrary + MultiByte + v143 + StaticLibrary MultiByte v143 + + StaticLibrary + MultiByte + v143 + StaticLibrary MultiByte v143 + + StaticLibrary + MultiByte + v143 + StaticLibrary MultiByte v143 + + StaticLibrary + MultiByte + v143 + StaticLibrary Unicode @@ -361,7 +421,7 @@ StaticLibrary MultiByte - v110 + v143 Clang @@ -424,15 +484,24 @@ + + + + + + + + + @@ -478,15 +547,27 @@ + + + + + + + + + + + + @@ -518,7 +599,7 @@ $(OutDir)$(ProjectName).lib - $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras;$(ProjectDir)..\Minecraft.World\x64headers;$(IncludePath) + $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(ProjectDir)..\Minecraft.Client\PSVita\Assert;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras;$(ProjectDir)..\Minecraft.World\x64headers;$(IncludePath) $(OutDir)$(ProjectName).lib @@ -530,7 +611,7 @@ $(OutDir)$(ProjectName).lib - $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(MINECRAFT_CONSOLES_DIR)\Minecraft.Client\PSVita\Assert;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras;$(ProjectDir)..\Minecraft.World\x64headers;$(IncludePath) + $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras;$(ProjectDir)..\Minecraft.World\x64headers;$(IncludePath) $(OutDir)$(ProjectName).lib @@ -542,6 +623,12 @@ $(ProjectDir)\$(Platform)_$(Configuration)\ $(Platform)_$(Configuration)\ + + $(OutDir)$(ProjectName).lib + $(ProjectDir)\x64headers;$(IncludePath) + $(ProjectDir)\$(Platform)_$(Configuration)\ + $(Platform)_$(Configuration)\ + $(OutDir)$(ProjectName).lib $(ProjectDir)..\Minecraft.Client\Durango\DurangoExtras;$(ProjectDir)\x64headers;$(Console_SdkIncludeRoot) @@ -558,12 +645,24 @@ $(ProjectDir)\$(Platform)_$(Configuration)\ $(Platform)_$(Configuration)\ + + $(OutDir)$(ProjectName).lib + $(ProjectDir)\x64headers;$(IncludePath) + $(ProjectDir)\$(Platform)_$(Configuration)\ + $(Platform)_$(Configuration)\ + $(OutDir)$(ProjectName).lib $(ProjectDir)\x64headers;$(IncludePath) $(ProjectDir)\$(Platform)_$(Configuration)\ $(Platform)_$(Configuration)\ + + $(OutDir)$(ProjectName).lib + $(ProjectDir)\x64headers;$(IncludePath) + $(ProjectDir)\$(Platform)_$(Configuration)\ + $(Platform)_$(Configuration)\ + $(OutDir)$(ProjectName).lib $(ProjectDir)..\Minecraft.Client\Durango\DurangoExtras;$(ProjectDir)\x64headers;$(Console_SdkIncludeRoot) @@ -602,7 +701,7 @@ $(OutDir)$(ProjectName).lib - $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras;$(ProjectDir)..\Minecraft.World\x64headers;$(IncludePath) + $(SCE_PSP2_SDK_DIR)/target\src\npToolkit\include;$(ProjectDir)..\Minecraft.Client\PSVita\Assert;$(ProjectDir)\..\Minecraft.Client\PSVita\PSVitaExtras;$(ProjectDir)..\Minecraft.World\x64headers;$(IncludePath) $(OutDir)$(ProjectName).lib @@ -633,24 +732,46 @@ $(ProjectDir)\$(Platform)_$(Configuration)\ $(Platform)_$(Configuration)\ + + $(OutDir)$(ProjectName).lib + $(ProjectDir)\x64header;$(DXSDK_DIR)include;$(IncludePath) + $(ProjectDir)\$(Platform)_$(Configuration)\ + $(Platform)_$(Configuration)\ + $(OutDir)$(ProjectName).lib $(ProjectDir)\x64header;$(DXSDK_DIR)include;$(IncludePath) $(ProjectDir)\$(Platform)_$(Configuration)\ $(Platform)_$(Configuration)\ + + $(OutDir)$(ProjectName).lib + $(ProjectDir)\x64header;$(DXSDK_DIR)include;$(IncludePath) + $(ProjectDir)\$(Platform)_$(Configuration)\ + $(Platform)_$(Configuration)\ + $(OutDir)$(ProjectName).lib $(ProjectDir)\x64header;$(DXSDK_DIR)include;$(IncludePath) $(ProjectDir)\$(Platform)_$(Configuration)\ $(Platform)_$(Configuration)\ + + $(OutDir)$(ProjectName).lib + $(ProjectDir)\x64header;$(DXSDK_DIR)include;$(IncludePath) + $(ProjectDir)\$(Platform)_$(Configuration)\ + $(Platform)_$(Configuration)\ + $(OutDir)$(ProjectName).lib $(ProjectDir)\x64header;$(DXSDK_DIR)include;$(IncludePath) $(ProjectDir)\$(Configuration)\ $(ProjectDir)\$(Configuration)\ + + $(OutDir)$(ProjectName).lib + $(ProjectDir)\x64header;$(DXSDK_DIR)include;$(IncludePath) + $(OutDir)$(ProjectName).lib $(ProjectDir)\x64headers;$(Console_SdkIncludeRoot) @@ -1016,6 +1137,28 @@ true + + + Use + Level3 + ProgramDatabase + Disabled + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreadedDebug + _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_DEBUG;_LIB;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) + Disabled + true + false + false + true + Default + + + true + + Use @@ -1026,7 +1169,7 @@ true $(OutDir)$(ProjectName).pch MultiThreadedDebugDLL - SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;UNICODE;_UNICODE;__WRL_NO_DEFAULT_LIB__;WINAPI_FAMILY=WINAPI_FAMILY_TV_TITLE;WIN32_LEAN_AND_MEAN;_XM_AVX_INTRINSICS_;_DEBUG_MENUS_ENABLED;_DEBUG;_LIB;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_DURANGO;%(PreprocessorDefinitions) + SPLIT_SAVES;_LARGE_WORLDS;_EXTENDED_ACHIEVEMENTS;UNICODE;_UNICODE;__WRL_NO_DEFAULT_LIB__;WINAPI_FAMILY=WINAPI_FAMILY_TV_TITLE;WIN32_LEAN_AND_MEAN;_XM_AVX_INTRINSICS_;_DEBUG_MENUS_ENABLED;_DEBUG;_LIB;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_DURANGO;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions) Disabled true false @@ -1067,6 +1210,29 @@ true + + + Use + Level3 + ProgramDatabase + Full + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_LIB;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) + Disabled + true + false + false + true + Default + Speed + + + true + + Use @@ -1090,6 +1256,29 @@ true + + + Use + Level3 + ProgramDatabase + Full + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _LARGE_WORLDS;_DEBUG_MENUS_ENABLED;_LIB;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;_WINDOWS64;%(PreprocessorDefinitions) + Disabled + true + false + false + true + Default + Speed + + + true + + Use @@ -1414,6 +1603,7 @@ true Level2 Branchless2 + Cpp11 true @@ -1494,6 +1684,29 @@ true + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;NDEBUG;_XBOX;_LIB;_CONTENT_PACKAGE;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + + + true + true + true + + Level3 @@ -1517,6 +1730,29 @@ true + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;NDEBUG;_XBOX;_LIB;_CONTENT_PACKAGE;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + + + true + true + true + + Level3 @@ -1540,6 +1776,29 @@ true + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;NDEBUG;_XBOX;_LIB;_CONTENT_PACKAGE;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + + + true + true + true + + Level3 @@ -1563,6 +1822,29 @@ true + + + Level3 + Use + Full + true + true + ProgramDatabase + Speed + Sync + false + $(OutDir)$(ProjectName).pch + MultiThreaded + _TU_BUILD;_FINAL_BUILD;NDEBUG;_XBOX;_LIB;_CONTENT_PACKAGE;_CRT_NON_CONFORMING_SWPRINTFS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + + + true + true + true + + Level3 @@ -1770,7 +2052,9 @@ Document + + @@ -1780,6 +2064,7 @@ + @@ -1795,7 +2080,9 @@ + + @@ -1805,20 +2092,32 @@ - + + + + + + + + + + + + + @@ -1832,6 +2131,8 @@ + + @@ -1839,7 +2140,47 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1878,6 +2219,8 @@ + + @@ -1887,50 +2230,6 @@ - - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - @@ -1938,6 +2237,8 @@ + + @@ -1945,6 +2246,7 @@ + @@ -1978,8 +2280,10 @@ true true true + true + @@ -2001,9 +2305,12 @@ + + + @@ -2013,7 +2320,9 @@ + + @@ -2025,6 +2334,7 @@ + @@ -2040,7 +2350,12 @@ + + + + + @@ -2055,13 +2370,37 @@ + - + + + + + + + + + + + + + + + + + + + + + + + + @@ -2069,6 +2408,7 @@ + @@ -2076,6 +2416,7 @@ + @@ -2084,72 +2425,107 @@ - + + - - + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2162,6 +2538,8 @@ false + + @@ -2172,14 +2550,12 @@ - - @@ -2260,8 +2636,7 @@ - - + @@ -2330,7 +2705,7 @@ - + @@ -2386,9 +2761,9 @@ - + - + @@ -2457,7 +2832,7 @@ - + @@ -2477,7 +2852,7 @@ - + @@ -2542,16 +2917,66 @@ - + - + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + - + @@ -2584,7 +3009,7 @@ - + @@ -2614,7 +3039,6 @@ - @@ -2669,7 +3093,6 @@ - @@ -2709,6 +3132,7 @@ + @@ -2723,7 +3147,9 @@ + + @@ -2732,17 +3158,27 @@ - + + + + + + + + + + + @@ -2759,14 +3195,50 @@ + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2801,9 +3273,12 @@ false + false false false + false false + false false false @@ -2817,12 +3292,37 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2837,51 +3337,6 @@ - - false - false - false - false - false - false - false - false - false - false - false - false - false - false - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - @@ -2895,7 +3350,10 @@ + + + true true @@ -2926,21 +3384,47 @@ true true true + true true + true true + true true + true true + true true + true true + true + + + + + + + + + + + + + + + + + + + @@ -3044,7 +3528,7 @@ - + @@ -3057,7 +3541,7 @@ - + @@ -3066,8 +3550,8 @@ - - + + @@ -3086,7 +3570,7 @@ - + @@ -3111,6 +3595,7 @@ + @@ -3118,6 +3603,9 @@ + + + false @@ -3139,13 +3627,11 @@ - - @@ -3180,7 +3666,7 @@ - + @@ -3235,9 +3721,9 @@ - + - + @@ -3276,9 +3762,12 @@ false + false false false + false false + false false false @@ -3290,7 +3779,7 @@ - + @@ -3320,9 +3809,13 @@ true true true + true true + true true + true true + true true true true @@ -3338,9 +3831,12 @@ true true true + true true true + true true + true true true true @@ -3365,9 +3861,13 @@ true true true + true true + true true + true true + true true true true @@ -3383,9 +3883,12 @@ true true true + true true true + true true + true true true true @@ -3410,9 +3913,13 @@ true true true + true true + true true + true true + true true true true @@ -3428,9 +3935,12 @@ true true true + true true true + true true + true true true true @@ -3464,7 +3974,7 @@ - + @@ -3481,9 +3991,13 @@ true true true + true true + true true + true true + true true true true @@ -3499,9 +4013,12 @@ true true true + true true true + true true + true true true true @@ -3550,14 +4067,64 @@ - + - + + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + true + - + @@ -3593,7 +4160,7 @@ - + @@ -3606,9 +4173,12 @@ false + false false false + false false + false false false @@ -3628,9 +4198,12 @@ true true true + true true true + true true + true true true true @@ -3646,9 +4219,13 @@ true true true + true true + true true + true true + true true true true @@ -3675,7 +4252,6 @@ - @@ -3692,9 +4268,12 @@ Create Create Create + Create Create Create + Create Create + Create Create Create Create @@ -3710,18 +4289,25 @@ Create Create Create + Create Create + Create Create + Create Create + Create Create Create Create Create Create false + false false false + false false + false false false Create @@ -3796,7 +4382,6 @@ - @@ -3837,9 +4422,13 @@ true true true + true true + true true + true true + true true true true @@ -3855,9 +4444,12 @@ true true true + true true true + true true + true true true true @@ -3882,9 +4474,13 @@ true true true + true true + true true + true true + true true true true @@ -3900,9 +4496,12 @@ true true true + true true true + true true + true true true true @@ -3927,9 +4526,13 @@ true true true + true true + true true + true true + true true true true @@ -3945,9 +4548,12 @@ true true true + true true true + true true + true true true true @@ -3960,8 +4566,7 @@ - - + diff --git a/Minecraft.World/Minecraft.World.vcxproj.filters b/Minecraft.World/Minecraft.World.vcxproj.filters index eb5e4a8c..bf872596 100644 --- a/Minecraft.World/Minecraft.World.vcxproj.filters +++ b/Minecraft.World/Minecraft.World.vcxproj.filters @@ -39,9 +39,6 @@ {0a1baf2e-2c84-488f-afd0-f5ddba3ac849} - - {bf44f635-1f68-4c61-a946-acc2cca87955} - {b734aa5c-6770-4181-b8ab-e86980054dca} @@ -54,24 +51,6 @@ {b17885f1-37c1-481f-94b1-a74f0c886b29} - - {6252deb7-1b31-4ba0-83b7-db11fa2123eb} - - - {0954c9e3-8650-4c2c-b51c-1ab9a4476b14} - - - {1152442e-07f2-4ec9-85c0-7e3b040eee40} - - - {0023db14-c89d-4ce1-b0d3-b4d83c742c35} - - - {becb642b-be13-43a9-90e2-61d563c35682} - - - {be720f83-accf-4b92-8831-c890ef2fa69d} - {c29b0728-1151-40d1-ae10-4b5d1bd136cd} @@ -147,15 +126,6 @@ {2ac6971f-ddc3-438b-921a-315ea5e3ad5a} - - {a81770a3-9c91-487b-9321-e39f63998514} - - - {5abf2525-8223-4c6b-bb6b-5c9446334868} - - - {24e2f412-a3f1-447a-bbea-7aa6561a93eb} - {05f1cf3e-10f1-40a0-a72d-99bdd4d783d4} @@ -174,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..93f02399 100644 --- a/Minecraft.World/Packet.cpp +++ b/Minecraft.World/Packet.cpp @@ -37,7 +37,7 @@ void Packet::staticCtor() map(14, false, true, false, false, typeid(PlayerActionPacket), PlayerActionPacket::create); map(15, false, true, false, false, typeid(UseItemPacket), UseItemPacket::create); - map(16, false, true, false, false, typeid(SetCarriedItemPacket), SetCarriedItemPacket::create); + map(16, true, true, true, false, typeid(SetCarriedItemPacket), SetCarriedItemPacket::create); // 4J-PB - we need to send to any client for the sleep in bed //map(17, true, false, false, false, EntityActionAtPositionPacket)); map(17, true, false, true, false, typeid(EntityActionAtPositionPacket), EntityActionAtPositionPacket::create); @@ -52,7 +52,7 @@ void Packet::staticCtor() map(24, true, false, false, true, typeid(AddMobPacket), AddMobPacket::create); map(25, true, false, false, false, typeid(AddPaintingPacket), AddPaintingPacket::create); map(26, true, false, false, false, typeid(AddExperienceOrbPacket), AddExperienceOrbPacket::create); // TODO New for 1.8.2 - Needs sendToAny? - //map(27, false, true, false, false, PlayerInputPacket)); + map(27, false, true, false, false, typeid(PlayerInputPacket), PlayerInputPacket::create); // 4J-PB - needs to go to any player, due to the knockback effect when a played is hit map(28, true, false, true, true, typeid(SetEntityMotionPacket), SetEntityMotionPacket::create); map(29, true, false, false, true, typeid(RemoveEntitiesPacket), RemoveEntitiesPacket::create); @@ -66,11 +66,12 @@ void Packet::staticCtor() // 4J - needs to go to any player, to create sound effect when a player is hit map(38, true, false, true, true, typeid(EntityEventPacket), EntityEventPacket::create); - map(39, true, false, true, false, typeid(SetRidingPacket), SetRidingPacket::create); + map(39, true, false, true, false, typeid(SetEntityLinkPacket), SetEntityLinkPacket::create); map(40, true, false, true, true, typeid(SetEntityDataPacket), SetEntityDataPacket::create); map(41, true, false, true, false, typeid(UpdateMobEffectPacket), UpdateMobEffectPacket::create); map(42, true, false, true, false, typeid(RemoveMobEffectPacket), RemoveMobEffectPacket::create); map(43, true, false, true, false, typeid(SetExperiencePacket), SetExperiencePacket::create); + map(44, true, false, true, false, typeid(UpdateAttributesPacket), UpdateAttributesPacket::create); map(50, true, false, true, true, typeid(ChunkVisibilityPacket), ChunkVisibilityPacket::create); map(51, true, false, true, true, typeid(BlockRegionUpdatePacket), BlockRegionUpdatePacket::create); // Changed to LevelChunkPacket in Java but we aren't using that @@ -83,7 +84,7 @@ void Packet::staticCtor() map(61, true, false, true, false, typeid(LevelEventPacket), LevelEventPacket::create); // 4J-PB - don't see the need for this, we can use 61 map(62, true, false, true, false, typeid(LevelSoundPacket), LevelSoundPacket::create); - //map(62, true, false, true, false, typeid(LevelSoundPacket), LevelSoundPacket::create); + map(63, true, false, true, false, typeid(LevelParticlesPacket), LevelParticlesPacket::create); map(70, true, false, false, false, typeid(GameEventPacket), GameEventPacket::create); map(71, true, false, false, false, typeid(AddGlobalEntityPacket), AddGlobalEntityPacket::create); @@ -107,6 +108,7 @@ void Packet::staticCtor() map(130, true, true, true, false, typeid(SignUpdatePacket), SignUpdatePacket::create); map(131, true, false, true, false, typeid(ComplexItemDataPacket), ComplexItemDataPacket::create); map(132, true, false, false, false, typeid(TileEntityDataPacket), TileEntityDataPacket::create); + map(133, true, false, true, false, typeid(TileEditorOpenPacket), TileEditorOpenPacket::create); // 4J Added map(150, false, true, false, false, typeid(CraftItemPacket), CraftItemPacket::create); @@ -136,6 +138,12 @@ void Packet::staticCtor() //map(203, true, true, true, false, ChatAutoCompletePacket.class); //map(204, false, true, true, false, ClientInformationPacket.class); map(205, false, true, true, false, typeid(ClientCommandPacket), ClientCommandPacket::create); + + map(206, true, false, true, false, typeid(SetObjectivePacket), SetObjectivePacket::create); + map(207, true, false, true, false, typeid(SetScorePacket), SetScorePacket::create); + map(208, true, false, true, false, typeid(SetDisplayObjectivePacket), SetDisplayObjectivePacket::create); + map(209, true, false, true, false, typeid(SetPlayerTeamPacket), SetPlayerTeamPacket::create); + map(250, true, true, true, false, typeid(CustomPayloadPacket), CustomPayloadPacket::create); // 4J Stu - These added 1.3.2, but don't think we need them //map(252, true, true, SharedKeyPacket.class); @@ -207,16 +215,25 @@ void Packet::map(int id, bool receiveOnClient, bool receiveOnServer, bool sendTo } // 4J Added to record data for outgoing packets -void Packet::recordOutgoingPacket(shared_ptr packet) +void Packet::recordOutgoingPacket(shared_ptr packet, int playerIndex) { #ifndef _CONTENT_PACKAGE #if PACKET_ENABLE_STAT_TRACKING - AUTO_VAR(it, outgoingStatistics.find(packet->getId())); +#if 0 + int idx = packet->getId(); +#else + int idx = playerIndex; + if( packet->getId() != 51 ) + { + idx = 100; + } +#endif + AUTO_VAR(it, outgoingStatistics.find(idx)); if( it == outgoingStatistics.end() ) { - Packet::PacketStatistics *packetStatistics = new PacketStatistics(packet->getId()); - outgoingStatistics[packet->getId()] = packetStatistics; + Packet::PacketStatistics *packetStatistics = new PacketStatistics(idx); + outgoingStatistics[idx] = packetStatistics; packetStatistics->addPacket(packet->getEstimatedSize()); } else @@ -227,77 +244,31 @@ void Packet::recordOutgoingPacket(shared_ptr packet) #endif } -void Packet::renderPacketStats(int id) -{ - AUTO_VAR(it, outgoingStatistics.find(id)); - - if( it != outgoingStatistics.end() ) - { - it->second->renderStats(); - } -} - -void Packet::renderAllPacketStats() +void Packet::updatePacketStatsPIX() { #ifndef _CONTENT_PACKAGE #if PACKET_ENABLE_STAT_TRACKING - Minecraft *pMinecraft = Minecraft::GetInstance(); - pMinecraft->gui->renderStackedGraph(Packet::renderPos, 512, renderableStats.size(), &Packet::getIndexedStatValue ); - - renderAllPacketStatsKey(); - - Packet::renderPos++; - Packet::renderPos%=511; -#endif -#endif -} - -void Packet::renderAllPacketStatsKey() -{ -#ifndef _CONTENT_PACKAGE -#if PACKET_ENABLE_STAT_TRACKING - Minecraft *pMinecraft = Minecraft::GetInstance(); - int total = Packet::renderableStats.size(); - for(unsigned int i = 0; i < total; ++i) + + for( AUTO_VAR(it, outgoingStatistics.begin()); it != outgoingStatistics.end(); it++ ) { - Packet::PacketStatistics *stat = Packet::renderableStats[i]; - float vary = (float)i/total; - int fColour = floor(vary * 0xffffff); - - int colour = 0xff000000 + fColour; - pMinecraft->gui->drawString( pMinecraft->font, stat->getLegendString(), 900, 30 + (10 * i), colour); + Packet::PacketStatistics *stat = it->second; + __int64 count = stat->getRunningCount(); + wchar_t pixName[256]; + swprintf_s(pixName,L"Packet count %d",stat->id); +// PIXReportCounter(pixName,(float)count); + __int64 total = stat->getRunningTotal(); + swprintf_s(pixName,L"Packet bytes %d",stat->id); + PIXReportCounter(pixName,(float)total); + stat->IncrementPos(); } #endif #endif } -__int64 Packet::getIndexedStatValue(unsigned int samplePos, unsigned int renderableId) -{ - __int64 val = 0; - -#ifndef _CONTENT_PACKAGE -#if PACKET_ENABLE_STAT_TRACKING - val = renderableStats[renderableId]->getCountSample(samplePos); -#endif -#endif - - return val; -} - - shared_ptr Packet::getPacket(int id) { - // 4J - removed try/catch - // try - // { + // 4J: Removed try/catch return idToCreateMap[id](); - // } - // catch (exception e) - // { - // // TODO 4J JEV print stack trace, newInstance doesnt throw an exception in c++ yet. - // printf("Skipping packet with id %d" , id); - // return NULL; - // } } void Packet::writeBytes(DataOutputStream *dataoutputstream, byteArray bytes) @@ -320,7 +291,7 @@ byteArray Packet::readBytes(DataInputStream *datainputstream) } byteArray bytes(size); - datainputstream->read(bytes); + datainputstream->readFully(bytes); return bytes; } @@ -446,18 +417,19 @@ wstring Packet::readUtf(DataInputStream *dis, int maxLength) // throws IOExcepti return builder; } +Packet::PacketStatistics::PacketStatistics(int id) : id( id ), count( 0 ), totalSize( 0 ), samplesPos( 0 ) +{ + memset(countSamples, 0, sizeof(countSamples)); + memset(sizeSamples, 0, sizeof(sizeSamples)); +} + void Packet::PacketStatistics::addPacket(int bytes) { - if(count == 0) - { - firstSampleTime = System::currentTimeMillis(); - } - count++; + countSamples[samplesPos]++; + sizeSamples[samplesPos] += bytes; + timeSamples[samplesPos] = System::currentTimeMillis(); totalSize += bytes; - - // 4J Added - countSamples[samplesPos & (512 - 1)]++; - sizeSamples[samplesPos & (512 - 1)] += (unsigned int) bytes; + count++; } int Packet::PacketStatistics::getCount() @@ -474,44 +446,45 @@ double Packet::PacketStatistics::getAverageSize() return (double) totalSize / count; } -void Packet::PacketStatistics::renderStats( ) +int Packet::PacketStatistics::getTotalSize() { -#ifndef _CONTENT_PACKAGE -#if PACKET_ENABLE_STAT_TRACKING - samplesPos++; - - countSamples[samplesPos & (512 - 1)] = 0; - sizeSamples[samplesPos & (512 - 1)] = 0; - - Minecraft *pMinecraft = Minecraft::GetInstance(); - pMinecraft->gui->renderGraph(512, samplesPos, countSamples, 1, 10, sizeSamples, 1, 50); -#endif -#endif + return totalSize; } -__int64 Packet::PacketStatistics::getCountSample(int samplePos) +__int64 Packet::PacketStatistics::getRunningTotal() { - if(samplePos == 511) + __int64 total = 0; + __int64 currentTime = System::currentTimeMillis(); + for( int i = 0; i < TOTAL_TICKS; i++ ) { - samplesPos++; - countSamples[samplesPos & (512 - 1)] = 0; - sizeSamples[samplesPos & (512 - 1)] = 0; + if( currentTime - timeSamples[i] <= 1000 ) + { + total += sizeSamples[i]; + } } - - return countSamples[samplePos] * 10; + return total; } -wstring Packet::PacketStatistics::getLegendString() +__int64 Packet::PacketStatistics::getRunningCount() { - static wchar_t string[128]; - double bps = 0.0; - if(firstSampleTime > 0) + __int64 total = 0; + __int64 currentTime = System::currentTimeMillis(); + for( int i = 0; i < TOTAL_TICKS; i++ ) { - float timeDiff = ((System::currentTimeMillis() - firstSampleTime)/1000); - if(timeDiff > 0) bps = totalSize / timeDiff; + if( currentTime - timeSamples[i] <= 1000 ) + { + total += countSamples[i]; + } } - swprintf(string, 128, L"id: %d , packets: %d , total: %d , bytes: %d, total: %d, %f Bps", id, countSamples[(samplesPos - 1) & (512 - 1)], count, sizeSamples[(samplesPos - 1) & (512 - 1)], totalSize, bps ); - return string; + return total; +} + +void Packet::PacketStatistics::IncrementPos() +{ + samplesPos = ( samplesPos + 1 ) % TOTAL_TICKS; + countSamples[samplesPos] = 0; + sizeSamples[samplesPos] = 0; + timeSamples[samplesPos] = 0; } bool Packet::canBeInvalidated() diff --git a/Minecraft.World/Packet.h b/Minecraft.World/Packet.h index 60410df3..7c30f6aa 100644 --- a/Minecraft.World/Packet.h +++ b/Minecraft.World/Packet.h @@ -21,26 +21,26 @@ public: int count; int totalSize; - // 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..700935f6 100644 --- a/Minecraft.World/Player.cpp +++ b/Minecraft.World/Player.cpp @@ -15,7 +15,9 @@ #include "net.minecraft.world.level.chunk.h" #include "net.minecraft.world.phys.h" #include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.animal.h" +#include "net.minecraft.world.entity.boss.h" #include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.entity.item.h" #include "net.minecraft.world.item.h" @@ -24,6 +26,8 @@ #include "net.minecraft.world.level.material.h" #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.level.tile.entity.h" +#include "net.minecraft.world.scores.h" +#include "net.minecraft.world.scores.criteria.h" #include "net.minecraft.world.entity.projectile.h" #include "net.minecraft.world.inventory.h" #include "net.minecraft.world.damagesource.h" @@ -43,52 +47,35 @@ void Player::_init() { + registerAttributes(); + setHealth(getMaxHealth()); inventory = shared_ptr( new Inventory( this ) ); userType = 0; - score = 0; oBob = bob = 0.0f; - swinging = false; - swingTime = 0; - - //string name; - dimension = 0; - //string cloakTexture; xCloakO = yCloakO = zCloakO = 0.0; xCloak = yCloak = zCloak = 0.0; m_isSleeping = false; + customTextureUrl = L""; + customTextureUrl2 = L""; m_uiPlayerCurrentSkin=0; bedPosition = NULL; - sleepCounter = 0; deathFadeCounter=0; - bedOffsetX = bedOffsetY = bedOffsetZ = 0.0f; stats = NULL; - respawnPosition = NULL; + respawnForced = false; minecartAchievementPos = NULL; - - changingDimensionDelay = 20; - - - isInsidePortal = false; - - - portalTime = oPortalTime = 0.0f; - - dmgSpill = 0; - - fishing = nullptr; distanceWalk = distanceSwim = distanceFall = distanceClimb = distanceMinecart = distanceBoat = distancePig = 0; @@ -106,6 +93,8 @@ void Player::_init() defaultWalkSpeed = 0.1f; defaultFlySpeed = 0.02f; + lastLevelUpTime = 0; + m_uiGamePrivileges = 0; m_ppAdditionalModelParts=NULL; @@ -121,14 +110,13 @@ void Player::_init() m_bAwardedOnARail=false; } -Player::Player(Level *level) : Mob( level ) +Player::Player(Level *level, const wstring &name) : LivingEntity( level ) { // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); + this->name = name; _init(); MemSect(11); @@ -139,14 +127,12 @@ Player::Player(Level *level) : Mob( level ) heightOffset = 1.62f; Pos *spawnPos = level->getSharedSpawnPos(); - this->moveTo(spawnPos->x + 0.5, spawnPos->y + 1, spawnPos->z + 0.5, 0, 0); + moveTo(spawnPos->x + 0.5, spawnPos->y + 1, spawnPos->z + 0.5, 0, 0); delete spawnPos; - modelName = L"humanoid"; rotOffs = 180; flameTime = 20; - textureIdx = TN_MOB_CHAR; // 4J - was L"/mob/char.png"; m_skinIndex = eDefaultSkins_Skin0; m_playerIndex = 0; m_dwSkinId = 0; @@ -158,7 +144,12 @@ Player::Player(Level *level) : Mob( level ) //m_bShownOnMaps = true; setShowOnMaps(app.GetGameHostOption(eGameHostOption_Gamertags)!=0?true:false); m_bIsGuest = false; - m_UUID = L""; + +#ifndef _XBOX_ONE + // 4J: Set UUID to name on none-XB1 consoles, may change in future but for now + // ownership of animals on these consoles is done by name + setUUID(name); +#endif } Player::~Player() @@ -173,17 +164,20 @@ Player::~Player() //if( containerMenu != inventoryMenu ) delete containerMenu; } -int Player::getMaxHealth() +void Player::registerAttributes() { - return MAX_HEALTH; + LivingEntity::registerAttributes(); + + getAttributes()->registerAttribute(SharedMonsterAttributes::ATTACK_DAMAGE)->setBaseValue(1); } void Player::defineSynchedData() { - this->Mob::defineSynchedData(); + LivingEntity::defineSynchedData(); entityData->define(DATA_PLAYER_FLAGS_ID, (byte) 0); - entityData->define(DATA_PLAYER_RUNNING_ID, (byte) 0); + entityData->define(DATA_PLAYER_ABSORPTION_ID, (float) 0); + entityData->define(DATA_SCORE_ID, (int) 0); } shared_ptr Player::getUseItem() @@ -240,8 +234,8 @@ bool Player::isBlocking() return isUsingItem() && Item::items[useItem->id]->getUseAnimation(useItem) == UseAnim_block; } - -void Player::tick() +// 4J Stu - Added for things that should only be ticked once per simulation frame +void Player::updateFrameTick() { if (useItem != NULL) { @@ -308,7 +302,17 @@ void Player::tick() deathFadeCounter = DEATHFADE_DURATION; } } - this->Mob::tick(); +} + +void Player::tick() +{ + if(level->isClientSide) + { + // 4J Stu - Server player calls this differently so that it only happens once per simulation tick + updateFrameTick(); + } + + LivingEntity::tick(); if (!level->isClientSide) { @@ -459,62 +463,61 @@ void Player::tick() this->drop( shared_ptr( new ItemInstance( Tile::goldenRail, 10 ) ) ); this->drop( shared_ptr( new ItemInstance( Tile::lever, 10 ) ) ); - level->setTime( 0 ); int poweredCount = 0; for(int i = 10; i < 2800; ++i) { - level->setTile(x+i,y-1,z-2,Tile::quartzBlock_Id); - level->setTile(x+i,y,z-2,Tile::quartzBlock_Id); - level->setTile(x+i,y+1,z-2,Tile::quartzBlock_Id); - level->setTile(x+i,y+2,z-2,Tile::lightGem_Id); - level->setTile(x+i,y+3,z-2,Tile::quartzBlock_Id); + level->setTileAndData(x+i,y-1,z-2,Tile::quartzBlock_Id,0,Tile::UPDATE_CLIENTS); + level->setTileAndData(x+i,y,z-2,Tile::quartzBlock_Id,0,Tile::UPDATE_CLIENTS); + level->setTileAndData(x+i,y+1,z-2,Tile::quartzBlock_Id,0,Tile::UPDATE_CLIENTS); + level->setTileAndData(x+i,y+2,z-2,Tile::glowstone_Id,0,Tile::UPDATE_CLIENTS); + level->setTileAndData(x+i,y+3,z-2,Tile::quartzBlock_Id,0,Tile::UPDATE_CLIENTS); - level->setTile(x+i,y-1,z-1,Tile::stoneBrick_Id); + level->setTileAndData(x+i,y-1,z-1,Tile::stoneBrick_Id,0,Tile::UPDATE_CLIENTS); if(i%20 == 0) { - level->setTile(x+i,y,z-1,Tile::notGate_on_Id); + level->setTileAndData(x+i,y,z-1,Tile::redstoneTorch_on_Id,0,Tile::UPDATE_CLIENTS); poweredCount = 4; } else { - level->setTile(x+i,y,z-1,0); + level->setTileAndData(x+i,y,z-1,0,0,Tile::UPDATE_CLIENTS); } - level->setTile(x+i,y+1,z-1,0); - level->setTile(x+i,y+2,z-1,0); - level->setTile(x+i,y+3,z-1,0); + level->setTileAndData(x+i,y+1,z-1,0,0,Tile::UPDATE_CLIENTS); + level->setTileAndData(x+i,y+2,z-1,0,0,Tile::UPDATE_CLIENTS); + level->setTileAndData(x+i,y+3,z-1,0,0,Tile::UPDATE_CLIENTS); - level->setTile(x+i,y-1,z,Tile::stoneBrick_Id); + level->setTileAndData(x+i,y-1,z,Tile::stoneBrick_Id,0,Tile::UPDATE_CLIENTS); if(poweredCount>0) { - level->setTile(x+i,y,z,Tile::goldenRail_Id); + level->setTileAndData(x+i,y,z,Tile::goldenRail_Id,0,Tile::UPDATE_CLIENTS); --poweredCount; } else { - level->setTile(x+i,y,z,Tile::rail_Id); + level->setTileAndData(x+i,y,z,Tile::rail_Id,0,Tile::UPDATE_CLIENTS); } - level->setTile(x+i,y+1,z,0); - level->setTile(x+i,y+2,z,0); - level->setTile(x+i,y+3,z,0); + level->setTileAndData(x+i,y+1,z,0,0,Tile::UPDATE_CLIENTS); + level->setTileAndData(x+i,y+2,z,0,0,Tile::UPDATE_CLIENTS); + level->setTileAndData(x+i,y+3,z,0,0,Tile::UPDATE_CLIENTS); - level->setTile(x+i,y-1,z+1,Tile::stoneBrick_Id); + level->setTileAndData(x+i,y-1,z+1,Tile::stoneBrick_Id,0,Tile::UPDATE_CLIENTS); if((i+5)%20 == 0) { - level->setTile(x+i,y,z+1,Tile::torch_Id); + level->setTileAndData(x+i,y,z+1,Tile::torch_Id,0,Tile::UPDATE_CLIENTS); } else { - level->setTile(x+i,y,z+1,0); + level->setTileAndData(x+i,y,z+1,0,0,Tile::UPDATE_CLIENTS); } - level->setTile(x+i,y+1,z+1,0); - level->setTile(x+i,y+2,z+1,0); - level->setTile(x+i,y+3,z+1,0); + level->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,7 @@ void Player::ride(shared_ptr e) return; } - Mob::ride(e); + LivingEntity::ride(e); } void Player::setPlayerDefaultSkin(EDefaultSkins skin) @@ -927,10 +946,17 @@ void Player::prepareCustomTextures() void Player::rideTick() { + if (!level->isClientSide && isSneaking()) + { + ride(nullptr); + setSneaking(false); + return; + } + double preX = x, preY = y, preZ = z; float preYRot = yRot, preXRot = xRot; - this->Mob::rideTick(); + LivingEntity::rideTick(); oBob = bob; bob = 0; @@ -958,42 +984,15 @@ void Player::resetPos() { heightOffset = 1.62f; setSize(0.6f, 1.8f); - this->Mob::resetPos(); + LivingEntity::resetPos(); setHealth(getMaxHealth()); deathTime = 0; } -int Player::getCurrentSwingDuration() -{ - if (hasEffect(MobEffect::digSpeed)) - { - return SWING_DURATION - (1 + getEffect(MobEffect::digSpeed)->getAmplifier()) * 1; - } - if (hasEffect(MobEffect::digSlowdown)) - { - return SWING_DURATION + (1 + getEffect(MobEffect::digSlowdown)->getAmplifier()) * 2; - } - return SWING_DURATION; -} - void Player::serverAiStep() { - int currentSwingDuration = getCurrentSwingDuration(); - if (swinging) - { - swingTime++; - if (swingTime >= currentSwingDuration) - { - swingTime = 0; - swinging = false; - } - } - else - { - swingTime = 0; - } - - attackAnim = swingTime / (float) currentSwingDuration; + LivingEntity::serverAiStep(); + updateSwingTime(); } @@ -1001,23 +1000,25 @@ void Player::aiStep() { if (jumpTriggerTime > 0) jumpTriggerTime--; - if (level->difficulty == Difficulty::PEACEFUL && getHealth() < getMaxHealth()) + if (level->difficulty == Difficulty::PEACEFUL && getHealth() < getMaxHealth() && level->getGameRules()->getBoolean(GameRules::RULE_NATURAL_REGENERATION)) { if (tickCount % 20 * 12 == 0) heal(1); } inventory->tick(); oBob = bob; - this->Mob::aiStep(); + LivingEntity::aiStep(); - this->walkingSpeed = abilities.getWalkingSpeed(); - this->flyingSpeed = defaultFlySpeed; + AttributeInstance *speed = getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED); + if (!level->isClientSide) speed->setBaseValue(abilities.getWalkingSpeed()); + flyingSpeed = defaultFlySpeed; if (isSprinting()) { - walkingSpeed += abilities.getWalkingSpeed() * 0.3f; flyingSpeed += defaultFlySpeed * 0.3f; } + setSpeed((float) speed->getValue()); + float tBob = (float) sqrt(xd * xd + zd * zd); // 4J added - we were getting a NaN with zero xd & zd @@ -1037,7 +1038,19 @@ void Player::aiStep() if (getHealth() > 0) { - vector > *entities = level->getEntities(shared_from_this(), bb->grow(1, 0, 1)); + AABB *pickupArea = NULL; + if (riding != NULL && !riding->removed) + { + // if the player is riding, also touch entities under the + // pig/horse + pickupArea = bb->minmax(riding->bb)->grow(1, 0, 1); + } + else + { + pickupArea = bb->grow(1, .5, 1); + } + + vector > *entities = level->getEntities(shared_from_this(), pickupArea); if (entities != NULL) { AUTO_VAR(itEnd, entities->end()); @@ -1059,21 +1072,26 @@ void Player::touch(shared_ptr entity) entity->playerTouch( dynamic_pointer_cast( shared_from_this() ) ); } -// 4J - Removed 1.0.1 -//bool Player::addResource(int resource) -//{ -// return inventory->add(shared_ptr( new ItemInstance(resource, 1, 0) ) ); -//} - int Player::getScore() { - return score; + return entityData->getInteger(DATA_SCORE_ID); +} + +void Player::setScore(int value) +{ + entityData->set(DATA_SCORE_ID, value); +} + +void Player::increaseScore(int amount) +{ + int score = getScore(); + entityData->set(DATA_SCORE_ID, score + amount); } void Player::die(DamageSource *source) { - this->Mob::die(source); - this->setSize(0.2f, 0.2f); + LivingEntity::die(source); + setSize(0.2f, 0.2f); setPos(x, y, z); yd = 0.1f; @@ -1082,7 +1100,10 @@ void Player::die(DamageSource *source) { drop(shared_ptr( new ItemInstance(Item::apple, 1) ), true); } - inventory->dropAll(); + if (!level->getGameRules()->getBoolean(GameRules::RULE_KEEPINVENTORY)) + { + inventory->dropAll(); + } if (source != NULL) { @@ -1093,26 +1114,33 @@ void Player::die(DamageSource *source) { xd = zd = 0; } - this->heightOffset = 0.1f; + heightOffset = 0.1f; } -void Player::awardKillScore(shared_ptr victim, int score) +void Player::awardKillScore(shared_ptr victim, int awardPoints) { - this->score += score; -} + increaseScore(awardPoints); + vector *objectives = getScoreboard()->findObjectiveFor(ObjectiveCriteria::KILL_COUNT_ALL); -int Player::decreaseAirSupply(int currentSupply) -{ - int oxygenBonus = EnchantmentHelper::getOxygenBonus(inventory); - if (oxygenBonus > 0) + //if (victim instanceof Player) + //{ + // awardStat(Stats::playerKills, 1); + // objectives.addAll(getScoreboard().findObjectiveFor(ObjectiveCriteria::KILL_COUNT_PLAYERS)); + //} + //else + //{ + // awardStat(Stats::mobKills, 1); + //} + + if(objectives) { - if (random->nextInt(oxygenBonus + 1) > 0) + for (AUTO_VAR(it,objectives->begin()); it != objectives->end(); ++it) { - // the oxygen bonus prevents us from drowning - return currentSupply; + Objective *objective = *it; + Score *score = getScoreboard()->getPlayerScore(getAName(), objective); + score->increment(); } } - return Mob::decreaseAirSupply(currentSupply); } bool Player::isShootable() @@ -1125,9 +1153,9 @@ bool Player::isCreativeModeAllowed() return true; } -shared_ptr Player::drop() +shared_ptr Player::drop(bool all) { - return drop(inventory->removeItem(inventory->selected, 1), false); + return drop(inventory->removeItem(inventory->selected, all && inventory->getSelected() != NULL ? inventory->getSelected()->count : 1), false); } shared_ptr Player::drop(shared_ptr item) @@ -1138,6 +1166,7 @@ shared_ptr Player::drop(shared_ptr item) shared_ptr Player::drop(shared_ptr item, bool randomly) { if (item == NULL) return nullptr; + if (item->count == 0) return nullptr; shared_ptr thrownItem = shared_ptr( new ItemEntity(level, x, y - 0.3f + getHeadHeight(), z, item) ); thrownItem->throwTime = 20 * 2; @@ -1181,14 +1210,28 @@ void Player::reallyDrop(shared_ptr thrownItem) } -float Player::getDestroySpeed(Tile *tile) +float Player::getDestroySpeed(Tile *tile, bool hasProperTool) { float speed = inventory->getDestroySpeed(tile); - int efficiency = EnchantmentHelper::getDiggingBonus(inventory); - if (efficiency > 0 && inventory->canDestroy(tile)) + if (speed > 1) { - speed += (efficiency * efficiency + 1); + int efficiency = EnchantmentHelper::getDiggingBonus(dynamic_pointer_cast(shared_from_this())); + shared_ptr item = inventory->getSelected(); + + if (efficiency > 0 && item != NULL) + { + float boost = efficiency * efficiency + 1; + + if (item->canDestroySpecial(tile) || speed > 1) + { + speed += boost; + } + else + { + speed += boost * 0.08f; + } + } } if (hasEffect(MobEffect::digSpeed)) @@ -1200,7 +1243,7 @@ float Player::getDestroySpeed(Tile *tile) speed *= 1.0f - (getEffect(MobEffect::digSlowdown)->getAmplifier() + 1) * .2f; } - if (isUnderLiquid(Material::water) && !EnchantmentHelper::hasWaterWorkerBonus(inventory)) speed /= 5; + if (isUnderLiquid(Material::water) && !EnchantmentHelper::hasWaterWorkerBonus(dynamic_pointer_cast(shared_from_this()))) speed /= 5; // 4J Stu - onGround is set to true on the client when we are flying, which means // the dig speed is out of sync with the server. Removing this speed change when @@ -1217,16 +1260,17 @@ bool Player::canDestroy(Tile *tile) void Player::readAdditionalSaveData(CompoundTag *entityTag) { - Mob::readAdditionalSaveData(entityTag); + LivingEntity::readAdditionalSaveData(entityTag); ListTag *inventoryList = (ListTag *) entityTag->getList(L"Inventory"); inventory->load(inventoryList); - dimension = entityTag->getInt(L"Dimension"); + inventory->selected = entityTag->getInt(L"SelectedItemSlot"); m_isSleeping = entityTag->getBoolean(L"Sleeping"); sleepCounter = entityTag->getShort(L"SleepTimer"); experienceProgress = entityTag->getFloat(L"XpP"); experienceLevel = entityTag->getInt(L"XpLevel"); totalExperience = entityTag->getInt(L"XpTotal"); + setScore(entityTag->getInt(L"Score")); if (m_isSleeping) { @@ -1237,6 +1281,7 @@ void Player::readAdditionalSaveData(CompoundTag *entityTag) if (entityTag->contains(L"SpawnX") && entityTag->contains(L"SpawnY") && entityTag->contains(L"SpawnZ")) { respawnPosition = new Pos(entityTag->getInt(L"SpawnX"), entityTag->getInt(L"SpawnY"), entityTag->getInt(L"SpawnZ")); + respawnForced = entityTag->getBoolean(L"SpawnForced"); } foodData.readAdditionalSaveData(entityTag); @@ -1254,21 +1299,23 @@ void Player::readAdditionalSaveData(CompoundTag *entityTag) void Player::addAdditonalSaveData(CompoundTag *entityTag) { - Mob::addAdditonalSaveData(entityTag); + LivingEntity::addAdditonalSaveData(entityTag); entityTag->put(L"Inventory", inventory->save(new ListTag())); - entityTag->putInt(L"Dimension", dimension); + entityTag->putInt(L"SelectedItemSlot", inventory->selected); entityTag->putBoolean(L"Sleeping", m_isSleeping); entityTag->putShort(L"SleepTimer", (short) sleepCounter); entityTag->putFloat(L"XpP", experienceProgress); entityTag->putInt(L"XpLevel", experienceLevel); entityTag->putInt(L"XpTotal", totalExperience); + entityTag->putInt(L"Score", getScore()); if (respawnPosition != NULL) { entityTag->putInt(L"SpawnX", respawnPosition->x); entityTag->putInt(L"SpawnY", respawnPosition->y); entityTag->putInt(L"SpawnZ", respawnPosition->z); + entityTag->putBoolean(L"SpawnForced", respawnForced); } foodData.addAdditonalSaveData(entityTag); @@ -1281,21 +1328,27 @@ void Player::addAdditonalSaveData(CompoundTag *entityTag) } -Pos *Player::getRespawnPosition(Level *level, CompoundTag *entityTag) -{ - 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 +1363,9 @@ bool Player::startCrafting(int x, int y, int z) return true; } -void Player::take(shared_ptr e, int orgCount) +bool Player::openFireworks(int x, int y, int z) { + return true; } float Player::getHeadHeight() @@ -1325,8 +1379,9 @@ void Player::setDefaultHeadHeight() heightOffset = 1.62f; } -bool Player::hurt(DamageSource *source, int dmg) +bool Player::hurt(DamageSource *source, float dmg) { + if (isInvulnerable()) return false; if ( hasInvulnerablePrivilege() || (abilities.invulnerable && !source->isBypassInvul()) ) return false; // 4J-JEV: Fix for PSVita: #3987 - [IN GAME] The user can take damage/die, when attempting to re-enter fly mode when falling from a height. @@ -1350,95 +1405,40 @@ bool Player::hurt(DamageSource *source, int dmg) if (dmg == 0) return false; shared_ptr attacker = source->getEntity(); - if ( dynamic_pointer_cast( attacker ) != NULL ) + if ( attacker != NULL && attacker->instanceof(eTYPE_ARROW) ) { - if ((dynamic_pointer_cast(attacker))->owner != NULL) + shared_ptr arrow = dynamic_pointer_cast(attacker); + if ( arrow->owner != NULL) { - attacker = (dynamic_pointer_cast(attacker))->owner; + attacker = arrow->owner; } } - if ( dynamic_pointer_cast( attacker ) != NULL ) - { - // aggreviate all pet wolves nearby - directAllTameWolvesOnTarget(dynamic_pointer_cast(attacker), false); - } - return this->Mob::hurt(source, dmg); + return LivingEntity::hurt(source, dmg); } -int Player::getDamageAfterMagicAbsorb(DamageSource *damageSource, int damage) +bool Player::canHarmPlayer(shared_ptr target) { - int remainingDamage = Mob::getDamageAfterMagicAbsorb(damageSource, damage); - if (remainingDamage <= 0) - { - return 0; - } + Team *team = getTeam(); + Team *otherTeam = target->getTeam(); - int enchantmentArmor = EnchantmentHelper::getDamageProtection(inventory, damageSource); - if (enchantmentArmor > 20) + if (team == NULL) { - enchantmentArmor = 20; + return true; } - if (enchantmentArmor > 0 && enchantmentArmor <= 20) + if (!team->isAlliedTo(otherTeam)) { - int absorb = 25 - enchantmentArmor; - int v = remainingDamage * absorb + dmgSpill; - remainingDamage = v / 25; - dmgSpill = v % 25; + return true; } - - return remainingDamage; + return team->isAllowFriendlyFire(); } -bool Player::isPlayerVersusPlayer() +bool Player::canHarmPlayer(wstring targetName) { - return false; + 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 +1450,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 +1491,7 @@ bool Player::openTrap(shared_ptr container) return true; } -void Player::openTextEdit(shared_ptr sign) +void Player::openTextEdit(shared_ptr sign) { } @@ -1493,7 +1500,12 @@ bool Player::openBrewingStand(shared_ptr brewingStand) return true; } -bool Player::openTrading(shared_ptr traderTarget) +bool Player::openBeacon(shared_ptr beacon) +{ + return true; +} + +bool Player::openTrading(shared_ptr traderTarget, const wstring &name) { return true; } @@ -1509,21 +1521,41 @@ void Player::openItemInstanceGui(shared_ptr itemInstance) bool Player::interact(shared_ptr entity) { - if (entity->interact( dynamic_pointer_cast( shared_from_this() ) )) return true; + shared_ptr thisPlayer = dynamic_pointer_cast(shared_from_this()); + shared_ptr item = getSelectedItem(); - if (item != NULL && dynamic_pointer_cast( entity ) != NULL) + shared_ptr itemClone = (item != NULL) ? item->copy() : nullptr; + if ( entity->interact(thisPlayer) ) + { + // [EB]: Added rude check to see if we're still talking about the + // same item; this code caused bucket->milkbucket to be deleted because + // the milkbuckets' stack got decremented to 0. + if (item != NULL && item == getSelectedItem()) + { + if (item->count <= 0 && !abilities.instabuild) + { + removeSelectedItem(); + } + else if (item->count < itemClone->count && abilities.instabuild) + { + item->count = itemClone->count; + } + } + return true; + } + + if ( (item != NULL) && entity->instanceof(eTYPE_LIVINGENTITY) ) { // 4J - PC Comments // Hack to prevent item stacks from decrementing if the player has // the ability to instabuild - if(this->abilities.instabuild) item = item->copy(); - if(item->interactEnemy(dynamic_pointer_cast(entity))) + if(this->abilities.instabuild) item = itemClone; + if(item->interactEnemy(thisPlayer, dynamic_pointer_cast(entity))) { // 4J - PC Comments // Don't remove the item in hand if the player has the ability - // to - // instabuild - if (item->count <= 0 && !this->abilities.instabuild) + // to instabuild + if ( (item->count <= 0) && !abilities.instabuild) { removeSelectedItem(); } @@ -1548,15 +1580,6 @@ double Player::getRidingHeight() return heightOffset - 0.5f; } -void Player::swing() -{ - if (!swinging || swingTime >= getCurrentSwingDuration() / 2 || swingTime < 0) - { - swingTime = -1; - swinging = true; - } -} - void Player::attack(shared_ptr entity) { if (!entity->isAttackable()) @@ -1564,24 +1587,22 @@ void Player::attack(shared_ptr entity) return; } - int dmg = inventory->getAttackDamage(entity); + if (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 +1611,18 @@ void Player::attack(shared_ptr entity) if (dmg > 0 || magicBoost > 0) { - bool bCrit = fallDistance > 0 && !onGround && !onLadder() && !isInWater() && !hasEffect(MobEffect::blindness) && riding == NULL && mob != NULL; - if (bCrit) + bool bCrit = fallDistance > 0 && !onGround && !onLadder() && !isInWater() && !hasEffect(MobEffect::blindness) && (riding == NULL) && entity->instanceof(eTYPE_LIVINGENTITY); + if (bCrit && dmg > 0) { - dmg += random->nextInt(dmg / 2 + 2); + dmg *= 1.5f; } dmg += magicBoost; - + // Ensure we put the entity on fire if we're hitting with a // fire-enchanted weapon bool setOnFireTemporatily = false; - int fireAspect = EnchantmentHelper::getFireAspect(dynamic_pointer_cast(shared_from_this())); - if (dynamic_pointer_cast(entity) && fireAspect > 0 && !entity->isOnFire()) + int fireAspect = EnchantmentHelper::getFireAspect(dynamic_pointer_cast(shared_from_this())); + if ( entity->instanceof(eTYPE_MOB) && fireAspect > 0 && !entity->isOnFire()) { setOnFireTemporatily = true; entity->setOnFire(1); @@ -1635,29 +1656,36 @@ void Player::attack(shared_ptr entity) } setLastHurtMob(entity); - shared_ptr mob = dynamic_pointer_cast(entity); - if (mob) + + if ( entity->instanceof(eTYPE_LIVINGENTITY) ) { + shared_ptr mob = dynamic_pointer_cast(entity); ThornsEnchantment::doThornsAfterAttack(shared_from_this(), mob, random); } } shared_ptr item = getSelectedItem(); - if (item != NULL && dynamic_pointer_cast( entity ) != NULL) + shared_ptr hurtTarget = entity; + if ( entity->instanceof(eTYPE_MULTIENTITY_MOB_PART) ) { - item->hurtEnemy(dynamic_pointer_cast(entity), dynamic_pointer_cast( shared_from_this() ) ); + 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 +1698,11 @@ void Player::attack(shared_ptr entity) causeFoodExhaustion(FoodConstants::EXHAUSTION_ATTACK); } + + // if (SharedConstants::INGAME_DEBUG_OUTPUT) + // { + // //sendMessage(ChatMessageComponent.forPlainText("DMG " + dmg + ", " + magicBoost + ", " + knockback)); + // } } void Player::crit(shared_ptr entity) @@ -1707,7 +1740,7 @@ Slot *Player::getInventorySlot(int slotId) void Player::remove() { - this->Mob::remove(); + LivingEntity::remove(); inventoryMenu->removed( dynamic_pointer_cast( shared_from_this() ) ); if (containerMenu != NULL) { @@ -1717,7 +1750,7 @@ void Player::remove() bool Player::isInWall() { - return !m_isSleeping && this->Mob::isInWall(); + return !m_isSleeping && LivingEntity::isInWall(); } bool Player::isLocalPlayer() @@ -1759,6 +1792,7 @@ Player::BedSleepingResult Player::startSleepInBed(int x, int y, int z, bool bTes vector > *monsters = level->getEntitiesOfClass(typeid(Monster), AABB::newTemp(x - hRange, y - vRange, z - hRange, x + hRange, y + vRange, z + hRange)); if (!monsters->empty()) { + delete monsters; return NOT_SAFE; } delete monsters; @@ -1778,8 +1812,10 @@ Player::BedSleepingResult Player::startSleepInBed(int x, int y, int z, bool bTes return OK; } - // 4J Stu - You can use a bed from within a minecart, and this causes all sorts of problems. - ride(nullptr); + if (isRiding()) + { + ride(nullptr); + } setSize(0.2f, 0.2f); heightOffset = .2f; @@ -1898,7 +1934,7 @@ void Player::stopSleepInBed(bool forcefulWakeUp, bool updateLevelList, bool save } if (saveRespawnPoint) { - setRespawnPosition(bedPosition); + setRespawnPosition(bedPosition, false); } } @@ -1909,7 +1945,7 @@ bool Player::checkBed() } -Pos *Player::checkBedValidRespawnPosition(Level *level, Pos *pos) +Pos *Player::checkBedValidRespawnPosition(Level *level, Pos *pos, bool forced) { // make sure the chunks around the bed exist ChunkSource *chunkSource = level->getChunkSource(); @@ -1921,6 +1957,15 @@ Pos *Player::checkBedValidRespawnPosition(Level *level, Pos *pos) // make sure the bed is still standing if (level->getTile(pos->x, pos->y, pos->z) != Tile::bed_Id) { + Material *bottomMaterial = level->getMaterial(pos->x, pos->y, pos->z); + Material *topMaterial = level->getMaterial(pos->x, pos->y + 1, pos->z); + bool freeFeet = !bottomMaterial->isSolid() && !bottomMaterial->isLiquid(); + bool freeHead = !topMaterial->isSolid() && !topMaterial->isLiquid(); + + if (forced && freeFeet && freeHead) + { + return pos; + } return NULL; } // make sure the bed still has a stand-up position @@ -2005,15 +2050,22 @@ Pos *Player::getRespawnPosition() return respawnPosition; } -void Player::setRespawnPosition(Pos *respawnPosition) +bool Player::isRespawnForced() +{ + return respawnForced; +} + +void Player::setRespawnPosition(Pos *respawnPosition, bool forced) { if (respawnPosition != NULL) { this->respawnPosition = new Pos(*respawnPosition); + respawnForced = forced; } else { this->respawnPosition = NULL; + respawnForced = false; } } @@ -2028,7 +2080,7 @@ void Player::awardStat(Stat *stat, byteArray paramBlob) void Player::jumpFromGround() { - this->Mob::jumpFromGround(); + LivingEntity::jumpFromGround(); // 4J Stu - This seems to have been missed from 1.7.3, but do we care? //awardStat(Stats::jump, 1); @@ -2050,21 +2102,25 @@ void Player::travel(float xa, float ya) if (abilities.flying && riding == NULL) { - double ydo = this->yd; + double ydo = yd; float ofs = flyingSpeed; flyingSpeed = abilities.getFlyingSpeed(); - this->Mob::travel(xa, ya); - this->yd = ydo * 0.6; + LivingEntity::travel(xa, ya); + yd = ydo * 0.6; flyingSpeed = ofs; } else { - this->Mob::travel(xa, ya); + LivingEntity::travel(xa, ya); } checkMovementStatistiscs(x - preX, y - preY, z - preZ); } +float Player::getSpeed() +{ + return (float) getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->getValue(); +} void Player::checkMovementStatistiscs(double dx, double dy, double dz) { @@ -2142,7 +2198,7 @@ void Player::checkRidingStatistiscs(double dx, double dy, double dz) int distance = (int) Math::round(sqrt(dx * dx + dy * dy + dz * dz) * 100.0f); if (distance > 0) { - if ( dynamic_pointer_cast( riding ) ) + if ( riding->instanceof(eTYPE_MINECART) ) { distanceMinecart += distance; if( distanceMinecart >= 100 ) @@ -2189,7 +2245,7 @@ void Player::checkRidingStatistiscs(double dx, double dy, double dz) } } - else if (dynamic_pointer_cast( riding ) != NULL) + else if ( riding->instanceof(eTYPE_BOAT) ) { distanceBoat += distance; if( distanceBoat >= 100 ) @@ -2199,7 +2255,7 @@ void Player::checkRidingStatistiscs(double dx, double dy, double dz) awardStat(GenericStats::boatOneM(), GenericStats::param_boat(newDistance/100) ); } } - else if (dynamic_pointer_cast( riding ) != NULL) + else if ( riding->instanceof(eTYPE_PIG) ) { distancePig += distance; if( distancePig >= 100 ) @@ -2228,14 +2284,14 @@ void Player::causeFallDamage(float distance) awardStat(GenericStats::fallOneM(), GenericStats::param_fall(newDistance/100) ); } } - this->Mob::causeFallDamage(distance); + LivingEntity::causeFallDamage(distance); } -void Player::killed(shared_ptr mob) +void Player::killed(shared_ptr mob) { // 4J-PB - added the lavaslime enemy - fix for #64007 - TU7: Code: Achievements: TCR#073: Killing Magma Cubes doesn't unlock "Monster Hunter" Achievement. - if( dynamic_pointer_cast( mob ) != NULL || mob->GetType() == eTYPE_GHAST || mob->GetType() == eTYPE_SLIME || mob->GetType() == eTYPE_LAVASLIME || mob->GetType() == eTYPE_ENDERDRAGON) + if( mob->instanceof(eTYPE_ENEMY) || mob->GetType() == eTYPE_GHAST || mob->GetType() == eTYPE_SLIME || mob->GetType() == eTYPE_LAVASLIME || mob->GetType() == eTYPE_ENDERDRAGON) { awardStat(GenericStats::killEnemy(), GenericStats::param_noArgs()); @@ -2282,9 +2338,14 @@ void Player::killed(shared_ptr mob) } } +void Player::makeStuckInWeb() +{ + if (!abilities.flying) LivingEntity::makeStuckInWeb(); +} + Icon *Player::getItemInHandIcon(shared_ptr item, int layer) { - Icon *icon = Mob::getItemInHandIcon(item, layer); + Icon *icon = LivingEntity::getItemInHandIcon(item, layer); if (item->id == Item::fishingRod->id && fishing != NULL) { icon = Item::fishingRod->getEmptyIcon(); @@ -2317,21 +2378,9 @@ shared_ptr Player::getArmor(int pos) return inventory->getArmor(pos); } -void Player::handleInsidePortal() -{ - if (changingDimensionDelay > 0) - { - changingDimensionDelay = 10; - return; - } - - isInsidePortal = true; -} - void Player::increaseXp(int i) { - // Update xp calculations from 1.3 - score += i; + increaseScore(i); int max = INT_MAX - totalExperience; if (i > max) { @@ -2342,17 +2391,26 @@ void Player::increaseXp(int i) while (experienceProgress >= 1) { experienceProgress = (experienceProgress - 1) * getXpNeededForNextLevel(); - levelUp(); + giveExperienceLevels(1); experienceProgress /= getXpNeededForNextLevel(); } } -void Player::withdrawExperienceLevels(int amount) +void Player::giveExperienceLevels(int amount) { - experienceLevel -= amount; + experienceLevel += amount; if (experienceLevel < 0) { experienceLevel = 0; + experienceProgress = 0; + totalExperience = 0; + } + + if (amount > 0 && experienceLevel % 5 == 0 && lastLevelUpTime < tickCount - SharedConstants::TICKS_PER_SECOND * 5.0f) + { + float vol = experienceLevel > 30 ? 1 : experienceLevel / 30.0f; + level->playEntitySound(shared_from_this(), eSoundType_RANDOM_LEVELUP, vol * 0.75f, 1); + lastLevelUpTime = tickCount; } } @@ -2370,11 +2428,6 @@ int Player::getXpNeededForNextLevel() return 17; } -void Player::levelUp() -{ - experienceLevel++; -} - /** * This method adds on to the player's exhaustion, which may decrease the * player's food level. @@ -2433,13 +2486,49 @@ void Player::startUsingItem(shared_ptr instance, int duration) #endif } -bool Player::mayBuild(int x, int y, int z) +bool Player::mayDestroyBlockAt(int x, int y, int z) { - return abilities.mayBuild; + if (abilities.mayBuild) + { + return true; + } + int t = level->getTile(x, y, z); + if (t > 0) { + Tile *tile = Tile::tiles[t]; + + if (tile->material->isDestroyedByHand()) + { + return true; + } + else if (getSelectedItem() != NULL) + { + shared_ptr carried = getSelectedItem(); + + if (carried->canDestroySpecial(tile) || carried->getDestroySpeed(tile) > 1) + { + return true; + } + } + } + return false; +} + +bool Player::mayUseItemAt(int x, int y, int z, int face, shared_ptr item) +{ + if (abilities.mayBuild) + { + return true; + } + if (item != NULL) + { + return item->mayBePlacedInAdventureMode(); + } + return false; } int Player::getExperienceReward(shared_ptr killedBy) { + if (level->getGameRules()->getBoolean(GameRules::RULE_KEEPINVENTORY)) return 0; int reward = experienceLevel * 7; if (reward > 100) { @@ -2459,8 +2548,9 @@ wstring Player::getAName() return name; } -void Player::changeDimension(int i) +bool Player::shouldShowName() { + return true; } void Player::restoreFrom(shared_ptr oldPlayer, bool restoreAll) @@ -2469,21 +2559,24 @@ void Player::restoreFrom(shared_ptr oldPlayer, bool restoreAll) { inventory->replaceWith(oldPlayer->inventory); - health = oldPlayer->health; + setHealth(oldPlayer->getHealth()); foodData = oldPlayer->foodData; experienceLevel = oldPlayer->experienceLevel; totalExperience = oldPlayer->totalExperience; experienceProgress = oldPlayer->experienceProgress; - score = oldPlayer->score; + setScore(oldPlayer->getScore()); + portalEntranceDir = oldPlayer->portalEntranceDir; + } + else if (level->getGameRules()->getBoolean(GameRules::RULE_KEEPINVENTORY)) + { + inventory->replaceWith(oldPlayer->inventory); - for(AUTO_VAR(it, oldPlayer->activeEffects.begin()); it != oldPlayer->activeEffects.end(); ++it) - { - MobEffectInstance *instance = it->second; - addEffectNoUpdate( instance ); - } - oldPlayer->activeEffects.clear(); + experienceLevel = oldPlayer->experienceLevel; + totalExperience = oldPlayer->totalExperience; + experienceProgress = oldPlayer->experienceProgress; + setScore(oldPlayer->getScore()); } enderChestInventory = oldPlayer->enderChestInventory; } @@ -2508,25 +2601,83 @@ wstring Player::getName() wstring Player::getDisplayName() { - return displayName; + //PlayerTeam.formatNameForTeam(getTeam(), name); + + // If player display name is not set, return name + return m_displayName.size() > 0 ? m_displayName : name; } -//Language getLanguage() { return Language.getInstance(); } -//String localize(String key, Object... args) { return getLanguage().getElement(key, args); } +wstring Player::getNetworkName() +{ + // 4J: We can only transmit gamertag in network packets + return name; +} + +Level *Player::getCommandSenderWorld() +{ + return level; +} shared_ptr Player::getEnderChestInventory() { return enderChestInventory; } +shared_ptr Player::getCarried(int slot) +{ + if (slot == 0) return inventory->getSelected(); + return inventory->armor[slot - 1]; +} + shared_ptr Player::getCarriedItem() { return inventory->getSelected(); } +void Player::setEquippedSlot(int slot, shared_ptr item) +{ + inventory->armor[slot] = item; +} + bool Player::isInvisibleTo(shared_ptr player) { - return isInvisible(); + return isInvisible(); +} + +ItemInstanceArray Player::getEquipmentSlots() +{ + return inventory->armor; +} + +bool Player::isCapeHidden() +{ + return getPlayerFlag(FLAG_HIDE_CAPE); +} + +bool Player::isPushedByWater() +{ + return !abilities.flying; +} + +Scoreboard *Player::getScoreboard() +{ + return level->getScoreboard(); +} + +Team *Player::getTeam() +{ + return getScoreboard()->getPlayersTeam(name); +} + +void Player::setAbsorptionAmount(float absorptionAmount) +{ + if (absorptionAmount < 0) absorptionAmount = 0; + getEntityData()->set(DATA_PLAYER_ABSORPTION_ID, absorptionAmount); +} + +float Player::getAbsorptionAmount() +{ + return getEntityData()->getFloat(DATA_PLAYER_ABSORPTION_ID); } int Player::getTexture() @@ -2561,7 +2712,7 @@ int Player::hash_fnct(const shared_ptr k) #ifdef __PS3__ return (int)boost::hash_value( k->name ); // 4J Stu - Names are completely unique? #else - return (int)std::hash{}( k->name ); // 4J Stu - Names are completely unique? + return (int)std::hash{}(k->name); // 4J Stu - Names are completely unique? #endif //__PS3__ } @@ -2770,12 +2921,12 @@ bool Player::isAllowedToInteract(shared_ptr target) bool allowed = true; if(app.GetGameHostOption(eGameHostOption_TrustPlayers) == 0) { - if (target->GetType() == eTYPE_MINECART) + if (target->instanceof(eTYPE_MINECART)) { if (getPlayerGamePrivilege(Player::ePlayerGamePrivilege_CanUseContainers) == 0) { shared_ptr minecart = dynamic_pointer_cast( target ); - if (minecart->type == Minecart::CHEST) + if (minecart->getType() == Minecart::TYPE_CHEST) allowed = false; } diff --git a/Minecraft.World/Player.h b/Minecraft.World/Player.h index 185a70a7..2e223a1e 100644 --- a/Minecraft.World/Player.h +++ b/Minecraft.World/Player.h @@ -1,25 +1,29 @@ #pragma once using namespace std; -#include "Mob.h" +#include "LivingEntity.h" #include "Definitions.h" #include "Abilities.h" #include "FoodData.h" #include "PlayerEnderChestContainer.h" #include "CommandSender.h" +#include "ScoreHolder.h" class AbstractContainerMenu; class Stats; class FishingHook; - +class EntityHorse; class ItemEntity; class Slot; class Pos; - +class TileEntity; +class BeaconTileEntity; class FurnaceTileEntity; class DispenserTileEntity; class SignTileEntity; class BrewingStandTileEntity; +class HopperTileEntity; +class MinecartHopper; class Inventory; class Container; class FoodData; @@ -27,13 +31,13 @@ class DamageSource; class Merchant; class PlayerEnderChestContainer; class GameType; +class Scoreboard; -class Player : public Mob, public CommandSender +class Player : public LivingEntity, public CommandSender, public ScoreHolder { public: static const int MAX_NAME_LENGTH = 16 + 4; static const int MAX_HEALTH = 20; - static const int SWING_DURATION = 6; static const int SLEEP_DURATION = 100; static const int WAKE_UP_DURATION = 10; @@ -47,7 +51,11 @@ private: static const int FLY_ACHIEVEMENT_SPEED = 25; static const int DATA_PLAYER_FLAGS_ID = 16; - static const int DATA_PLAYER_RUNNING_ID = 17; + static const int DATA_PLAYER_ABSORPTION_ID = 17; + static const int DATA_SCORE_ID = 18; + +protected: + static const int FLAG_HIDE_CAPE = 1; public: shared_ptr inventory; @@ -65,16 +73,14 @@ protected: public: BYTE userType; - int score; float oBob, bob; - bool swinging; - int swingTime; wstring name; - int dimension; int takeXpDelay; // 4J-PB - track custom skin + wstring customTextureUrl; + wstring customTextureUrl2; unsigned int m_uiPlayerCurrentSkin; void ChangePlayerSkin(); @@ -83,8 +89,8 @@ public: double xCloakO, yCloakO, zCloakO; double xCloak, yCloak, zCloak; - // 4J-HEG - store display name, added for Xbox One - wstring displayName; + // 4J-HG: store display name, added for Xbox One "game display name" + wstring m_displayName; protected: // player sleeping in bed? @@ -103,20 +109,13 @@ public: private: Pos *respawnPosition; + bool respawnForced; Pos *minecartAchievementPos; //4J Gordon: These are in cms, every time they go > 1m they are entered into the stats int distanceWalk, distanceSwim, distanceFall, distanceClimb, distanceMinecart, distanceBoat, distancePig; public: - int changingDimensionDelay; - -protected: - bool isInsidePortal; - -public: - float portalTime, oPortalTime; - Abilities abilities; int experienceLevel, totalExperience; @@ -131,6 +130,9 @@ protected: float defaultWalkSpeed; float defaultFlySpeed; +private: + int lastLevelUpTime; + public: eINSTANCEOF GetType() { return eTYPE_PLAYER; } @@ -138,11 +140,11 @@ public: // 4J Added to default init void _init(); - Player(Level *level); + Player(Level *level, const wstring &name); virtual ~Player(); - virtual int getMaxHealth(); protected: + virtual void registerAttributes(); virtual void defineSynchedData(); public: @@ -153,7 +155,13 @@ public: void stopUsingItem(); virtual bool isBlocking(); + // 4J Stu - Added for things that should only be ticked once per simulation frame + virtual void updateFrameTick(); + virtual void tick(); + virtual int getPortalWaitTime(); + virtual int getDimensionChangingDelay(); + virtual void playSound(int iSound, float volume, float pitch); protected: void spawnEatParticles(shared_ptr useItem, int count); @@ -172,9 +180,6 @@ public: virtual void rideTick(); virtual void resetPos(); -private: - int getCurrentSwingDuration(); - protected: virtual void serverAiStep(); @@ -185,18 +190,14 @@ private: virtual void touch(shared_ptr entity); public: - //bool addResource(int resource); // 4J - Removed 1.0.1 - int getScore(); + virtual int getScore(); + virtual void setScore(int value); + virtual void increaseScore(int amount); virtual void die(DamageSource *source); - void awardKillScore(shared_ptr victim, int score); - -protected: - virtual int decreaseAirSupply(int currentSupply); - -public: + virtual void awardKillScore(shared_ptr victim, int awardPoints); virtual bool isShootable(); bool isCreativeModeAllowed(); - virtual shared_ptr drop(); + virtual shared_ptr drop(bool all); shared_ptr drop(shared_ptr item); shared_ptr drop(shared_ptr item, bool randomly); @@ -204,16 +205,18 @@ protected: virtual void reallyDrop(shared_ptr thrownItem); public: - float getDestroySpeed(Tile *tile); + float getDestroySpeed(Tile *tile, bool hasProperTool); bool canDestroy(Tile *tile); virtual void readAdditionalSaveData(CompoundTag *entityTag); virtual void addAdditonalSaveData(CompoundTag *entityTag); - static Pos *getRespawnPosition(Level *level, CompoundTag *entityTag); virtual bool openContainer(shared_ptr container); // 4J - added bool return - virtual bool startEnchanting(int x, int y, int z); // 4J - added bool return + virtual bool openHopper(shared_ptr container); + virtual bool openHopper(shared_ptr container); + virtual bool openHorseInventory(shared_ptr horse, shared_ptr container); + virtual bool startEnchanting(int x, int y, int z, const wstring &name); // 4J - added bool return virtual bool startRepairing(int x, int y, int z); // 4J - added bool return - virtual bool startCrafting(int x, int y, int z); // 4J - added boo return - virtual void take(shared_ptr e, int orgCount); + virtual bool startCrafting(int x, int y, int z); // 4J - added bool return + virtual bool openFireworks(int x, int y, int z); // 4J - added virtual float getHeadHeight(); // 4J-PB - added to keep the code happy with the change to make the third person view per player @@ -226,35 +229,34 @@ protected: public: shared_ptr fishing; - virtual bool hurt(DamageSource *source, int dmg); + virtual bool hurt(DamageSource *source, float dmg); + virtual bool canHarmPlayer(shared_ptr target); + virtual bool canHarmPlayer(wstring targetName); // 4J: Added for ServerPlayer when only player name is provided protected: - virtual int getDamageAfterMagicAbsorb(DamageSource *damageSource, int damage); - virtual bool isPlayerVersusPlayer(); - void directAllTameWolvesOnTarget(shared_ptr target, bool skipSitting); - virtual void hurtArmor(int damage); + virtual void hurtArmor(float damage); public: virtual int getArmorValue(); - float getArmorCoverPercentage(); + virtual float getArmorCoverPercentage(); protected: - virtual void actuallyHurt(DamageSource *source, int dmg); + virtual void actuallyHurt(DamageSource *source, float dmg); public: using Entity::interact; virtual bool openFurnace(shared_ptr container); // 4J - added bool return virtual bool openTrap(shared_ptr container); // 4J - added bool return - virtual void openTextEdit(shared_ptr sign); + virtual void openTextEdit(shared_ptr sign); virtual bool openBrewingStand(shared_ptr brewingStand); // 4J - added bool return - virtual bool openTrading(shared_ptr traderTarget); // 4J - added bool return + virtual bool openBeacon(shared_ptr beacon); + virtual bool openTrading(shared_ptr traderTarget, const wstring &name); // 4J - added bool return virtual void openItemInstanceGui(shared_ptr itemInstance); virtual bool interact(shared_ptr entity); virtual shared_ptr getSelectedItem(); void removeSelectedItem(); virtual double getRidingHeight(); - virtual void swing(); virtual void attack(shared_ptr entity); virtual void crit(shared_ptr entity); virtual void magicCrit(shared_ptr entity); @@ -298,7 +300,7 @@ private: bool checkBed(); public: - static Pos *checkBedValidRespawnPosition(Level *level, Pos *pos); + static Pos *checkBedValidRespawnPosition(Level *level, Pos *pos, bool forced); float getSleepRotation(); bool isSleeping(); bool isSleepingLongEnough(); @@ -316,16 +318,18 @@ public: * client. */ virtual void displayClientMessage(int messageId); - Pos *getRespawnPosition(); - void setRespawnPosition(Pos *respawnPosition); + virtual Pos *getRespawnPosition(); + virtual bool isRespawnForced(); + virtual void setRespawnPosition(Pos *respawnPosition, bool forced); virtual void awardStat(Stat *stat, byteArray param); protected: void jumpFromGround(); public: - void travel(float xa, float ya); - void checkMovementStatistiscs(double dx, double dy, double dz); + virtual void travel(float xa, float ya); + virtual float getSpeed(); + virtual void checkMovementStatistiscs(double dx, double dy, double dz); private: void checkRidingStatistiscs(double dx, double dy, double dz); @@ -336,25 +340,20 @@ protected: virtual void causeFallDamage(float distance); public: - virtual void killed(shared_ptr mob); + virtual void killed(shared_ptr mob); + virtual void makeStuckInWeb(); virtual Icon *getItemInHandIcon(shared_ptr item, int layer); virtual shared_ptr getArmor(int pos); - virtual void handleInsidePortal(); - - void increaseXp(int i); - virtual void withdrawExperienceLevels(int amount); + virtual void increaseXp(int i); + virtual void giveExperienceLevels(int amount); int getXpNeededForNextLevel(); - -private: - void levelUp(); - -public: void causeFoodExhaustion(float amount); FoodData *getFoodData(); bool canEat(bool magicalItem); bool isHurt(); virtual void startUsingItem(shared_ptr instance, int duration); - bool mayBuild(int x, int y, int z); + virtual bool mayDestroyBlockAt(int x, int y, int z); + virtual bool mayUseItemAt(int x, int y, int z, int face, shared_ptr item); protected: virtual int getExperienceReward(shared_ptr killedBy); @@ -362,8 +361,7 @@ protected: public: virtual wstring getAName(); - - virtual void changeDimension(int i); + virtual bool shouldShowName(); virtual void restoreFrom(shared_ptr oldPlayer, bool restoreAll); protected: @@ -373,17 +371,26 @@ public: void onUpdateAbilities(); void setGameMode(GameType *mode); wstring getName(); - wstring getDisplayName(); // 4J added + virtual wstring getDisplayName(); + virtual wstring getNetworkName(); // 4J: Added - //Language getLanguage() { return Language.getInstance(); } - //String localize(String key, Object... args) { return getLanguage().getElement(key, args); } + virtual Level *getCommandSenderWorld(); shared_ptr getEnderChestInventory(); -public: + virtual shared_ptr getCarried(int slot); virtual shared_ptr getCarriedItem(); - + virtual void setEquippedSlot(int slot, shared_ptr item); virtual bool isInvisibleTo(shared_ptr player); + virtual ItemInstanceArray getEquipmentSlots(); + virtual bool isCapeHidden(); + virtual bool isPushedByWater(); + virtual Scoreboard *getScoreboard(); + virtual Team *getTeam(); + virtual void setAbsorptionAmount(float absorptionAmount); + virtual float getAbsorptionAmount(); + + //////// 4J ///////////////// static int hash_fnct(const shared_ptr k); static bool eq_test(const shared_ptr x, const shared_ptr y); @@ -410,8 +417,6 @@ public: PlayerUID getXuid() { return m_xuid; } void setOnlineXuid(PlayerUID xuid) { m_OnlineXuid = xuid; } PlayerUID getOnlineXuid() { return m_OnlineXuid; } - void setUUID(const wstring &UUID) { m_UUID = UUID; } - wstring getUUID() { return m_UUID; } void setPlayerIndex(DWORD dwIndex) { m_playerIndex = dwIndex; } DWORD getPlayerIndex() { return m_playerIndex; } @@ -421,15 +426,13 @@ public: void setShowOnMaps(bool bVal) { m_bShownOnMaps = bVal; } bool canShowOnMaps() { return m_bShownOnMaps && !getPlayerGamePrivilege(ePlayerGamePrivilege_Invisible); } - + virtual void sendMessage(const wstring& message, ChatPacket::EChatPacketMessage type = ChatPacket::e_ChatCustom, int customData = -1, const wstring& additionalMessage = L"") { } private: PlayerUID m_xuid; PlayerUID m_OnlineXuid; protected: - wstring m_UUID; // 4J Added - bool m_bShownOnMaps; bool m_bIsGuest; diff --git a/Minecraft.World/PlayerAbilitiesPacket.cpp b/Minecraft.World/PlayerAbilitiesPacket.cpp index b1b854a5..d02f164c 100644 --- a/Minecraft.World/PlayerAbilitiesPacket.cpp +++ b/Minecraft.World/PlayerAbilitiesPacket.cpp @@ -3,8 +3,6 @@ #include "net.minecraft.network.packet.h" #include "PlayerAbilitiesPacket.h" -const float PlayerAbilitiesPacket::SPEED_ACCURACY = 255.0f; - PlayerAbilitiesPacket::PlayerAbilitiesPacket() { invulnerable = false; @@ -17,24 +15,24 @@ PlayerAbilitiesPacket::PlayerAbilitiesPacket() PlayerAbilitiesPacket::PlayerAbilitiesPacket(Abilities *abilities) { - this->setInvulnerable(abilities->invulnerable); - this->setFlying(abilities->flying); - this->setCanFly(abilities->mayfly); - this->setInstabuild(abilities->instabuild); - this->setFlyingSpeed(abilities->getFlyingSpeed()); - this->setWalkingSpeed(abilities->getWalkingSpeed()); + setInvulnerable(abilities->invulnerable); + setFlying(abilities->flying); + setCanFly(abilities->mayfly); + setInstabuild(abilities->instabuild); + setFlyingSpeed(abilities->getFlyingSpeed()); + setWalkingSpeed(abilities->getWalkingSpeed()); } void PlayerAbilitiesPacket::read(DataInputStream *dis) { byte bitfield = dis->readByte(); - this->setInvulnerable((bitfield & FLAG_INVULNERABLE) > 0); - this->setFlying((bitfield & FLAG_FLYING) > 0); - this->setCanFly((bitfield & FLAG_CAN_FLY) > 0); - this->setInstabuild((bitfield & FLAG_INSTABUILD) > 0); - this->setFlyingSpeed(dis->readByte() / SPEED_ACCURACY); - this->setWalkingSpeed(dis->readByte() / SPEED_ACCURACY); + setInvulnerable((bitfield & FLAG_INVULNERABLE) > 0); + setFlying((bitfield & FLAG_FLYING) > 0); + setCanFly((bitfield & FLAG_CAN_FLY) > 0); + setInstabuild((bitfield & FLAG_INSTABUILD) > 0); + setFlyingSpeed(dis->readFloat()); + setWalkingSpeed(dis->readFloat()); } void PlayerAbilitiesPacket::write(DataOutputStream *dos) @@ -47,8 +45,8 @@ void PlayerAbilitiesPacket::write(DataOutputStream *dos) if (canInstabuild()) bitfield |= FLAG_INSTABUILD; dos->writeByte(bitfield); - dos->writeByte((int) (flyingSpeed * SPEED_ACCURACY)); - dos->writeByte((int) (walkingSpeed * SPEED_ACCURACY)); + dos->writeFloat(flyingSpeed); + dos->writeFloat(walkingSpeed); } void PlayerAbilitiesPacket::handle(PacketListener *listener) @@ -113,7 +111,7 @@ float PlayerAbilitiesPacket::getFlyingSpeed() void PlayerAbilitiesPacket::setFlyingSpeed(float flySpeed) { - this->flyingSpeed = flySpeed; + flyingSpeed = flySpeed; } float PlayerAbilitiesPacket::getWalkingSpeed() diff --git a/Minecraft.World/PlayerAbilitiesPacket.h b/Minecraft.World/PlayerAbilitiesPacket.h index 21c1fdc2..8cd82bf5 100644 --- a/Minecraft.World/PlayerAbilitiesPacket.h +++ b/Minecraft.World/PlayerAbilitiesPacket.h @@ -11,7 +11,6 @@ private: static const int FLAG_FLYING = 1 << 1; static const int FLAG_CAN_FLY = 1 << 2; static const int FLAG_INSTABUILD = 1 << 3; - static const float SPEED_ACCURACY; bool invulnerable; bool _isFlying; diff --git a/Minecraft.World/PlayerActionPacket.cpp b/Minecraft.World/PlayerActionPacket.cpp index ce438cb6..aaa3e37e 100644 --- a/Minecraft.World/PlayerActionPacket.cpp +++ b/Minecraft.World/PlayerActionPacket.cpp @@ -7,7 +7,7 @@ const int PlayerActionPacket::START_DESTROY_BLOCK = 0; const int PlayerActionPacket::ABORT_DESTROY_BLOCK = 1; const int PlayerActionPacket::STOP_DESTROY_BLOCK = 2; -const int PlayerActionPacket::GET_UPDATED_BLOCK = 3; +const int PlayerActionPacket::DROP_ALL_ITEMS = 3; const int PlayerActionPacket::DROP_ITEM = 4; const int PlayerActionPacket::RELEASE_USE_ITEM = 5; @@ -31,11 +31,11 @@ PlayerActionPacket::PlayerActionPacket(int action, int x, int y, int z, int face void PlayerActionPacket::read(DataInputStream *dis) //throws IOException { - action = dis->read(); + action = dis->readUnsignedByte(); x = dis->readInt(); - y = dis->read(); + y = dis->readUnsignedByte(); z = dis->readInt(); - face = dis->read(); + face = dis->readUnsignedByte(); } void PlayerActionPacket::write(DataOutputStream *dos) //throws IOException diff --git a/Minecraft.World/PlayerActionPacket.h b/Minecraft.World/PlayerActionPacket.h index 0228ebb4..45c077d2 100644 --- a/Minecraft.World/PlayerActionPacket.h +++ b/Minecraft.World/PlayerActionPacket.h @@ -9,7 +9,7 @@ public: static const int START_DESTROY_BLOCK; static const int ABORT_DESTROY_BLOCK; static const int STOP_DESTROY_BLOCK; - static const int GET_UPDATED_BLOCK; + static const int DROP_ALL_ITEMS; static const int DROP_ITEM; static const int RELEASE_USE_ITEM; diff --git a/Minecraft.World/PlayerCommandPacket.cpp b/Minecraft.World/PlayerCommandPacket.cpp index 6aecc0e6..72e34c80 100644 --- a/Minecraft.World/PlayerCommandPacket.cpp +++ b/Minecraft.World/PlayerCommandPacket.cpp @@ -14,30 +14,43 @@ const int PlayerCommandPacket::START_SPRINTING = 4; const int PlayerCommandPacket::STOP_SPRINTING = 5; const int PlayerCommandPacket::START_IDLEANIM = 6; const int PlayerCommandPacket::STOP_IDLEANIM = 7; +const int PlayerCommandPacket::RIDING_JUMP = 8; +const int PlayerCommandPacket::OPEN_INVENTORY = 9; PlayerCommandPacket::PlayerCommandPacket() { id = -1; action = 0; + data = 0; } PlayerCommandPacket::PlayerCommandPacket(shared_ptr e, int action) { id = e->entityId; this->action = action; + this->data = 0; +} + +PlayerCommandPacket::PlayerCommandPacket(shared_ptr e, int action, int data) +{ + id = e->entityId; + this->action = action; + this->data = data; } void PlayerCommandPacket::read(DataInputStream *dis) //throws IOException { id = dis->readInt(); action = dis->readByte(); + data = dis->readInt(); } void PlayerCommandPacket::write(DataOutputStream *dos) //throws IOException { dos->writeInt(id); dos->writeByte(action); + dos->writeInt(data); } void PlayerCommandPacket::handle(PacketListener *listener) @@ -47,5 +60,5 @@ void PlayerCommandPacket::handle(PacketListener *listener) int PlayerCommandPacket::getEstimatedSize() { - return 5; + return 9; } diff --git a/Minecraft.World/PlayerCommandPacket.h b/Minecraft.World/PlayerCommandPacket.h index dd6c8cb1..92ee57eb 100644 --- a/Minecraft.World/PlayerCommandPacket.h +++ b/Minecraft.World/PlayerCommandPacket.h @@ -7,12 +7,14 @@ class PlayerCommandPacket : public Packet, public enable_shared_from_this e, int action); + PlayerCommandPacket(shared_ptr e, int action, int data); virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); diff --git a/Minecraft.World/PlayerEnderChestContainer.cpp b/Minecraft.World/PlayerEnderChestContainer.cpp index 466d9710..f0a1aaa3 100644 --- a/Minecraft.World/PlayerEnderChestContainer.cpp +++ b/Minecraft.World/PlayerEnderChestContainer.cpp @@ -1,12 +1,18 @@ #include "stdafx.h" #include "net.minecraft.world.level.tile.entity.h" +#include "ContainerOpenPacket.h" #include "PlayerEnderChestContainer.h" -PlayerEnderChestContainer::PlayerEnderChestContainer() : SimpleContainer(IDS_TILE_ENDERCHEST, 9 * 3) +PlayerEnderChestContainer::PlayerEnderChestContainer() : SimpleContainer(IDS_TILE_ENDERCHEST, L"", false, 9 * 3) { activeChest = nullptr; } +int PlayerEnderChestContainer::getContainerType() +{ + return ContainerOpenPacket::ENDER_CHEST; +} + void PlayerEnderChestContainer::setActiveChest(shared_ptr activeChest) { this->activeChest = activeChest; @@ -69,4 +75,9 @@ void PlayerEnderChestContainer::stopOpen() } SimpleContainer::stopOpen(); activeChest = nullptr; +} + +bool PlayerEnderChestContainer::canPlaceItem(int slot, shared_ptr item) +{ + return true; } \ No newline at end of file diff --git a/Minecraft.World/PlayerEnderChestContainer.h b/Minecraft.World/PlayerEnderChestContainer.h index 523417aa..67522244 100644 --- a/Minecraft.World/PlayerEnderChestContainer.h +++ b/Minecraft.World/PlayerEnderChestContainer.h @@ -12,10 +12,13 @@ private: public: PlayerEnderChestContainer(); + virtual int getContainerType(); + void setActiveChest(shared_ptr activeChest); void setItemsByTag(ListTag *enderItemsList); ListTag *createTag(); bool stillValid(shared_ptr player); void startOpen(); void stopOpen(); + bool canPlaceItem(int slot, shared_ptr item); }; \ No newline at end of file diff --git a/Minecraft.World/PlayerIO.h b/Minecraft.World/PlayerIO.h index 559ab2ee..153c55e3 100644 --- a/Minecraft.World/PlayerIO.h +++ b/Minecraft.World/PlayerIO.h @@ -11,7 +11,7 @@ class PlayerIO { public: virtual void save(shared_ptr player) = 0; - virtual bool load(shared_ptr player) = 0; // 4J Changed return val to bool to check if new player or loaded player + virtual CompoundTag *load(shared_ptr player) = 0; virtual CompoundTag *loadPlayerDataTag(PlayerUID xuid) = 0; // 4J Changed from string name to xuid // 4J Added diff --git a/Minecraft.World/PlayerInputPacket.cpp b/Minecraft.World/PlayerInputPacket.cpp index 6dd6fcae..04aebf0f 100644 --- a/Minecraft.World/PlayerInputPacket.cpp +++ b/Minecraft.World/PlayerInputPacket.cpp @@ -8,40 +8,32 @@ PlayerInputPacket::PlayerInputPacket() { - xa = 0.0f; - ya = 0.0f; + xxa = 0.0f; + yya = 0.0f; isJumpingVar = false; isSneakingVar = false; - xRot = 0.0f; - yRot = 0.0f; } -PlayerInputPacket::PlayerInputPacket(float xa, float ya, bool isJumpingVar, bool isSneakingVar, float xRot, float yRot) +PlayerInputPacket::PlayerInputPacket(float xxa, float yya, bool isJumpingVar, bool isSneakingVar) { - this->xa = xa; - this->ya = ya; + this->xxa = xxa; + this->yya = yya; this->isJumpingVar = isJumpingVar; this->isSneakingVar = isSneakingVar; - this->xRot = xRot; - this->yRot = yRot; } void PlayerInputPacket::read(DataInputStream *dis) //throws IOException { - xa = dis->readFloat(); - ya = dis->readFloat(); - xRot = dis->readFloat(); - yRot = dis->readFloat(); + xxa = dis->readFloat(); + yya = dis->readFloat(); isJumpingVar = dis->readBoolean(); isSneakingVar = dis->readBoolean(); } void PlayerInputPacket::write(DataOutputStream *dos) //throws IOException { - dos->writeFloat(xa); - dos->writeFloat(ya); - dos->writeFloat(xRot); - dos->writeFloat(yRot); + dos->writeFloat(xxa); + dos->writeFloat(yya); dos->writeBoolean(isJumpingVar); dos->writeBoolean(isSneakingVar); } @@ -53,27 +45,17 @@ void PlayerInputPacket::handle(PacketListener *listener) int PlayerInputPacket::getEstimatedSize() { - return 18; + return 10; } -float PlayerInputPacket::getXa() +float PlayerInputPacket::getXxa() { - return xa; + return xxa; } -float PlayerInputPacket::getXRot() +float PlayerInputPacket::getYya() { - return xRot; -} - -float PlayerInputPacket::getYa() -{ - return ya; -} - -float PlayerInputPacket::getYRot() -{ - return yRot; + return yya; } bool PlayerInputPacket::isJumping() diff --git a/Minecraft.World/PlayerInputPacket.h b/Minecraft.World/PlayerInputPacket.h index 8bc11d3e..bc2d3985 100644 --- a/Minecraft.World/PlayerInputPacket.h +++ b/Minecraft.World/PlayerInputPacket.h @@ -7,26 +7,22 @@ class PlayerInputPacket : public Packet, public enable_shared_from_this args = getArguments(matcher.group(TARGETS_GROUP_ARGS)); + String type = matcher.group(TARGETS_GROUP_TYPE); + int rangeMin = getDefaultRangeMin(type); + int rangeMax = getDefaultRangeMax(type); + int levelMin = getDefaultLevelMin(type); + int levelMax = getDefaultLevelMax(type); + int count = getDefaultCount(type); + int mode = LevelSettings.GameType.NOT_SET.getId(); + Pos pos = source.getCommandSenderWorldPosition(); + Map scores = getScores(args); + String name = null; + String team = null; + boolean requireLevel = false; + + if (args.containsKey(ARGUMENT_RANGE_MIN)) { + rangeMin = Mth.getInt(args.get(ARGUMENT_RANGE_MIN), rangeMin); + requireLevel = true; + } + if (args.containsKey(ARGUMENT_RANGE_MAX)) { + rangeMax = Mth.getInt(args.get(ARGUMENT_RANGE_MAX), rangeMax); + requireLevel = true; + } + if (args.containsKey(ARGUMENT_LEVEL_MIN)) { + levelMin = Mth.getInt(args.get(ARGUMENT_LEVEL_MIN), levelMin); + } + if (args.containsKey(ARGUMENT_LEVEL_MAX)) { + levelMax = Mth.getInt(args.get(ARGUMENT_LEVEL_MAX), levelMax); + } + if (args.containsKey(ARGUMENT_COORDINATE_X)) { + pos.x = Mth.getInt(args.get(ARGUMENT_COORDINATE_X), pos.x); + requireLevel = true; + } + if (args.containsKey(ARGUMENT_COORDINATE_Y)) { + pos.y = Mth.getInt(args.get(ARGUMENT_COORDINATE_Y), pos.y); + requireLevel = true; + } + if (args.containsKey(ARGUMENT_COORDINATE_Z)) { + pos.z = Mth.getInt(args.get(ARGUMENT_COORDINATE_Z), pos.z); + requireLevel = true; + } + if (args.containsKey(ARGUMENT_MODE)) { + mode = Mth.getInt(args.get(ARGUMENT_MODE), mode); + } + if (args.containsKey(ARGUMENT_COUNT)) { + count = Mth.getInt(args.get(ARGUMENT_COUNT), count); + } + if (args.containsKey(ARGUMENT_TEAM_NAME)) { + team = args.get(ARGUMENT_TEAM_NAME); + } + if (args.containsKey(ARGUMENT_PLAYER_NAME)) { + name = args.get(ARGUMENT_PLAYER_NAME); + } + + Level level = requireLevel ? source.getCommandSenderWorld() : null; + + if (type.equals(TARGET_NEAREST) || type.equals(TARGET_ALL)) { + List players = MinecraftServer.getInstance().getPlayers().getPlayers(pos, rangeMin, rangeMax, count, mode, levelMin, levelMax, scores, name, team, level); + return players == null || players.isEmpty() ? new ServerPlayer[0] : players.toArray(new ServerPlayer[0]); + } else if (type.equals(TARGET_RANDOM)) { + List players = MinecraftServer.getInstance().getPlayers().getPlayers(pos, rangeMin, rangeMax, 0, mode, levelMin, levelMax, scores, name, team, level); + Collections.shuffle(players); + players = players.subList(0, Math.min(count, players.size())); + return players == null || players.isEmpty() ? new ServerPlayer[0] : players.toArray(new ServerPlayer[0]); + } else { + return null; + } + } else { + return null; + } + } + + public static Map getScores(Map input) { + Map result = new HashMap(); + + for (String key : input.keySet()) { + if (key.startsWith(ARGUMENT_SCORE_PREFIX) && key.length() > ARGUMENT_SCORE_PREFIX.length()) { + String name = key.substring(ARGUMENT_SCORE_PREFIX.length()); + result.put(name, Mth.getInt(input.get(key), 1)); + } + } + + return result; + } + + public static boolean isList(String input) { + Matcher matcher = PATTERN_TARGETS.matcher(input); + + if (matcher.matches()) { + Map args = getArguments(matcher.group(TARGETS_GROUP_ARGS)); + String type = matcher.group(TARGETS_GROUP_TYPE); + int count = getDefaultCount(type); + if (args.containsKey(ARGUMENT_COUNT)) count = Mth.getInt(args.get(ARGUMENT_COUNT), count); + return count != 1; + } + + return false; + } + + public static boolean isPattern(String input, String onlyType) { + Matcher matcher = PATTERN_TARGETS.matcher(input); + + if (matcher.matches()) { + String type = matcher.group(TARGETS_GROUP_TYPE); + if (onlyType != null && !onlyType.equals(type)) return false; + + return true; + } + + return false; + } + + public static boolean isPattern(String input) { + return isPattern(input, null); + } + + private static final int getDefaultRangeMin(String type) { + return 0; + } + + private static final int getDefaultRangeMax(String type) { + return 0; + } + + private static final int getDefaultLevelMax(String type) { + return Integer.MAX_VALUE; + } + + private static final int getDefaultLevelMin(String type) { + return 0; + } + + private static final int getDefaultCount(String type) { + if (type.equals(TARGET_ALL)) { + return 0; + } else { + return 1; + } + } + + private static Map getArguments(String input) { + HashMap result = new HashMap(); + if (input == null) return result; + Matcher matcher = PATTERN_SHORT_ARGUMENT.matcher(input); + int count = 0; + int last = -1; + + while (matcher.find()) { + String name = null; + + switch (count++) { + case 0: + name = ARGUMENT_COORDINATE_X; + break; + case 1: + name = ARGUMENT_COORDINATE_Y; + break; + case 2: + name = ARGUMENT_COORDINATE_Z; + break; + case 3: + name = ARGUMENT_RANGE_MAX; + break; + } + + if (name != null && matcher.group(1).length() > 0) result.put(name, matcher.group(1)); + last = matcher.end(); + } + + if (last < input.length()) { + matcher = PATTERN_LONG_ARGUMENT.matcher(last == -1 ? input : input.substring(last)); + + while (matcher.find()) { + result.put(matcher.group(1), matcher.group(2)); + } + } + + return result; + } +} + +*/ \ No newline at end of file diff --git a/Minecraft.World/PlayerTeam.cpp b/Minecraft.World/PlayerTeam.cpp new file mode 100644 index 00000000..3e159af4 --- /dev/null +++ b/Minecraft.World/PlayerTeam.cpp @@ -0,0 +1,120 @@ +#include "stdafx.h" +#include "net.minecraft.world.scores.h" +#include "PlayerTeam.h" + +PlayerTeam::PlayerTeam(Scoreboard *scoreboard, const wstring &name) +{ + this->scoreboard = scoreboard; + this->name = name; + displayName = name; + + prefix = L""; + suffix = L""; + allowFriendlyFire = true; + seeFriendlyInvisibles = true; +} + +Scoreboard *PlayerTeam::getScoreboard() +{ + return scoreboard; +} + +wstring PlayerTeam::getName() +{ + return name; +} + +wstring PlayerTeam::getDisplayName() +{ + return displayName; +} + +void PlayerTeam::setDisplayName(const wstring &displayName) +{ + //if (displayName == null) throw new IllegalArgumentException("Name cannot be null"); + this->displayName = displayName; + scoreboard->onTeamChanged(this); +} + +unordered_set *PlayerTeam::getPlayers() +{ + return &players; +} + +wstring PlayerTeam::getPrefix() +{ + return prefix; +} + +void PlayerTeam::setPrefix(const wstring &prefix) +{ + //if (prefix == null) throw new IllegalArgumentException("Prefix cannot be null"); + this->prefix = prefix; + scoreboard->onTeamChanged(this); +} + +wstring PlayerTeam::getSuffix() +{ + return suffix; +} + +void PlayerTeam::setSuffix(const wstring &suffix) +{ + //if (suffix == null) throw new IllegalArgumentException("Suffix cannot be null"); + this->suffix = suffix; + scoreboard->onTeamChanged(this); +} + +wstring PlayerTeam::getFormattedName(const wstring &teamMemberName) +{ + return getPrefix() + teamMemberName + getSuffix(); +} + +wstring PlayerTeam::formatNameForTeam(PlayerTeam *team) +{ + return formatNameForTeam(team, team->getDisplayName()); +} + +wstring PlayerTeam::formatNameForTeam(Team *team, const wstring &name) +{ + if (team == NULL) return name; + return team->getFormattedName(name); +} + +bool PlayerTeam::isAllowFriendlyFire() +{ + return allowFriendlyFire; +} + +void PlayerTeam::setAllowFriendlyFire(bool allowFriendlyFire) +{ + this->allowFriendlyFire = allowFriendlyFire; + scoreboard->onTeamChanged(this); +} + +bool PlayerTeam::canSeeFriendlyInvisibles() +{ + return seeFriendlyInvisibles; +} + +void PlayerTeam::setSeeFriendlyInvisibles(bool seeFriendlyInvisibles) +{ + this->seeFriendlyInvisibles = seeFriendlyInvisibles; + scoreboard->onTeamChanged(this); +} + +int PlayerTeam::packOptions() +{ + int result = 0; + + if (isAllowFriendlyFire()) result |= 1 << BIT_FRIENDLY_FIRE; + if (canSeeFriendlyInvisibles()) result |= 1 << BIT_SEE_INVISIBLES; + + return result; +} + +void PlayerTeam::unpackOptions(int options) +{ + setAllowFriendlyFire((options & (1 << BIT_FRIENDLY_FIRE)) > 0); + setSeeFriendlyInvisibles((options & (1 << BIT_SEE_INVISIBLES)) > 0); +} \ No newline at end of file diff --git a/Minecraft.World/PlayerTeam.h b/Minecraft.World/PlayerTeam.h new file mode 100644 index 00000000..bf91309a --- /dev/null +++ b/Minecraft.World/PlayerTeam.h @@ -0,0 +1,49 @@ +#pragma once + +#include "Team.h" + +class Scoreboard; + +class PlayerTeam : public Team +{ +public: + static const int MAX_NAME_LENGTH = 16; + static const int MAX_DISPLAY_NAME_LENGTH = 32; + static const int MAX_PREFIX_LENGTH = 16; + static const int MAX_SUFFIX_LENGTH = 16; + +private: + static const int BIT_FRIENDLY_FIRE = 0; + static const int BIT_SEE_INVISIBLES = 1; + + Scoreboard *scoreboard; + wstring name; + unordered_set players; + wstring displayName; + wstring prefix; + wstring suffix; + bool allowFriendlyFire; + bool seeFriendlyInvisibles; + +public: + PlayerTeam(Scoreboard *scoreboard, const wstring &name); + + Scoreboard *getScoreboard(); + wstring getName(); + wstring getDisplayName(); + void setDisplayName(const wstring &displayName); + unordered_set *getPlayers(); + wstring getPrefix(); + void setPrefix(const wstring &prefix); + wstring getSuffix(); + void setSuffix(const wstring &suffix); + wstring getFormattedName(const wstring &teamMemberName); + static wstring formatNameForTeam(PlayerTeam *team); + static wstring formatNameForTeam(Team *team, const wstring &name); + bool isAllowFriendlyFire(); + void setAllowFriendlyFire(bool allowFriendlyFire); + bool canSeeFriendlyInvisibles(); + void setSeeFriendlyInvisibles(bool seeFriendlyInvisibles); + int packOptions(); + void unpackOptions(int options); +}; \ No newline at end of file diff --git a/Minecraft.World/PortalForcer.cpp b/Minecraft.World/PortalForcer.cpp index 7c9b7a86..8880399e 100644 --- a/Minecraft.World/PortalForcer.cpp +++ b/Minecraft.World/PortalForcer.cpp @@ -3,58 +3,72 @@ #include "net.minecraft.world.level.h" #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.level.dimension.h" +#include "..\Minecraft.Client\ServerLevel.h" #include "PortalForcer.h" -PortalForcer::PortalForcer() +PortalForcer::PortalPosition::PortalPosition(int x, int y, int z, __int64 time) : Pos(x, y, z) { - random = new Random(); + lastUsed = time; } - -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..f2f273c2 100644 --- a/Minecraft.World/ResultContainer.cpp +++ b/Minecraft.World/ResultContainer.cpp @@ -4,7 +4,6 @@ ResultContainer::ResultContainer() : Container() { - items = new ItemInstanceArray(1); } unsigned int ResultContainer::getContainerSize() @@ -14,20 +13,30 @@ unsigned int ResultContainer::getContainerSize() shared_ptr ResultContainer::getItem(unsigned int slot) { - return (*items)[0]; + return items[0]; } -int ResultContainer::getName() +wstring ResultContainer::getName() { - return 0; + return L""; +} + +wstring ResultContainer::getCustomName() +{ + return L""; +} + +bool ResultContainer::hasCustomName() +{ + return false; } shared_ptr ResultContainer::removeItem(unsigned int slot, int count) { - if ((*items)[0] != NULL) + if (items[0] != NULL) { - shared_ptr item = (*items)[0]; - (*items)[0] = nullptr; + shared_ptr item = items[0]; + items[0] = nullptr; return item; } return nullptr; @@ -35,10 +44,10 @@ shared_ptr ResultContainer::removeItem(unsigned int slot, int coun shared_ptr ResultContainer::removeItemNoUpdate(int slot) { - if ((*items)[0] != NULL) + if (items[0] != NULL) { - shared_ptr item = (*items)[0]; - (*items)[0] = nullptr; + shared_ptr item = items[0]; + items[0] = nullptr; return item; } return nullptr; @@ -46,7 +55,7 @@ shared_ptr ResultContainer::removeItemNoUpdate(int slot) void ResultContainer::setItem(unsigned int slot, shared_ptr item) { - (*items)[0] = item; + items[0] = item; } int ResultContainer::getMaxStackSize() @@ -59,6 +68,11 @@ void ResultContainer::setChanged() } bool ResultContainer::stillValid(shared_ptr player) +{ + return true; +} + +bool ResultContainer::canPlaceItem(int slot, shared_ptr item) { return true; } \ No newline at end of file diff --git a/Minecraft.World/ResultContainer.h b/Minecraft.World/ResultContainer.h index 62df65d8..f99cf806 100644 --- a/Minecraft.World/ResultContainer.h +++ b/Minecraft.World/ResultContainer.h @@ -5,7 +5,7 @@ class ResultContainer : public Container { private: - ItemInstanceArray *items; + shared_ptr items[1]; public: // 4J Stu Added a ctor to init items @@ -13,14 +13,16 @@ public: virtual unsigned int getContainerSize(); virtual shared_ptr getItem(unsigned int slot); - virtual int getName(); + virtual wstring getName(); + virtual wstring getCustomName(); + virtual bool hasCustomName(); virtual shared_ptr removeItem(unsigned int slot, int count); virtual shared_ptr removeItemNoUpdate(int slot); virtual void setItem(unsigned int slot, shared_ptr item); virtual int getMaxStackSize(); virtual void setChanged(); virtual bool stillValid(shared_ptr player); - - void startOpen() { } // TODO Auto-generated method stub - void stopOpen() { } // TODO Auto-generated method stub + virtual void startOpen() { } // TODO Auto-generated method stub + virtual void stopOpen() { } // TODO Auto-generated method stub + virtual bool canPlaceItem(int slot, shared_ptr item); }; \ No newline at end of file diff --git a/Minecraft.World/ResultSlot.cpp b/Minecraft.World/ResultSlot.cpp index b79329af..08ffe714 100644 --- a/Minecraft.World/ResultSlot.cpp +++ b/Minecraft.World/ResultSlot.cpp @@ -66,21 +66,17 @@ void ResultSlot::onTake(shared_ptr player, shared_ptr carr if (item->getItem()->hasCraftingRemainingItem()) { - - // (TheApathetic) shared_ptr craftResult = shared_ptr(new ItemInstance(item->getItem()->getCraftingRemainingItem())); /* - * Try to place this in the player's inventory (See we.java - * for new method) + * Try to place this in the player's inventory (See we.java for new method) */ - if (item->getItem()->shouldMoveCraftingResultToInventory(item) && this->player->inventory->add(craftResult)) + if (item->getItem()->shouldMoveCraftingResultToInventory(item) && player->inventory->add(craftResult)) { continue; } - // If this slot is now empty, place it there (current - // behavior) + // If this slot is now empty, place it there (current behavior) if (craftSlots->getItem(i) == NULL) { craftSlots->setItem(i, craftResult); @@ -88,7 +84,7 @@ void ResultSlot::onTake(shared_ptr player, shared_ptr carr else { // Finally, if nothing else, just drop the item - this->player->drop(craftResult); + player->drop(craftResult); } } diff --git a/Minecraft.World/RotatedPillarTile.cpp b/Minecraft.World/RotatedPillarTile.cpp new file mode 100644 index 00000000..a4b7d931 --- /dev/null +++ b/Minecraft.World/RotatedPillarTile.cpp @@ -0,0 +1,77 @@ +#include "stdafx.h" +#include "net.minecraft.h" +#include "RotatedPillarTile.h" + +RotatedPillarTile::RotatedPillarTile(int id, Material *material) : Tile(id, material) +{ +} + +int RotatedPillarTile::getRenderShape() +{ + return Tile::SHAPE_TREE; +} + +int RotatedPillarTile::getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue) +{ + int type = itemValue & MASK_TYPE; + int facing = 0; + + switch (face) + { + case Facing::NORTH: + case Facing::SOUTH: + facing = FACING_Z; + break; + case Facing::EAST: + case Facing::WEST: + facing = FACING_X; + break; + case Facing::UP: + case Facing::DOWN: + facing = FACING_Y; + break; + } + + return type | facing; +} + +Icon *RotatedPillarTile::getTexture(int face, int data) +{ + int dir = data & MASK_FACING; + int type = data & MASK_TYPE; + + if (dir == FACING_Y && (face == Facing::UP || face == Facing::DOWN)) + { + return getTopTexture(type); + } + else if (dir == FACING_X && (face == Facing::EAST || face == Facing::WEST)) + { + return getTopTexture(type); + } + else if (dir == FACING_Z && (face == Facing::NORTH || face == Facing::SOUTH)) + { + return getTopTexture(type); + } + + return getTypeTexture(type); +} + +Icon *RotatedPillarTile::getTopTexture(int type) +{ + return iconTop; +} + +int RotatedPillarTile::getSpawnResourcesAuxValue(int data) +{ + return data & MASK_TYPE; +} + +int RotatedPillarTile::getType(int data) +{ + return data & MASK_TYPE; +} + +shared_ptr RotatedPillarTile::getSilkTouchItemInstance(int data) +{ + return shared_ptr( new ItemInstance(id, 1, getType(data)) ); +} \ No newline at end of file diff --git a/Minecraft.World/RotatedPillarTile.h b/Minecraft.World/RotatedPillarTile.h new file mode 100644 index 00000000..76e52997 --- /dev/null +++ b/Minecraft.World/RotatedPillarTile.h @@ -0,0 +1,35 @@ +#pragma once + +#include "Tile.h" + +class RotatedPillarTile : public Tile +{ +public: + static const int MASK_TYPE = 0x3; + static const int MASK_FACING = 0xC; + static const int FACING_Y = 0 << 2; + static const int FACING_X = 1 << 2; + static const int FACING_Z = 2 << 2; + +protected: + Icon *iconTop; + + RotatedPillarTile(int id, Material *material); + +public: + virtual int getRenderShape(); + virtual int getPlacedOnFaceDataValue(Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, int itemValue); + virtual Icon *getTexture(int face, int data); + +protected: + virtual Icon *getTypeTexture(int type) = 0; + + virtual Icon *getTopTexture(int type); + +public: + virtual int getSpawnResourcesAuxValue(int data); + virtual int getType(int data); + +protected: + virtual shared_ptr getSilkTouchItemInstance(int data); +}; \ No newline at end of file diff --git a/Minecraft.World/RunAroundLikeCrazyGoal.cpp b/Minecraft.World/RunAroundLikeCrazyGoal.cpp new file mode 100644 index 00000000..118b09f9 --- /dev/null +++ b/Minecraft.World/RunAroundLikeCrazyGoal.cpp @@ -0,0 +1,62 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.control.h" +#include "net.minecraft.world.entity.animal.h" +#include "net.minecraft.world.entity.ai.navigation.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.level.h" +#include "RandomPos.h" +#include "RunAroundLikeCrazyGoal.h" + +RunAroundLikeCrazyGoal::RunAroundLikeCrazyGoal(EntityHorse *mob, double speedModifier) +{ + horse = mob; + this->speedModifier = speedModifier; + setRequiredControlFlags(Control::MoveControlFlag); +} + +bool RunAroundLikeCrazyGoal::canUse() +{ + if (horse->isTamed() || horse->rider.lock() == NULL) return false; + Vec3 *pos = RandomPos::getPos(dynamic_pointer_cast(horse->shared_from_this()), 5, 4); + if (pos == NULL) return false; + posX = pos->x; + posY = pos->y; + posZ = pos->z; + return true; +} + +void RunAroundLikeCrazyGoal::start() +{ + horse->getNavigation()->moveTo(posX, posY, posZ, speedModifier); +} + +bool RunAroundLikeCrazyGoal::canContinueToUse() +{ + return !horse->getNavigation()->isDone() && horse->rider.lock() != NULL; +} + +void RunAroundLikeCrazyGoal::tick() +{ + if (horse->getRandom()->nextInt(50) == 0) + { + + if ( horse->rider.lock()->instanceof(eTYPE_PLAYER) ) + { + int temper = horse->getTemper(); + int maxTemper = horse->getMaxTemper(); + if (maxTemper > 0 && horse->getRandom()->nextInt(maxTemper) < temper) + { + horse->tameWithName(dynamic_pointer_cast(horse->rider.lock())); + horse->level->broadcastEntityEvent(horse->shared_from_this(), EntityEvent::TAMING_SUCCEEDED); + return; + } + horse->modifyTemper(5); + } + + horse->rider.lock()->ride(nullptr); + horse->rider = weak_ptr(); + horse->makeMad(); + horse->level->broadcastEntityEvent(horse->shared_from_this(), EntityEvent::TAMING_FAILED); + } +} \ No newline at end of file diff --git a/Minecraft.World/RunAroundLikeCrazyGoal.h b/Minecraft.World/RunAroundLikeCrazyGoal.h new file mode 100644 index 00000000..f895186a --- /dev/null +++ b/Minecraft.World/RunAroundLikeCrazyGoal.h @@ -0,0 +1,21 @@ +#pragma once + +#include "Goal.h" + +class EntityHorse; + +class RunAroundLikeCrazyGoal : public Goal +{ +private: + EntityHorse *horse; // Owner + double speedModifier; + double posX, posY, posZ; + +public: + RunAroundLikeCrazyGoal(EntityHorse *mob, double speedModifier); + + bool canUse(); + void start(); + bool canContinueToUse(); + void tick(); +}; \ No newline at end of file diff --git a/Minecraft.World/SaddleItem.cpp b/Minecraft.World/SaddleItem.cpp index 0effeb53..f982b751 100644 --- a/Minecraft.World/SaddleItem.cpp +++ b/Minecraft.World/SaddleItem.cpp @@ -6,26 +6,26 @@ SaddleItem::SaddleItem(int id) : Item(id) { - maxStackSize = 1; + maxStackSize = 1; } -bool SaddleItem::interactEnemy(shared_ptr itemInstance, shared_ptr mob) +bool SaddleItem::interactEnemy(shared_ptr itemInstance, shared_ptr player, shared_ptr mob) { - if ( dynamic_pointer_cast(mob) ) + if ( (mob != NULL) && mob->instanceof(eTYPE_PIG) ) { - shared_ptr pig = dynamic_pointer_cast(mob); - if (!pig->hasSaddle() && !pig->isBaby()) + shared_ptr pig = dynamic_pointer_cast(mob); + if (!pig->hasSaddle() && !pig->isBaby()) { - pig->setSaddle(true); - itemInstance->count--; - } + pig->setSaddle(true); + itemInstance->count--; + } return true; - } + } return false; } -bool SaddleItem::hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker) +bool SaddleItem::hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker) { - interactEnemy(itemInstance, mob); - return true; + interactEnemy(itemInstance, nullptr, mob); + return true; } \ No newline at end of file diff --git a/Minecraft.World/SaddleItem.h b/Minecraft.World/SaddleItem.h index 129922db..424eecd5 100644 --- a/Minecraft.World/SaddleItem.h +++ b/Minecraft.World/SaddleItem.h @@ -8,6 +8,6 @@ class SaddleItem : public Item public: SaddleItem(int id); - virtual bool interactEnemy(shared_ptr itemInstance, shared_ptr mob); - virtual bool hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker); + virtual bool interactEnemy(shared_ptr itemInstance, shared_ptr player, shared_ptr mob); + virtual bool hurtEnemy(shared_ptr itemInstance, shared_ptr mob, shared_ptr attacker); }; \ No newline at end of file diff --git a/Minecraft.World/SandFeature.cpp b/Minecraft.World/SandFeature.cpp index b678e290..122264ff 100644 --- a/Minecraft.World/SandFeature.cpp +++ b/Minecraft.World/SandFeature.cpp @@ -5,21 +5,21 @@ SandFeature::SandFeature(int radius, int tile) { - this->tile = tile; - this->radius = radius; + this->tile = tile; + this->radius = radius; } bool SandFeature::place(Level *level, Random *random, int x, int y, int z) { - if (level->getMaterial(x, y, z) != Material::water) return false; + if (level->getMaterial(x, y, z) != Material::water) return false; // 4J - optimisation. Without this, we can end up creating a huge number of HeavyTiles to be ticked // a few frames away. I think instatick ought to be fine here - we're only turning rock into gravel, // so should instantly know if we've made a rock with nothing underneath and that should fall. level->setInstaTick(true); - int r = random->nextInt(radius-2)+2; - int yr = 2; + int r = random->nextInt(radius-2)+2; + int yr = 2; // 4J Stu Added to stop tree features generating areas previously place by game rule generation if(app.getLevelGenerationOptions() != NULL) @@ -34,25 +34,25 @@ bool SandFeature::place(Level *level, Random *random, int x, int y, int z) } } - for (int xx = x - r; xx <= x + r; xx++) + for (int xx = x - r; xx <= x + r; xx++) { - for (int zz = z - r; zz <= z + r; zz++) + for (int zz = z - r; zz <= z + r; zz++) { - int xd = xx - x; - int zd = zz - z; - if (xd * xd + zd * zd > r * r) continue; - for (int yy = y - yr; yy <= y + yr; yy++) + int xd = xx - x; + int zd = zz - z; + if (xd * xd + zd * zd > r * r) continue; + for (int yy = y - yr; yy <= y + yr; yy++) { - int t = level->getTile(xx, yy, zz); - if (t == Tile::dirt_Id || t == Tile::grass_Id) + int t = level->getTile(xx, yy, zz); + if (t == Tile::dirt_Id || t == Tile::grass_Id) { - level->setTileNoUpdate(xx, yy, zz, tile); - } - } - } - } + level->setTileAndData(xx, yy, zz, tile, 0, Tile::UPDATE_CLIENTS); + } + } + } + } level->setInstaTick(false); - return true; + return true; } \ No newline at end of file diff --git a/Minecraft.World/Sapling.cpp b/Minecraft.World/Sapling.cpp index 42bd53ee..85fcea98 100644 --- a/Minecraft.World/Sapling.cpp +++ b/Minecraft.World/Sapling.cpp @@ -6,11 +6,11 @@ #include "Sapling.h" -const unsigned int Sapling::SAPLING_NAMES[SAPLING_NAMES_SIZE] = { IDS_TILE_SAPLING_OAK, - IDS_TILE_SAPLING_SPRUCE, - IDS_TILE_SAPLING_BIRCH, - IDS_TILE_SAPLING_JUNGLE - }; +int Sapling::SAPLING_NAMES[SAPLING_NAMES_SIZE] = { IDS_TILE_SAPLING_OAK, + IDS_TILE_SAPLING_SPRUCE, + IDS_TILE_SAPLING_BIRCH, + IDS_TILE_SAPLING_JUNGLE +}; const wstring Sapling::TEXTURE_NAMES[] = {L"sapling", L"sapling_spruce", L"sapling_birch", L"sapling_jungle"}; @@ -37,15 +37,7 @@ void Sapling::tick(Level *level, int x, int y, int z, Random *random) { if (random->nextInt(7) == 0) { - int data = level->getData(x, y, z); - if ((data & AGE_BIT) == 0) - { - level->setData(x, y, z, data | AGE_BIT); - } - else - { - growTree(level, x, y, z, random); - } + advanceTree(level, x, y, z, random); } } } @@ -56,6 +48,19 @@ Icon *Sapling::getTexture(int face, int data) return icons[data]; } +void Sapling::advanceTree(Level *level, int x, int y, int z, Random *random) +{ + int data = level->getData(x, y, z); + if ((data & AGE_BIT) == 0) + { + level->setData(x, y, z, data | AGE_BIT, Tile::UPDATE_NONE); + } + else + { + growTree(level, x, y, z, random); + } +} + void Sapling::growTree(Level *level, int x, int y, int z, Random *random) { int data = level->getData(x, y, z) & TYPE_MASK; @@ -80,14 +85,12 @@ void Sapling::growTree(Level *level, int x, int y, int z, Random *random) { for (oz = 0; oz >= -1; oz--) { - if (isSapling(level, x + ox, y, z + oz, TYPE_JUNGLE) && - isSapling(level, x + ox + 1, y, z + oz, TYPE_JUNGLE) && - isSapling(level, x + ox, y, z + oz + 1, TYPE_JUNGLE) && - isSapling(level, x + ox + 1, y, z + oz + 1, TYPE_JUNGLE)) + if (isSapling(level, x + ox, y, z + oz, TYPE_JUNGLE) && isSapling(level, x + ox + 1, y, z + oz, TYPE_JUNGLE) && isSapling(level, x + ox, y, z + oz + 1, TYPE_JUNGLE) + && isSapling(level, x + ox + 1, y, z + oz + 1, TYPE_JUNGLE)) { - f = new MegaTreeFeature(true, 10 + random->nextInt(20), TreeTile::JUNGLE_TRUNK, LeafTile::JUNGLE_LEAF); - multiblock = true; - break; + f = new MegaTreeFeature(true, 10 + random->nextInt(20), TreeTile::JUNGLE_TRUNK, LeafTile::JUNGLE_LEAF); + multiblock = true; + break; } } if (f != NULL) @@ -112,27 +115,27 @@ void Sapling::growTree(Level *level, int x, int y, int z, Random *random) } if (multiblock) { - level->setTileNoUpdate(x + ox, y, z + oz, 0); - level->setTileNoUpdate(x + ox + 1, y, z + oz, 0); - level->setTileNoUpdate(x + ox, y, z + oz + 1, 0); - level->setTileNoUpdate(x + ox + 1, y, z + oz + 1, 0); + level->setTileAndData(x + ox, y, z + oz, 0, 0, Tile::UPDATE_NONE); + level->setTileAndData(x + ox + 1, y, z + oz, 0, 0, Tile::UPDATE_NONE); + level->setTileAndData(x + ox, y, z + oz + 1, 0, 0, Tile::UPDATE_NONE); + level->setTileAndData(x + ox + 1, y, z + oz + 1, 0, 0, Tile::UPDATE_NONE); } else { - level->setTileNoUpdate(x, y, z, 0); + level->setTileAndData(x, y, z, 0, 0, Tile::UPDATE_NONE); } if (!f->place(level, random, x + ox, y, z + oz)) { if (multiblock) { - level->setTileAndDataNoUpdate(x + ox, y, z + oz, this->id, data); - level->setTileAndDataNoUpdate(x + ox + 1, y, z + oz, this->id, data); - level->setTileAndDataNoUpdate(x + ox, y, z + oz + 1, this->id, data); - level->setTileAndDataNoUpdate(x + ox + 1, y, z + oz + 1, this->id, data); + level->setTileAndData(x + ox, y, z + oz, id, data, Tile::UPDATE_NONE); + level->setTileAndData(x + ox + 1, y, z + oz, id, data, Tile::UPDATE_NONE); + level->setTileAndData(x + ox, y, z + oz + 1, id, data, Tile::UPDATE_NONE); + level->setTileAndData(x + ox + 1, y, z + oz + 1, id, data, Tile::UPDATE_NONE); } else { - level->setTileAndDataNoUpdate(x, y, z, this->id, data); + level->setTileAndData(x, y, z, id, data, Tile::UPDATE_NONE); } } if( f != NULL ) diff --git a/Minecraft.World/Sapling.h b/Minecraft.World/Sapling.h index f44888af..57135f33 100644 --- a/Minecraft.World/Sapling.h +++ b/Minecraft.World/Sapling.h @@ -18,7 +18,7 @@ public: static const int SAPLING_NAMES_SIZE = 4; - static const unsigned int SAPLING_NAMES[SAPLING_NAMES_SIZE]; + static int SAPLING_NAMES[SAPLING_NAMES_SIZE]; private: static const wstring TEXTURE_NAMES[]; @@ -32,11 +32,11 @@ protected: Sapling(int id); public: - virtual void updateDefaultShape(); // 4J Added override - void tick(Level *level, int x, int y, int z, Random *random); - - Icon *getTexture(int face, int data); + virtual void updateDefaultShape(); // 4J Added override + virtual void tick(Level *level, int x, int y, int z, Random *random); + virtual Icon *getTexture(int face, int data); + virtual void advanceTree(Level *level, int x, int y, int z, Random *random); void growTree(Level *level, int x, int y, int z, Random *random); virtual unsigned int getDescriptionId(int iData = -1); diff --git a/Minecraft.World/SavedDataStorage.cpp b/Minecraft.World/SavedDataStorage.cpp index cacfa688..3dbd6400 100644 --- a/Minecraft.World/SavedDataStorage.cpp +++ b/Minecraft.World/SavedDataStorage.cpp @@ -43,6 +43,10 @@ shared_ptr SavedDataStorage::get(const type_info& clazz, const wstrin { data = dynamic_pointer_cast( shared_ptr(new Villages(id) ) ); } + else if( clazz == typeid(StructureFeatureSavedData) ) + { + data = dynamic_pointer_cast( shared_ptr( new StructureFeatureSavedData(id) ) ); + } else { // Handling of new SavedData class required diff --git a/Minecraft.World/ScatteredFeaturePieces.cpp b/Minecraft.World/ScatteredFeaturePieces.cpp index 07c2e7e6..317d6d9e 100644 --- a/Minecraft.World/ScatteredFeaturePieces.cpp +++ b/Minecraft.World/ScatteredFeaturePieces.cpp @@ -1,12 +1,30 @@ #include "stdafx.h" #include "net.minecraft.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.level.dimension.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.levelgen.structure.h" #include "WeighedTreasure.h" #include "ScatteredFeaturePieces.h" +void ScatteredFeaturePieces::loadStatic() +{ + StructureFeatureIO::setPieceId(eStructurePiece_DesertPyramidPiece, DesertPyramidPiece::Create, L"TeDP"); + StructureFeatureIO::setPieceId(eStructurePiece_JunglePyramidPiece, DesertPyramidPiece::Create, L"TeJP"); + StructureFeatureIO::setPieceId(eStructurePiece_SwamplandHut, DesertPyramidPiece::Create, L"TeSH"); +} + +ScatteredFeaturePieces::ScatteredFeaturePiece::ScatteredFeaturePiece() +{ + width = 0; + height = 0; + depth = 0; + heightPosition = 0; + // for reflection +} + ScatteredFeaturePieces::ScatteredFeaturePiece::ScatteredFeaturePiece(Random *random, int west, int floor, int north, int width, int height, int depth) : StructurePiece(0) { heightPosition = -1; @@ -16,6 +34,16 @@ ScatteredFeaturePieces::ScatteredFeaturePiece::ScatteredFeaturePiece(Random *ran orientation = random->nextInt(4); + LevelGenerationOptions *levelGenOptions = app.getLevelGenerationOptions(); + if( levelGenOptions != NULL ) + { + int tempOrientation = 0; + if(levelGenOptions->isFeatureChunk(west>>4,north>>4,StructureFeature::eFeature_Temples, &tempOrientation) ) + { + orientation = tempOrientation; + } + } + switch (orientation) { case Direction::NORTH: @@ -28,6 +56,22 @@ ScatteredFeaturePieces::ScatteredFeaturePiece::ScatteredFeaturePiece(Random *ran } } +void ScatteredFeaturePieces::ScatteredFeaturePiece::addAdditonalSaveData(CompoundTag *tag) +{ + tag->putInt(L"Width", width); + tag->putInt(L"Height", height); + tag->putInt(L"Depth", depth); + tag->putInt(L"HPos", heightPosition); +} + +void ScatteredFeaturePieces::ScatteredFeaturePiece::readAdditonalSaveData(CompoundTag *tag) +{ + width = tag->getInt(L"Width"); + height = tag->getInt(L"Height"); + depth = tag->getInt(L"Depth"); + heightPosition = tag->getInt(L"HPos"); +} + bool ScatteredFeaturePieces::ScatteredFeaturePiece::updateAverageGroundHeight(Level *level, BoundingBox *chunkBB, int offset) { if (heightPosition >= 0) @@ -66,8 +110,23 @@ WeighedTreasure *ScatteredFeaturePieces::DesertPyramidPiece::treasureItems[Scatt new WeighedTreasure(Item::emerald_Id, 0, 1, 3, 2), new WeighedTreasure(Item::bone_Id, 0, 4, 6, 20), new WeighedTreasure(Item::rotten_flesh_Id, 0, 3, 7, 16), + // very rare for pyramids ... + new WeighedTreasure(Item::saddle_Id, 0, 1, 1, 3), + new WeighedTreasure(Item::horseArmorMetal_Id, 0, 1, 1, 1), + new WeighedTreasure(Item::horseArmorGold_Id, 0, 1, 1, 1), + new WeighedTreasure(Item::horseArmorDiamond_Id, 0, 1, 1, 1), + // ... }; +ScatteredFeaturePieces::DesertPyramidPiece::DesertPyramidPiece() +{ + hasPlacedChest[0] = false; + hasPlacedChest[1] = false; + hasPlacedChest[2] = false; + hasPlacedChest[3] = false; + // for reflection +} + ScatteredFeaturePieces::DesertPyramidPiece::DesertPyramidPiece(Random *random, int west, int north) : ScatteredFeaturePiece(random, west, 64, north, 21, 15, 21) { hasPlacedChest[0] = false; @@ -76,6 +135,24 @@ ScatteredFeaturePieces::DesertPyramidPiece::DesertPyramidPiece(Random *random, i hasPlacedChest[3] = false; } +void ScatteredFeaturePieces::DesertPyramidPiece::addAdditonalSaveData(CompoundTag *tag) +{ + ScatteredFeaturePiece::addAdditonalSaveData(tag); + tag->putBoolean(L"hasPlacedChest0", hasPlacedChest[0]); + tag->putBoolean(L"hasPlacedChest1", hasPlacedChest[1]); + tag->putBoolean(L"hasPlacedChest2", hasPlacedChest[2]); + tag->putBoolean(L"hasPlacedChest3", hasPlacedChest[3]); +} + +void ScatteredFeaturePieces::DesertPyramidPiece::readAdditonalSaveData(CompoundTag *tag) +{ + ScatteredFeaturePiece::readAdditonalSaveData(tag); + hasPlacedChest[0] = tag->getBoolean(L"hasPlacedChest0"); + hasPlacedChest[1] = tag->getBoolean(L"hasPlacedChest1"); + hasPlacedChest[2] = tag->getBoolean(L"hasPlacedChest2"); + hasPlacedChest[3] = tag->getBoolean(L"hasPlacedChest3"); +} + bool ScatteredFeaturePieces::DesertPyramidPiece::postProcess(Level *level, Random *random, BoundingBox *chunkBB) { // pyramid @@ -181,41 +258,41 @@ bool ScatteredFeaturePieces::DesertPyramidPiece::postProcess(Level *level, Rando placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, width - 5, 1, z, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_HEIROGLYPHS, width - 5, 2, z, chunkBB); } - placeBlock(level, Tile::cloth_Id, baseDecoColor, 10, 0, 7, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, 10, 0, 8, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, 9, 0, 9, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, 11, 0, 9, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, 8, 0, 10, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, 12, 0, 10, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, 7, 0, 10, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, 13, 0, 10, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, 9, 0, 11, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, 11, 0, 11, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, 10, 0, 12, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, 10, 0, 13, chunkBB); - placeBlock(level, Tile::cloth_Id, blue, 10, 0, 10, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 10, 0, 7, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 10, 0, 8, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 9, 0, 9, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 11, 0, 9, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 8, 0, 10, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 12, 0, 10, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 7, 0, 10, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 13, 0, 10, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 9, 0, 11, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 11, 0, 11, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 10, 0, 12, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 10, 0, 13, chunkBB); + placeBlock(level, Tile::wool_Id, blue, 10, 0, 10, chunkBB); // outdoor decoration for (int x = 0; x <= width - 1; x += width - 1) { placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x, 2, 1, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 2, 2, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 2, 2, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x, 2, 3, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x, 3, 1, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 3, 2, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 3, 2, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x, 3, 3, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 4, 1, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 4, 1, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_HEIROGLYPHS, x, 4, 2, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 4, 3, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 4, 3, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x, 5, 1, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 5, 2, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 5, 2, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x, 5, 3, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 6, 1, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 6, 1, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_HEIROGLYPHS, x, 6, 2, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 6, 3, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 7, 1, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 7, 2, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 7, 3, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 6, 3, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 7, 1, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 7, 2, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 7, 3, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x, 8, 1, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x, 8, 2, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x, 8, 3, chunkBB); @@ -223,23 +300,23 @@ bool ScatteredFeaturePieces::DesertPyramidPiece::postProcess(Level *level, Rando for (int x = 2; x <= width - 3; x += width - 3 - 2) { placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x - 1, 2, 0, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 2, 0, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 2, 0, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x + 1, 2, 0, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x - 1, 3, 0, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 3, 0, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 3, 0, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x + 1, 3, 0, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x - 1, 4, 0, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x - 1, 4, 0, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_HEIROGLYPHS, x, 4, 0, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x + 1, 4, 0, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x + 1, 4, 0, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x - 1, 5, 0, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 5, 0, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 5, 0, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x + 1, 5, 0, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x - 1, 6, 0, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x - 1, 6, 0, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_HEIROGLYPHS, x, 6, 0, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x + 1, 6, 00, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x - 1, 7, 0, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x, 7, 0, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, x + 1, 7, 0, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x + 1, 6, 00, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x - 1, 7, 0, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x, 7, 0, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, x + 1, 7, 0, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x - 1, 8, 0, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x, 8, 0, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, x + 1, 8, 0, chunkBB); @@ -247,9 +324,9 @@ bool ScatteredFeaturePieces::DesertPyramidPiece::postProcess(Level *level, Rando generateBox(level, chunkBB, 8, 4, 0, 12, 6, 0, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, false); placeBlock(level, 0, 0, 8, 6, 0, chunkBB); placeBlock(level, 0, 0, 12, 6, 0, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, 9, 5, 0, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 9, 5, 0, chunkBB); placeBlock(level, Tile::sandStone_Id, SandStoneTile::TYPE_HEIROGLYPHS, 10, 5, 0, chunkBB); - placeBlock(level, Tile::cloth_Id, baseDecoColor, 11, 5, 0, chunkBB); + placeBlock(level, Tile::wool_Id, baseDecoColor, 11, 5, 0, chunkBB); // tombs generateBox(level, chunkBB, 8, -14, 8, 12, -11, 12, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, Tile::sandStone_Id, SandStoneTile::TYPE_SMOOTHSIDE, false); @@ -289,7 +366,7 @@ bool ScatteredFeaturePieces::DesertPyramidPiece::postProcess(Level *level, Rando return true; } - + WeighedTreasure *ScatteredFeaturePieces::JunglePyramidPiece::treasureItems[ScatteredFeaturePieces::JunglePyramidPiece::TREASURE_ITEMS_COUNT] = { new WeighedTreasure(Item::diamond_Id, 0, 1, 3, 3), @@ -298,6 +375,12 @@ WeighedTreasure *ScatteredFeaturePieces::JunglePyramidPiece::treasureItems[Scatt new WeighedTreasure(Item::emerald_Id, 0, 1, 3, 2), new WeighedTreasure(Item::bone_Id, 0, 4, 6, 20), new WeighedTreasure(Item::rotten_flesh_Id, 0, 3, 7, 16), + // very rare for pyramids ... + new WeighedTreasure(Item::saddle_Id, 0, 1, 1, 3), + new WeighedTreasure(Item::horseArmorMetal_Id, 0, 1, 1, 1), + new WeighedTreasure(Item::horseArmorGold_Id, 0, 1, 1, 1), + new WeighedTreasure(Item::horseArmorDiamond_Id, 0, 1, 1, 1), + // ... }; @@ -307,6 +390,11 @@ WeighedTreasure *ScatteredFeaturePieces::JunglePyramidPiece::dispenserItems[Scat // new WeighedTreasure(Item.fireball.id, 0, 1, 1, 10), }; +ScatteredFeaturePieces::JunglePyramidPiece::JunglePyramidPiece() +{ + // for reflection +} + ScatteredFeaturePieces::JunglePyramidPiece::JunglePyramidPiece(Random *random, int west, int north) : ScatteredFeaturePiece(random, west, 64, north, 12, 10, 15) { placedMainChest = false; @@ -315,6 +403,24 @@ ScatteredFeaturePieces::JunglePyramidPiece::JunglePyramidPiece(Random *random, i placedTrap2 = false; } +void ScatteredFeaturePieces::JunglePyramidPiece::addAdditonalSaveData(CompoundTag *tag) +{ + ScatteredFeaturePiece::addAdditonalSaveData(tag); + tag->putBoolean(L"placedMainChest", placedMainChest); + tag->putBoolean(L"placedHiddenChest", placedHiddenChest); + tag->putBoolean(L"placedTrap1", placedTrap1); + tag->putBoolean(L"placedTrap2", placedTrap2); +} + +void ScatteredFeaturePieces::JunglePyramidPiece::readAdditonalSaveData(CompoundTag *tag) +{ + ScatteredFeaturePiece::readAdditonalSaveData(tag); + placedMainChest = tag->getBoolean(L"placedMainChest"); + placedHiddenChest = tag->getBoolean(L"placedHiddenChest"); + placedTrap1 = tag->getBoolean(L"placedTrap1"); + placedTrap2 = tag->getBoolean(L"placedTrap2"); +} + bool ScatteredFeaturePieces::JunglePyramidPiece::postProcess(Level *level, Random *random, BoundingBox *chunkBB) { if (!updateAverageGroundHeight(level, chunkBB, 0)) @@ -457,7 +563,7 @@ bool ScatteredFeaturePieces::JunglePyramidPiece::postProcess(Level *level, Rando placeBlock(level, Tile::redStoneDust_Id, 0, 5, -3, 2, chunkBB); placeBlock(level, Tile::redStoneDust_Id, 0, 5, -3, 1, chunkBB); placeBlock(level, Tile::redStoneDust_Id, 0, 4, -3, 1, chunkBB); - placeBlock(level, Tile::mossStone_Id, 0, 3, -3, 1, chunkBB); + placeBlock(level, Tile::mossyCobblestone_Id, 0, 3, -3, 1, chunkBB); if (!placedTrap1) { placedTrap1 = createDispenser(level, chunkBB, random, 3, -2, 1, Facing::NORTH, WeighedTreasureArray(dispenserItems,DISPENSER_ITEMS_COUNT), 2); @@ -473,7 +579,7 @@ bool ScatteredFeaturePieces::JunglePyramidPiece::postProcess(Level *level, Rando placeBlock(level, Tile::redStoneDust_Id, 0, 8, -3, 6, chunkBB); placeBlock(level, Tile::redStoneDust_Id, 0, 9, -3, 6, chunkBB); placeBlock(level, Tile::redStoneDust_Id, 0, 9, -3, 5, chunkBB); - placeBlock(level, Tile::mossStone_Id, 0, 9, -3, 4, chunkBB); + placeBlock(level, Tile::mossyCobblestone_Id, 0, 9, -3, 4, chunkBB); placeBlock(level, Tile::redStoneDust_Id, 0, 9, -2, 4, chunkBB); if (!placedTrap2) { @@ -485,28 +591,28 @@ bool ScatteredFeaturePieces::JunglePyramidPiece::postProcess(Level *level, Rando { placedMainChest = createChest(level, chunkBB, random, 8, -3, 3, WeighedTreasure::addToTreasure(WeighedTreasureArray(treasureItems,TREASURE_ITEMS_COUNT), Item::enchantedBook->createForRandomTreasure(random)), 2 + random->nextInt(5)); } - placeBlock(level, Tile::mossStone_Id, 0, 9, -3, 2, chunkBB); - placeBlock(level, Tile::mossStone_Id, 0, 8, -3, 1, chunkBB); - placeBlock(level, Tile::mossStone_Id, 0, 4, -3, 5, chunkBB); - placeBlock(level, Tile::mossStone_Id, 0, 5, -2, 5, chunkBB); - placeBlock(level, Tile::mossStone_Id, 0, 5, -1, 5, chunkBB); - placeBlock(level, Tile::mossStone_Id, 0, 6, -3, 5, chunkBB); - placeBlock(level, Tile::mossStone_Id, 0, 7, -2, 5, chunkBB); - placeBlock(level, Tile::mossStone_Id, 0, 7, -1, 5, chunkBB); - placeBlock(level, Tile::mossStone_Id, 0, 8, -3, 5, chunkBB); + placeBlock(level, Tile::mossyCobblestone_Id, 0, 9, -3, 2, chunkBB); + placeBlock(level, Tile::mossyCobblestone_Id, 0, 8, -3, 1, chunkBB); + placeBlock(level, Tile::mossyCobblestone_Id, 0, 4, -3, 5, chunkBB); + placeBlock(level, Tile::mossyCobblestone_Id, 0, 5, -2, 5, chunkBB); + placeBlock(level, Tile::mossyCobblestone_Id, 0, 5, -1, 5, chunkBB); + placeBlock(level, Tile::mossyCobblestone_Id, 0, 6, -3, 5, chunkBB); + placeBlock(level, Tile::mossyCobblestone_Id, 0, 7, -2, 5, chunkBB); + placeBlock(level, Tile::mossyCobblestone_Id, 0, 7, -1, 5, chunkBB); + placeBlock(level, Tile::mossyCobblestone_Id, 0, 8, -3, 5, chunkBB); generateBox(level, chunkBB, 9, -1, 1, 9, -1, 5, false, random, &stoneSelector); // hidden room generateAirBox(level, chunkBB, 8, -3, 8, 10, -1, 10); - placeBlock(level, Tile::stoneBrickSmooth_Id, SmoothStoneBrickTile::TYPE_DETAIL, 8, -2, 11, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, SmoothStoneBrickTile::TYPE_DETAIL, 9, -2, 11, chunkBB); - placeBlock(level, Tile::stoneBrickSmooth_Id, SmoothStoneBrickTile::TYPE_DETAIL, 10, -2, 11, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, SmoothStoneBrickTile::TYPE_DETAIL, 8, -2, 11, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, SmoothStoneBrickTile::TYPE_DETAIL, 9, -2, 11, chunkBB); + placeBlock(level, Tile::stoneBrick_Id, SmoothStoneBrickTile::TYPE_DETAIL, 10, -2, 11, chunkBB); placeBlock(level, Tile::lever_Id, LeverTile::getLeverFacing(getOrientationData(Tile::lever_Id, Facing::NORTH)), 8, -2, 12, chunkBB); placeBlock(level, Tile::lever_Id, LeverTile::getLeverFacing(getOrientationData(Tile::lever_Id, Facing::NORTH)), 9, -2, 12, chunkBB); placeBlock(level, Tile::lever_Id, LeverTile::getLeverFacing(getOrientationData(Tile::lever_Id, Facing::NORTH)), 10, -2, 12, chunkBB); generateBox(level, chunkBB, 8, -3, 8, 8, -3, 10, false, random, &stoneSelector); generateBox(level, chunkBB, 10, -3, 8, 10, -3, 10, false, random, &stoneSelector); - placeBlock(level, Tile::mossStone_Id, 0, 10, -2, 9, chunkBB); + placeBlock(level, Tile::mossyCobblestone_Id, 0, 10, -2, 9, chunkBB); placeBlock(level, Tile::redStoneDust_Id, 0, 8, -2, 9, chunkBB); placeBlock(level, Tile::redStoneDust_Id, 0, 8, -2, 10, chunkBB); placeBlock(level, Tile::redStoneDust_Id, 0, 10, -1, 9, chunkBB); @@ -526,12 +632,117 @@ void ScatteredFeaturePieces::JunglePyramidPiece::MossStoneSelector::next(Random { if (random->nextFloat() < .4f) { - nextId = Tile::stoneBrick_Id; + nextId = Tile::cobblestone_Id; } else { - nextId = Tile::mossStone_Id; + nextId = Tile::mossyCobblestone_Id; } } -ScatteredFeaturePieces::JunglePyramidPiece::MossStoneSelector ScatteredFeaturePieces::JunglePyramidPiece::stoneSelector; \ No newline at end of file +ScatteredFeaturePieces::JunglePyramidPiece::MossStoneSelector ScatteredFeaturePieces::JunglePyramidPiece::stoneSelector; + +ScatteredFeaturePieces::SwamplandHut::SwamplandHut() +{ + spawnedWitch = false; + // for reflection +} + +ScatteredFeaturePieces::SwamplandHut::SwamplandHut(Random *random, int west, int north) : ScatteredFeaturePiece(random, west, 64, north, 7, 5, 9) +{ + spawnedWitch = false; +} + +void ScatteredFeaturePieces::SwamplandHut::addAdditonalSaveData(CompoundTag *tag) +{ + ScatteredFeaturePiece::addAdditonalSaveData(tag); + tag->putBoolean(L"Witch", spawnedWitch); +} + +void ScatteredFeaturePieces::SwamplandHut::readAdditonalSaveData(CompoundTag *tag) +{ + ScatteredFeaturePiece::readAdditonalSaveData(tag); + spawnedWitch = tag->getBoolean(L"Witch"); +} + +bool ScatteredFeaturePieces::SwamplandHut::postProcess(Level *level, Random *random, BoundingBox *chunkBB) +{ + if (!updateAverageGroundHeight(level, chunkBB, 0)) + { + return false; + } + + // floor and ceiling + generateBox(level, chunkBB, 1, 1, 1, 5, 1, 7, Tile::wood_Id, TreeTile::DARK_TRUNK, Tile::wood_Id, TreeTile::DARK_TRUNK, false); + generateBox(level, chunkBB, 1, 4, 2, 5, 4, 7, Tile::wood_Id, TreeTile::DARK_TRUNK, Tile::wood_Id, TreeTile::DARK_TRUNK, false); + generateBox(level, chunkBB, 2, 1, 0, 4, 1, 0, Tile::wood_Id, TreeTile::DARK_TRUNK, Tile::wood_Id, TreeTile::DARK_TRUNK, false); + + // walls + generateBox(level, chunkBB, 2, 2, 2, 3, 3, 2, Tile::wood_Id, TreeTile::DARK_TRUNK, Tile::wood_Id, TreeTile::DARK_TRUNK, false); + generateBox(level, chunkBB, 1, 2, 3, 1, 3, 6, Tile::wood_Id, TreeTile::DARK_TRUNK, Tile::wood_Id, TreeTile::DARK_TRUNK, false); + generateBox(level, chunkBB, 5, 2, 3, 5, 3, 6, Tile::wood_Id, TreeTile::DARK_TRUNK, Tile::wood_Id, TreeTile::DARK_TRUNK, false); + generateBox(level, chunkBB, 2, 2, 7, 4, 3, 7, Tile::wood_Id, TreeTile::DARK_TRUNK, Tile::wood_Id, TreeTile::DARK_TRUNK, false); + + // pillars + generateBox(level, chunkBB, 1, 0, 2, 1, 3, 2, Tile::treeTrunk_Id, Tile::treeTrunk_Id, false); + generateBox(level, chunkBB, 5, 0, 2, 5, 3, 2, Tile::treeTrunk_Id, Tile::treeTrunk_Id, false); + generateBox(level, chunkBB, 1, 0, 7, 1, 3, 7, Tile::treeTrunk_Id, Tile::treeTrunk_Id, false); + generateBox(level, chunkBB, 5, 0, 7, 5, 3, 7, Tile::treeTrunk_Id, Tile::treeTrunk_Id, false); + + // windows + placeBlock(level, Tile::fence_Id, 0, 2, 3, 2, chunkBB); + placeBlock(level, Tile::fence_Id, 0, 3, 3, 7, chunkBB); + placeBlock(level, 0, 0, 1, 3, 4, chunkBB); + placeBlock(level, 0, 0, 5, 3, 4, chunkBB); + placeBlock(level, 0, 0, 5, 3, 5, chunkBB); + placeBlock(level, Tile::flowerPot_Id, FlowerPotTile::TYPE_MUSHROOM_RED, 1, 3, 5, chunkBB); + + // decoration + placeBlock(level, Tile::workBench_Id, 0, 3, 2, 6, chunkBB); + placeBlock(level, Tile::cauldron_Id, 0, 4, 2, 6, chunkBB); + + // front railings + placeBlock(level, Tile::fence_Id, 0, 1, 2, 1, chunkBB); + placeBlock(level, Tile::fence_Id, 0, 5, 2, 1, chunkBB); + // placeBlock(level, Tile.torch.id, 0, 1, 3, 1, chunkBB); + // placeBlock(level, Tile.torch.id, 0, 5, 3, 1, chunkBB); + + // ceiling edges + int south = getOrientationData(Tile::stairs_wood_Id, StairTile::DIR_NORTH); + int east = getOrientationData(Tile::stairs_wood_Id, StairTile::DIR_WEST); + int west = getOrientationData(Tile::stairs_wood_Id, StairTile::DIR_EAST); + int north = getOrientationData(Tile::stairs_wood_Id, StairTile::DIR_SOUTH); + + generateBox(level, chunkBB, 0, 4, 1, 6, 4, 1, Tile::stairs_sprucewood_Id, south, Tile::stairs_sprucewood_Id, south, false); + generateBox(level, chunkBB, 0, 4, 2, 0, 4, 7, Tile::stairs_sprucewood_Id, west, Tile::stairs_sprucewood_Id, west, false); + generateBox(level, chunkBB, 6, 4, 2, 6, 4, 7, Tile::stairs_sprucewood_Id, east, Tile::stairs_sprucewood_Id, east, false); + generateBox(level, chunkBB, 0, 4, 8, 6, 4, 8, Tile::stairs_sprucewood_Id, north, Tile::stairs_sprucewood_Id, north, false); + + // fill pillars down to solid ground + for (int z = 2; z <= 7; z += 5) + { + for (int x = 1; x <= 5; x += 4) + { + fillColumnDown(level, Tile::treeTrunk_Id, 0, x, -1, z, chunkBB); + } + } + + if (!spawnedWitch) + { + int wx = getWorldX(2, 5); + int wy = getWorldY(2); + int wz = getWorldZ(2, 5); + + if (chunkBB->isInside(wx, wy, wz)) + { + spawnedWitch = true; + + shared_ptr witch = shared_ptr( new Witch(level) ); + witch->moveTo(wx + .5, wy, wz + .5, 0, 0); + witch->finalizeMobSpawn(NULL); + level->addEntity(witch); + } + } + + return true; +} \ No newline at end of file diff --git a/Minecraft.World/ScatteredFeaturePieces.h b/Minecraft.World/ScatteredFeaturePieces.h index 08ab92ba..5fb334df 100644 --- a/Minecraft.World/ScatteredFeaturePieces.h +++ b/Minecraft.World/ScatteredFeaturePieces.h @@ -4,6 +4,9 @@ class ScatteredFeaturePieces { +public: + static void loadStatic(); + private: class ScatteredFeaturePiece : public StructurePiece { @@ -14,8 +17,11 @@ private: int heightPosition; + ScatteredFeaturePiece(); ScatteredFeaturePiece(Random *random, int west, int floor, int north, int width, int height, int depth); + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditonalSaveData(CompoundTag *tag); bool updateAverageGroundHeight(Level *level, BoundingBox *chunkBB, int offset); }; @@ -23,14 +29,23 @@ public: class DesertPyramidPiece : public ScatteredFeaturePiece { public: - static const int TREASURE_ITEMS_COUNT = 6; + static StructurePiece *Create() { return new DesertPyramidPiece(); } + virtual EStructurePiece GetType() { return eStructurePiece_DesertPyramidPiece; } + + public: + static const int TREASURE_ITEMS_COUNT = 10; private: bool hasPlacedChest[4]; static WeighedTreasure *treasureItems[TREASURE_ITEMS_COUNT]; public: + DesertPyramidPiece(); DesertPyramidPiece(Random *random, int west, int north); + protected: + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditonalSaveData(CompoundTag *tag); + bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); }; @@ -38,7 +53,11 @@ public: class JunglePyramidPiece : public ScatteredFeaturePiece { public: - static const int TREASURE_ITEMS_COUNT = 6; + static StructurePiece *Create() { return new JunglePyramidPiece(); } + virtual EStructurePiece GetType() { return eStructurePiece_JunglePyramidPiece; } + + public: + static const int TREASURE_ITEMS_COUNT = 10; static const int DISPENSER_ITEMS_COUNT = 1; private: bool placedMainChest; @@ -50,8 +69,14 @@ public: static WeighedTreasure *dispenserItems[DISPENSER_ITEMS_COUNT]; public: + JunglePyramidPiece(); JunglePyramidPiece(Random *random, int west, int north); + protected: + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditonalSaveData(CompoundTag *tag); + + public: bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); private: @@ -64,4 +89,25 @@ public: static MossStoneSelector stoneSelector; }; + + class SwamplandHut : public ScatteredFeaturePiece + { + public: + static StructurePiece *Create() { return new SwamplandHut(); } + virtual EStructurePiece GetType() { return eStructurePiece_SwamplandHut; } + + private: + bool spawnedWitch; + + public: + SwamplandHut(); + SwamplandHut(Random *random, int west, int north); + + protected: + virtual void addAdditonalSaveData(CompoundTag *tag); + virtual void readAdditonalSaveData(CompoundTag *tag); + + public: + bool postProcess(Level *level, Random *random, BoundingBox *chunkBB); + }; }; \ No newline at end of file diff --git a/Minecraft.World/Score.cpp b/Minecraft.World/Score.cpp new file mode 100644 index 00000000..039939b1 --- /dev/null +++ b/Minecraft.World/Score.cpp @@ -0,0 +1,68 @@ +#include "stdafx.h" +#include "net.minecraft.world.scores.h" +#include "net.minecraft.world.scores.criteria.h" +#include "Score.h" + +Score::Score(Scoreboard *scoreboard, Objective *objective, const wstring &owner) +{ + this->scoreboard = scoreboard; + this->objective = objective; + this->owner = owner; + count = 0; +} + +void Score::add(int count) +{ + //if (objective.getCriteria().isReadOnly()) throw new IllegalStateException("Cannot modify read-only score"); + setScore(getScore() + count); +} + +void Score::remove(int count) +{ + //if (objective.getCriteria().isReadOnly()) throw new IllegalStateException("Cannot modify read-only score"); + setScore(getScore() - count); +} + +void Score::increment() +{ + //if (objective.getCriteria().isReadOnly()) throw new IllegalStateException("Cannot modify read-only score"); + add(1); +} + +void Score::decrement() +{ + //if (objective.getCriteria().isReadOnly()) throw new IllegalStateException("Cannot modify read-only score"); + remove(1); +} + +int Score::getScore() +{ + return count; +} + +void Score::setScore(int score) +{ + int old = count; + count = score; + if (old != score) getScoreboard()->onScoreChanged(this); +} + +Objective *Score::getObjective() +{ + return objective; +} + +wstring Score::getOwner() +{ + return owner; +} + +Scoreboard *Score::getScoreboard() +{ + return scoreboard; +} + +void Score::updateFor(vector > *players) +{ + setScore(objective->getCriteria()->getScoreModifier(players)); +} \ No newline at end of file diff --git a/Minecraft.World/Score.h b/Minecraft.World/Score.h new file mode 100644 index 00000000..2a32f138 --- /dev/null +++ b/Minecraft.World/Score.h @@ -0,0 +1,44 @@ +#pragma once + +class Scoreboard; +class Objective; + +class Score +{ +public: + // 4J Not converted +#if 0 + static final Comparator SCORE_COMPARATOR = new Comparator() { + @Override + public int compare(Score o1, Score o2) { + if (o1.getScore() > o2.getScore()) { + return 1; + } else if (o1.getScore() < o2.getScore()) { + return -1; + } else { + return 0; + } + } + }; +#endif + +private: + Scoreboard *scoreboard; + Objective *objective; + wstring owner; + int count; + +public: + Score(Scoreboard *scoreboard, Objective *objective, const wstring &owner); + + void add(int count); + void remove(int count); + void increment(); + void decrement(); + int getScore(); + void setScore(int score); + Objective *getObjective(); + wstring getOwner(); + Scoreboard *getScoreboard(); + void updateFor(vector > *players); +}; \ No newline at end of file diff --git a/Minecraft.World/ScoreHolder.h b/Minecraft.World/ScoreHolder.h new file mode 100644 index 00000000..72a43de3 --- /dev/null +++ b/Minecraft.World/ScoreHolder.h @@ -0,0 +1,9 @@ +#pragma once + +class Scoreboard; + +class ScoreHolder +{ +public: + virtual Scoreboard *getScoreboard() = 0; +}; \ No newline at end of file diff --git a/Minecraft.World/Scoreboard.cpp b/Minecraft.World/Scoreboard.cpp new file mode 100644 index 00000000..5c6f2ebd --- /dev/null +++ b/Minecraft.World/Scoreboard.cpp @@ -0,0 +1,328 @@ +#include "stdafx.h" + +#include "Scoreboard.h" + +Objective *Scoreboard::getObjective(const wstring &name) +{ + return NULL; + //return objectivesByName.find(name)->second; +} + +Objective *Scoreboard::addObjective(const wstring &name, ObjectiveCriteria *criteria) +{ + return NULL; +// Objective *objective = getObjective(name); +// if (objective != NULL) +// { +//#indef _CONTENT_PACKAGE +// __debugbreak(); +//#endif +// //throw new IllegalArgumentException("An objective with the name '" + name + "' already exists!"); +// } +// +// objective = new Objective(this, name, criteria); +// +// vector *criteriaList = objectivesByCriteria.find(criteria)->second; +// +// if (criteriaList == NULL) +// { +// criteriaList = new vector(); +// objectivesByCriteria[criteria] = criteriaList; +// } +// +// criteriaList->push_back(objective); +// objectivesByName[name] = objective; +// onObjectiveAdded(objective); +// +// return objective; +} + +vector *Scoreboard::findObjectiveFor(ObjectiveCriteria *criteria) +{ + return NULL; + //vector *objectives = objectivesByCriteria.find(criteria)->second; + + //return objectives == NULL ? new vector() : new vector(objectives); +} + +Score *Scoreboard::getPlayerScore(const wstring &name, Objective *objective) +{ + return NULL; + //unordered_map *scores = playerScores.find(name)->it; + + //if (scores == NULL) + //{ + // scores = new unordered_map(); + // playerScores.put(name, scores); + //} + + //Score *score = scores->get(objective); + + //if (score == NULL) + //{ + // score = new Score(this, objective, name); + // scores->put(objective, score); + //} + + //return score; +} + +vector *Scoreboard::getPlayerScores(Objective *objective) +{ + return NULL; + //vector *result = new vector(); + + //for (Map scores : playerScores.values()) + //{ + // Score score = scores.get(objective); + // if (score != null) result.add(score); + //} + + //Collections.sort(result, Score.SCORE_COMPARATOR); + + //return result; +} + +vector *Scoreboard::getObjectives() +{ + return NULL; + //return objectivesByName.values(); +} + +vector *Scoreboard::getTrackedPlayers() +{ + return NULL; + //return playerScores.keySet(); +} + +void Scoreboard::resetPlayerScore(const wstring &player) +{ + //unordered_map *removed = playerScores.remove(player); + + //if (removed != NULL) + //{ + // onPlayerRemoved(player); + //} +} + +vector *Scoreboard::getScores() +{ + return NULL; + //Collection> values = playerScores.values(); + //List result = new ArrayList(); + + //for (Map map : values) + //{ + // result.addAll(map.values()); + //} + + //return result; +} + +vector *Scoreboard::getScores(Objective *objective) +{ + return NULL; + //Collection> values = playerScores.values(); + //List result = new ArrayList(); + + //for (Map map : values) { + // Score score = map.get(objective); + // if (score != null) result.add(score); + //} + + //return result; +} + +unordered_map *Scoreboard::getPlayerScores(const wstring &player) +{ + return NULL; + //Map result = playerScores.get(player); + //if (result == null) result = new HashMap(); + //return result; +} + +void Scoreboard::removeObjective(Objective *objective) +{ + //objectivesByName.remove(objective.getName()); + + //for (int i = 0; i < DISPLAY_SLOTS; i++) { + // if (getDisplayObjective(i) == objective) setDisplayObjective(i, null); + //} + + //List objectives = objectivesByCriteria.get(objective.getCriteria()); + //if (objectives != null) objectives.remove(objective); + + //for (Map objectiveScoreMap : playerScores.values()) { + // objectiveScoreMap.remove(objective); + //} + + //onObjectiveRemoved(objective); +} + +void Scoreboard::setDisplayObjective(int slot, Objective *objective) +{ + //displayObjectives[slot] = objective; +} + +Objective *Scoreboard::getDisplayObjective(int slot) +{ + return NULL; + //return displayObjectives[slot]; +} + +PlayerTeam *Scoreboard::getPlayerTeam(const wstring &name) +{ + return NULL; + //return teamsByName.get(name); +} + +PlayerTeam *Scoreboard::addPlayerTeam(const wstring &name) +{ + return NULL; + //PlayerTeam team = getPlayerTeam(name); + //if (team != null) throw new IllegalArgumentException("An objective with the name '" + name + "' already exists!"); + + //team = new PlayerTeam(this, name); + //teamsByName.put(name, team); + //onTeamAdded(team); + + //return team; +} + +void Scoreboard::removePlayerTeam(PlayerTeam *team) +{ + //teamsByName.remove(team.getName()); + + //// [TODO]: Loop through scores, remove. + + //for (String player : team.getPlayers()) { + // teamsByPlayer.remove(player); + //} + + //onTeamRemoved(team); +} + +void Scoreboard::addPlayerToTeam(const wstring &player, PlayerTeam *team) +{ + //if (getPlayersTeam(player) != null) { + // removePlayerFromTeam(player); + //} + + //teamsByPlayer.put(player, team); + //team.getPlayers().add(player); +} + +bool Scoreboard::removePlayerFromTeam(const wstring &player) +{ + return false; + //PlayerTeam team = getPlayersTeam(player); + + //if (team != null) { + // removePlayerFromTeam(player, team); + // return true; + //} else { + // return false; + //} +} + +void Scoreboard::removePlayerFromTeam(const wstring &player, PlayerTeam *team) +{ + //if (getPlayersTeam(player) != team) { + // throw new IllegalStateException("Player is either on another team or not on any team. Cannot remove from team '" + team.getName() + "'."); + //} + + //teamsByPlayer.remove(player); + //team.getPlayers().remove(player); +} + +vector *Scoreboard::getTeamNames() +{ + return NULL; + //return teamsByName.keySet(); +} + +vector *Scoreboard::getPlayerTeams() +{ + return NULL; + //return teamsByName.values(); +} + +shared_ptr Scoreboard::getPlayer(const wstring &name) +{ + return nullptr; + //return MinecraftServer.getInstance().getPlayers().getPlayer(name); +} + +PlayerTeam *Scoreboard::getPlayersTeam(const wstring &name) +{ + return NULL; + //return teamsByPlayer.get(name); +} + +void Scoreboard::onObjectiveAdded(Objective *objective) +{ +} + +void Scoreboard::onObjectiveChanged(Objective *objective) +{ +} + +void Scoreboard::onObjectiveRemoved(Objective *objective) +{ +} + +void Scoreboard::onScoreChanged(Score *score) +{ +} + +void Scoreboard::onPlayerRemoved(const wstring &player) +{ +} + +void Scoreboard::onTeamAdded(PlayerTeam *team) +{ +} + +void Scoreboard::onTeamChanged(PlayerTeam *team) +{ +} + +void Scoreboard::onTeamRemoved(PlayerTeam *team) +{ +} + +wstring Scoreboard::getDisplaySlotName(int slot) +{ + switch (slot) + { + case DISPLAY_SLOT_LIST: + return L"list"; + case DISPLAY_SLOT_SIDEBAR: + return L"sidebar"; + case DISPLAY_SLOT_BELOW_NAME: + return L"belowName"; + default: + return L""; + } +} + +int Scoreboard::getDisplaySlotByName(const wstring &name) +{ + return -1; + //if (name.equalsIgnoreCase("list")) + //{ + // return DISPLAY_SLOT_LIST; + //} + //else if (name.equalsIgnoreCase("sidebar")) + //{ + // return DISPLAY_SLOT_SIDEBAR; + //} + //else if (name.equalsIgnoreCase("belowName")) + //{ + // return DISPLAY_SLOT_BELOW_NAME; + //} + //else + //{ + // return -1; + //} +} \ No newline at end of file diff --git a/Minecraft.World/Scoreboard.h b/Minecraft.World/Scoreboard.h new file mode 100644 index 00000000..13168f0b --- /dev/null +++ b/Minecraft.World/Scoreboard.h @@ -0,0 +1,59 @@ +#pragma once + +class Objective; +class ObjectiveCriteria; +class PlayerTeam; +class Score; + +class Scoreboard +{ +public: + static const int DISPLAY_SLOT_LIST = 0; + static const int DISPLAY_SLOT_SIDEBAR = 1; + static const int DISPLAY_SLOT_BELOW_NAME = 2; + static const int DISPLAY_SLOTS = 3; + +private: + unordered_map objectivesByName; + unordered_map *> objectivesByCriteria; + unordered_map > playerScores; + Objective *displayObjectives[DISPLAY_SLOTS]; + unordered_map teamsByName; + unordered_map teamsByPlayer; + +public: + Objective *getObjective(const wstring &name); + Objective *addObjective(const wstring &name, ObjectiveCriteria *criteria); + vector *findObjectiveFor(ObjectiveCriteria *criteria); + Score *getPlayerScore(const wstring &name, Objective *objective); + vector *getPlayerScores(Objective *objective); + vector *getObjectives(); + vector *getTrackedPlayers(); + void resetPlayerScore(const wstring &player); + vector *getScores(); + vector *getScores(Objective *objective); + unordered_map *getPlayerScores(const wstring &player); + void removeObjective(Objective *objective); + void setDisplayObjective(int slot, Objective *objective); + Objective *getDisplayObjective(int slot); + PlayerTeam *getPlayerTeam(const wstring &name); + PlayerTeam *addPlayerTeam(const wstring &name); + void removePlayerTeam(PlayerTeam *team); + void addPlayerToTeam(const wstring &player, PlayerTeam *team); + bool removePlayerFromTeam(const wstring &player); + void removePlayerFromTeam(const wstring &player, PlayerTeam *team); + vector *getTeamNames(); + vector *getPlayerTeams(); + shared_ptr getPlayer(const wstring &name); + PlayerTeam *getPlayersTeam(const wstring &name); + void onObjectiveAdded(Objective *objective); + void onObjectiveChanged(Objective *objective); + void onObjectiveRemoved(Objective *objective); + void onScoreChanged(Score *score); + void onPlayerRemoved(const wstring &player); + void onTeamAdded(PlayerTeam *team); + void onTeamChanged(PlayerTeam *team); + void onTeamRemoved(PlayerTeam *team); + static wstring getDisplaySlotName(int slot); + static int getDisplaySlotByName(const wstring &name); +}; \ No newline at end of file diff --git a/Minecraft.World/ScoreboardSaveData.h b/Minecraft.World/ScoreboardSaveData.h new file mode 100644 index 00000000..4a59b45e --- /dev/null +++ b/Minecraft.World/ScoreboardSaveData.h @@ -0,0 +1,189 @@ +#pragma once + +// 4J Not converted +#if 0 +class ScoreboardSaveData extends SavedData { + public static final String FILE_ID = "scoreboard"; + + private Scoreboard scoreboard; + private CompoundTag delayLoad; + + public ScoreboardSaveData() { + this(FILE_ID); + } + + public ScoreboardSaveData(String id) { + super(id); + } + + public void setScoreboard(Scoreboard scoreboard) { + this.scoreboard = scoreboard; + + if (delayLoad != null) { + load(delayLoad); + } + } + + @Override + public void load(CompoundTag tag) { + if (scoreboard == null) { + delayLoad = tag; + return; + } + + loadObjectives((ListTag) tag.getList("Objectives")); + loadPlayerScores((ListTag) tag.getList("PlayerScores")); + + if (tag.contains("DisplaySlots")) { + loadDisplaySlots(tag.getCompound("DisplaySlots")); + } + + if (tag.contains("Teams")) { + loadTeams((ListTag) tag.getList("Teams")); + } + } + + protected void loadTeams(ListTag list) { + for (int i = 0; i < list.size(); i++) { + CompoundTag tag = list.get(i); + + PlayerTeam team = scoreboard.addPlayerTeam(tag.getString("Name")); + team.setDisplayName(tag.getString("DisplayName")); + team.setPrefix(tag.getString("Prefix")); + team.setSuffix(tag.getString("Suffix")); + if (tag.contains("AllowFriendlyFire")) team.setAllowFriendlyFire(tag.getBoolean("AllowFriendlyFire")); + if (tag.contains("SeeFriendlyInvisibles")) team.setSeeFriendlyInvisibles(tag.getBoolean("SeeFriendlyInvisibles")); + + loadTeamPlayers(team, (ListTag) tag.getList("Players")); + } + } + + protected void loadTeamPlayers(PlayerTeam team, ListTag list) { + for (int i = 0; i < list.size(); i++) { + scoreboard.addPlayerToTeam(list.get(i).data, team); + } + } + + protected void loadDisplaySlots(CompoundTag tag) { + for (int i = 0; i < Scoreboard.DISPLAY_SLOTS; i++) { + if (tag.contains("slot_" + i)) { + String name = tag.getString("slot_" + i); + Objective objective = scoreboard.getObjective(name); + scoreboard.setDisplayObjective(i, objective); + } + } + } + + protected void loadObjectives(ListTag list) { + for (int i = 0; i < list.size(); i++) { + CompoundTag tag = list.get(i); + + ObjectiveCriteria criteria = ObjectiveCriteria.CRITERIA_BY_NAME.get(tag.getString("CriteriaName")); + Objective objective = scoreboard.addObjective(tag.getString("Name"), criteria); + objective.setDisplayName(tag.getString("DisplayName")); + } + } + + protected void loadPlayerScores(ListTag list) { + for (int i = 0; i < list.size(); i++) { + CompoundTag tag = list.get(i); + + Objective objective = scoreboard.getObjective(tag.getString("Objective")); + Score score = scoreboard.getPlayerScore(tag.getString("Name"), objective); + score.setScore(tag.getInt("Score")); + } + } + + @Override + public void save(CompoundTag tag) { + if (scoreboard == null) { + MinecraftServer.getInstance().getLogger().warning("Tried to save scoreboard without having a scoreboard..."); + return; + } + + tag.put("Objectives", saveObjectives()); + tag.put("PlayerScores", savePlayerScores()); + tag.put("Teams", saveTeams()); + + saveDisplaySlots(tag); + } + + protected ListTag saveTeams() { + ListTag list = new ListTag(); + Collection teams = scoreboard.getPlayerTeams(); + + for (PlayerTeam team : teams) { + CompoundTag tag = new CompoundTag(); + + tag.putString("Name", team.getName()); + tag.putString("DisplayName", team.getDisplayName()); + tag.putString("Prefix", team.getPrefix()); + tag.putString("Suffix", team.getSuffix()); + tag.putBoolean("AllowFriendlyFire", team.isAllowFriendlyFire()); + tag.putBoolean("SeeFriendlyInvisibles", team.canSeeFriendlyInvisibles()); + + ListTag playerList = new ListTag(); + + for (String player : team.getPlayers()) { + playerList.add(new StringTag("", player)); + } + + tag.put("Players", playerList); + + list.add(tag); + } + + return list; + } + + protected void saveDisplaySlots(CompoundTag tag) { + CompoundTag slots = new CompoundTag(); + boolean hasDisplaySlot = false; + + for (int i = 0; i < Scoreboard.DISPLAY_SLOTS; i++) { + Objective objective = scoreboard.getDisplayObjective(i); + + if (objective != null) { + slots.putString("slot_" + i, objective.getName()); + hasDisplaySlot = true; + } + } + + if (hasDisplaySlot) tag.putCompound("DisplaySlots", slots); + } + + protected ListTag saveObjectives() { + ListTag list = new ListTag(); + Collection objectives = scoreboard.getObjectives(); + + for (Objective objective : objectives) { + CompoundTag tag = new CompoundTag(); + + tag.putString("Name", objective.getName()); + tag.putString("CriteriaName", objective.getCriteria().getName()); + tag.putString("DisplayName", objective.getDisplayName()); + + list.add(tag); + } + + return list; + } + + protected ListTag savePlayerScores() { + ListTag list = new ListTag(); + Collection scores = scoreboard.getScores(); + + for (Score score : scores) { + CompoundTag tag = new CompoundTag(); + + tag.putString("Name", score.getOwner()); + tag.putString("Objective", score.getObjective().getName()); + tag.putInt("Score", score.getScore()); + + list.add(tag); + } + + return list; + } +}; +#endif \ No newline at end of file diff --git a/Minecraft.World/SeedFoodItem.cpp b/Minecraft.World/SeedFoodItem.cpp index 4ba9a14a..8f5bfa92 100644 --- a/Minecraft.World/SeedFoodItem.cpp +++ b/Minecraft.World/SeedFoodItem.cpp @@ -15,14 +15,14 @@ bool SeedFoodItem::useOn(shared_ptr instance, shared_ptr p { if (face != Facing::UP) return false; - if (!player->mayBuild(x, y, z) || !player->mayBuild(x, y + 1, z)) return false; + if (!player->mayUseItemAt(x, y, z, face, instance) || !player->mayUseItemAt(x, y + 1, z, face, instance)) return false; int targetType = level->getTile(x, y, z); if (targetType == targetLand && level->isEmptyTile(x, y + 1, z)) { if(!bTestUseOnOnly) { - level->setTile(x, y + 1, z, resultId); + level->setTileAndUpdate(x, y + 1, z, resultId); instance->count--; } return true; diff --git a/Minecraft.World/SeedItem.cpp b/Minecraft.World/SeedItem.cpp index 7a5ac1b8..87211d8b 100644 --- a/Minecraft.World/SeedItem.cpp +++ b/Minecraft.World/SeedItem.cpp @@ -10,27 +10,27 @@ using namespace std; SeedItem::SeedItem(int id, int resultId, int targetLand) : Item(id) { - this->resultId = resultId; + this->resultId = resultId; this->targetLand = targetLand; } bool SeedItem::useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { // 4J-PB - Adding a test only version to allow tooltips to be displayed - if (face != 1) return false; + if (face != 1) return false; - if (!player->mayBuild(x, y, z) || !player->mayBuild(x, y + 1, z)) return false; + if (!player->mayUseItemAt(x, y, z, face, instance) || !player->mayUseItemAt(x, y + 1, z, face, instance)) return false; - int targetType = level->getTile(x, y, z); + int targetType = level->getTile(x, y, z); - if (targetType == targetLand && level->isEmptyTile(x, y + 1, z)) + if (targetType == targetLand && level->isEmptyTile(x, y + 1, z)) { if(!bTestUseOnOnly) { - level->setTile(x, y + 1, z, resultId); + level->setTileAndUpdate(x, y + 1, z, resultId); instance->count--; } - return true; - } - return false; + return true; + } + return false; } \ No newline at end of file diff --git a/Minecraft.World/ServersideAttributeMap.cpp b/Minecraft.World/ServersideAttributeMap.cpp new file mode 100644 index 00000000..ec75aa22 --- /dev/null +++ b/Minecraft.World/ServersideAttributeMap.cpp @@ -0,0 +1,83 @@ +#include "stdafx.h" + +#include "Attribute.h" +#include "RangedAttribute.h" +#include "AttributeInstance.h" +#include "ModifiableAttributeInstance.h" +#include "ServersideAttributeMap.h" + +AttributeInstance *ServersideAttributeMap::getInstance(Attribute *attribute) +{ + return BaseAttributeMap::getInstance(attribute); +} + +AttributeInstance *ServersideAttributeMap::getInstance(eATTRIBUTE_ID id) +{ + AttributeInstance *result = BaseAttributeMap::getInstance(id); + + // 4J: Removed legacy name + // If we didn't find it, search by legacy name + /*if (result == NULL) + { + AUTO_VAR(it, attributesByLegacy.find(name)); + if(it != attributesByLegacy.end()) + { + result = it->second; + } + }*/ + + return result; +} + +AttributeInstance *ServersideAttributeMap::registerAttribute(Attribute *attribute) +{ + AUTO_VAR(it,attributesById.find(attribute->getId())); + if (it != attributesById.end()) + { + return it->second; + } + + AttributeInstance *instance = new ModifiableAttributeInstance(this, attribute); + attributesById.insert(std::pair(attribute->getId(), instance)); + + // 4J: Removed legacy name + // If this is a ranged attribute also add to legacy name map + /*RangedAttribute *rangedAttribute = dynamic_cast(attribute); + if (rangedAttribute != NULL && rangedAttribute->getImportLegacyName() != L"") + { + attributesByLegacy.insert(std::pair(rangedAttribute->getImportLegacyName(), instance)); + }*/ + + return instance; +} + +void ServersideAttributeMap::onAttributeModified(ModifiableAttributeInstance *attributeInstance) +{ + if (attributeInstance->getAttribute()->isClientSyncable()) + { + dirtyAttributes.insert(attributeInstance); + } +} + +unordered_set *ServersideAttributeMap::getDirtyAttributes() +{ + return &dirtyAttributes; +} + +unordered_set *ServersideAttributeMap::getSyncableAttributes() +{ + unordered_set *result = new unordered_set(); + vector atts; + getAttributes(atts); + for (int i = 0; i < atts.size(); i++) + { + AttributeInstance *instance = atts.at(i); + + if (instance->getAttribute()->isClientSyncable()) + { + result->insert(instance); + } + } + + return result; +} \ No newline at end of file diff --git a/Minecraft.World/ServersideAttributeMap.h b/Minecraft.World/ServersideAttributeMap.h new file mode 100644 index 00000000..b404eb9e --- /dev/null +++ b/Minecraft.World/ServersideAttributeMap.h @@ -0,0 +1,24 @@ +#pragma once + +#include "BaseAttributeMap.h" + +class ServersideAttributeMap : public BaseAttributeMap +{ +private: + unordered_set dirtyAttributes; + +protected: + // 4J: Remove legacy name + //unordered_map attributesByLegacy; + +public: + + // 4J-JEV: Changed from ModifiableAttributeInstance to AttributeInstance as they are not 'covariant' on PS4. + virtual AttributeInstance *getInstance(Attribute *attribute); + virtual AttributeInstance *getInstance(eATTRIBUTE_ID id); + + virtual AttributeInstance *registerAttribute(Attribute *attribute); + virtual void onAttributeModified(ModifiableAttributeInstance *attributeInstance); + virtual unordered_set *getDirtyAttributes(); + virtual unordered_set *getSyncableAttributes(); +}; \ No newline at end of file diff --git a/Minecraft.World/SetDisplayObjectivePacket.cpp b/Minecraft.World/SetDisplayObjectivePacket.cpp new file mode 100644 index 00000000..f1cffa4b --- /dev/null +++ b/Minecraft.World/SetDisplayObjectivePacket.cpp @@ -0,0 +1,46 @@ +#include "stdafx.h" +#include "PacketListener.h" +#include "net.minecraft.world.scores.h" +#include "SetDisplayObjectivePacket.h" + +SetDisplayObjectivePacket::SetDisplayObjectivePacket() +{ + slot = 0; + objectiveName = L""; +} + +SetDisplayObjectivePacket::SetDisplayObjectivePacket(int slot, Objective *objective) +{ + this->slot = slot; + + if (objective == NULL) + { + objectiveName = L""; + } + else + { + objectiveName = objective->getName(); + } +} + +void SetDisplayObjectivePacket::read(DataInputStream *dis) +{ + slot = dis->readByte(); + objectiveName = readUtf(dis, Objective::MAX_NAME_LENGTH); +} + +void SetDisplayObjectivePacket::write(DataOutputStream *dos) +{ + dos->writeByte(slot); + writeUtf(objectiveName, dos); +} + +void SetDisplayObjectivePacket::handle(PacketListener *listener) +{ + listener->handleSetDisplayObjective(shared_from_this()); +} + +int SetDisplayObjectivePacket::getEstimatedSize() +{ + return 1 + 2 + objectiveName.length(); +} \ No newline at end of file diff --git a/Minecraft.World/SetDisplayObjectivePacket.h b/Minecraft.World/SetDisplayObjectivePacket.h new file mode 100644 index 00000000..f32f6386 --- /dev/null +++ b/Minecraft.World/SetDisplayObjectivePacket.h @@ -0,0 +1,24 @@ +#pragma once + +#include "Packet.h" + +class Objective; + +class SetDisplayObjectivePacket : public Packet, public enable_shared_from_this +{ +public: + int slot; + wstring objectiveName; + + SetDisplayObjectivePacket(); + SetDisplayObjectivePacket(int slot, Objective *objective); + + void read(DataInputStream *dis); + void write(DataOutputStream *dos); + void handle(PacketListener *listener); + int getEstimatedSize(); + +public: + static shared_ptr create() { return shared_ptr(new SetDisplayObjectivePacket()); } + virtual int getId() { return 208; } +}; \ No newline at end of file diff --git a/Minecraft.World/SetEntityDataPacket.cpp b/Minecraft.World/SetEntityDataPacket.cpp index 1538c152..9947c163 100644 --- a/Minecraft.World/SetEntityDataPacket.cpp +++ b/Minecraft.World/SetEntityDataPacket.cpp @@ -53,11 +53,6 @@ int SetEntityDataPacket::getEstimatedSize() return 5; } -bool SetEntityDataPacket::isAync() -{ - return true; -} - vector > *SetEntityDataPacket::getUnpackedData() { return packedItems; diff --git a/Minecraft.World/SetEntityDataPacket.h b/Minecraft.World/SetEntityDataPacket.h index 1b31aa4c..a3bb0860 100644 --- a/Minecraft.World/SetEntityDataPacket.h +++ b/Minecraft.World/SetEntityDataPacket.h @@ -21,7 +21,6 @@ public: virtual void write(DataOutputStream *dos); virtual void handle(PacketListener *listener); virtual int getEstimatedSize(); - virtual bool isAync(); vector > *getUnpackedData(); diff --git a/Minecraft.World/SetEntityLinkPacket.cpp b/Minecraft.World/SetEntityLinkPacket.cpp new file mode 100644 index 00000000..cae35e48 --- /dev/null +++ b/Minecraft.World/SetEntityLinkPacket.cpp @@ -0,0 +1,57 @@ +#include "stdafx.h" +#include +#include "InputOutputStream.h" +#include "PacketListener.h" +#include "net.minecraft.world.entity.h" +#include "SetEntityLinkPacket.h" + + + +SetEntityLinkPacket::SetEntityLinkPacket() +{ + sourceId = -1; + destId = -1; + type = -1; +} + +SetEntityLinkPacket::SetEntityLinkPacket(int linkType, shared_ptr sourceEntity, shared_ptr destEntity) +{ + type = linkType; + this->sourceId = sourceEntity->entityId; + this->destId = destEntity != NULL ? destEntity->entityId : -1; +} + +int SetEntityLinkPacket::getEstimatedSize() +{ + return 8; +} + +void SetEntityLinkPacket::read(DataInputStream *dis) //throws IOException +{ + sourceId = dis->readInt(); + destId = dis->readInt(); + type = dis->readUnsignedByte(); +} + +void SetEntityLinkPacket::write(DataOutputStream *dos) //throws IOException +{ + dos->writeInt(sourceId); + dos->writeInt(destId); + dos->writeByte(type); +} + +void SetEntityLinkPacket::handle(PacketListener *listener) +{ + listener->handleEntityLinkPacket(shared_from_this()); +} + +bool SetEntityLinkPacket::canBeInvalidated() +{ + return true; +} + +bool SetEntityLinkPacket::isInvalidatedBy(shared_ptr packet) +{ + shared_ptr target = dynamic_pointer_cast(packet); + return target->sourceId == sourceId; +} diff --git a/Minecraft.World/SetEntityLinkPacket.h b/Minecraft.World/SetEntityLinkPacket.h new file mode 100644 index 00000000..aa92206d --- /dev/null +++ b/Minecraft.World/SetEntityLinkPacket.h @@ -0,0 +1,29 @@ +#pragma once +using namespace std; + +#include "Packet.h" + +class SetEntityLinkPacket : public Packet, public enable_shared_from_this +{ +public: + static const int RIDING = 0; + static const int LEASH = 1; + + int type; + int sourceId, destId; + + SetEntityLinkPacket(); + SetEntityLinkPacket(int linkType, shared_ptr sourceEntity, shared_ptr destEntity); + + virtual int getEstimatedSize(); + virtual void read(DataInputStream *dis); + virtual void write(DataOutputStream *dos); + virtual void handle(PacketListener *listener); + virtual bool canBeInvalidated(); + virtual bool isInvalidatedBy(shared_ptr packet); + +public: + static shared_ptr create() { return shared_ptr(new SetEntityLinkPacket()); } + virtual int getId() { return 39; } + +}; \ No newline at end of file diff --git a/Minecraft.World/SetExperiencePacket.cpp b/Minecraft.World/SetExperiencePacket.cpp index ffe90a67..c5d84b21 100644 --- a/Minecraft.World/SetExperiencePacket.cpp +++ b/Minecraft.World/SetExperiencePacket.cpp @@ -49,11 +49,6 @@ bool SetExperiencePacket::canBeInvalidated() } bool SetExperiencePacket::isInvalidatedBy(shared_ptr packet) -{ - return true; -} - -bool SetExperiencePacket::isAync() { return true; } \ No newline at end of file diff --git a/Minecraft.World/SetExperiencePacket.h b/Minecraft.World/SetExperiencePacket.h index 499b7efd..01c0ed46 100644 --- a/Minecraft.World/SetExperiencePacket.h +++ b/Minecraft.World/SetExperiencePacket.h @@ -18,7 +18,6 @@ public: virtual int getEstimatedSize(); virtual bool canBeInvalidated(); virtual bool isInvalidatedBy(shared_ptr packet); - virtual bool isAync(); public: static shared_ptr create() { return shared_ptr(new SetExperiencePacket()); } diff --git a/Minecraft.World/SetHealthPacket.cpp b/Minecraft.World/SetHealthPacket.cpp index 55d7ccc3..639cacd8 100644 --- a/Minecraft.World/SetHealthPacket.cpp +++ b/Minecraft.World/SetHealthPacket.cpp @@ -8,14 +8,14 @@ SetHealthPacket::SetHealthPacket() { - this->health = 0; + this->health = 0.0f; this->food = 0; this->saturation = 0; this->damageSource = eTelemetryChallenges_Unknown; } -SetHealthPacket::SetHealthPacket(int health, int food, float saturation, ETelemetryChallenges damageSource) +SetHealthPacket::SetHealthPacket(float health, int food, float saturation, ETelemetryChallenges damageSource) { this->health = health; this->food = food; @@ -27,7 +27,7 @@ SetHealthPacket::SetHealthPacket(int health, int food, float saturation, ETeleme void SetHealthPacket::read(DataInputStream *dis) //throws IOException { - health = dis->readShort(); + health = dis->readFloat(); food = dis->readShort(); saturation = dis->readFloat(); // exhaustion = dis.readFloat(); @@ -37,7 +37,7 @@ void SetHealthPacket::read(DataInputStream *dis) //throws IOException void SetHealthPacket::write(DataOutputStream *dos) //throws IOException { - dos->writeShort(health); + dos->writeFloat(health); dos->writeShort(food); dos->writeFloat(saturation); // dos.writeFloat(exhaustion); @@ -52,7 +52,7 @@ void SetHealthPacket::handle(PacketListener *listener) int SetHealthPacket::getEstimatedSize() { - return 9; + return 11; } bool SetHealthPacket::canBeInvalidated() diff --git a/Minecraft.World/SetHealthPacket.h b/Minecraft.World/SetHealthPacket.h index de8f4cb9..4704f220 100644 --- a/Minecraft.World/SetHealthPacket.h +++ b/Minecraft.World/SetHealthPacket.h @@ -6,15 +6,14 @@ using namespace std; class SetHealthPacket : public Packet, public enable_shared_from_this { public: - int health; + float health; int food; float saturation; - // public float exhaustion; // 4J - Original comment ETelemetryChallenges damageSource; // 4J Added SetHealthPacket(); - SetHealthPacket(int health, int food, float saturation, ETelemetryChallenges damageSource); + SetHealthPacket(float health, int food, float saturation, ETelemetryChallenges damageSource); virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); diff --git a/Minecraft.World/SetObjectivePacket.cpp b/Minecraft.World/SetObjectivePacket.cpp new file mode 100644 index 00000000..7e656967 --- /dev/null +++ b/Minecraft.World/SetObjectivePacket.cpp @@ -0,0 +1,42 @@ +#include "stdafx.h" +#include "net.minecraft.world.scores.h" +#include "PacketListener.h" +#include "SetObjectivePacket.h" + +SetObjectivePacket::SetObjectivePacket() +{ + objectiveName = L""; + displayName = L""; + method = 0; +} + +SetObjectivePacket::SetObjectivePacket(Objective *objective, int method) +{ + objectiveName = objective->getName(); + displayName = objective->getDisplayName(); + this->method = method; +} + +void SetObjectivePacket::read(DataInputStream *dis) +{ + objectiveName = readUtf(dis, Objective::MAX_NAME_LENGTH); + displayName = readUtf(dis, Objective::MAX_DISPLAY_NAME_LENGTH); + method = dis->readByte(); +} + +void SetObjectivePacket::write(DataOutputStream *dos) +{ + writeUtf(objectiveName, dos); + writeUtf(displayName, dos); + dos->writeByte(method); +} + +void SetObjectivePacket::handle(PacketListener *listener) +{ + listener->handleAddObjective(shared_from_this()); +} + +int SetObjectivePacket::getEstimatedSize() +{ + return 2 + objectiveName.length() + 2 + displayName.length() + 1; +} \ No newline at end of file diff --git a/Minecraft.World/SetObjectivePacket.h b/Minecraft.World/SetObjectivePacket.h new file mode 100644 index 00000000..5b5dfc6f --- /dev/null +++ b/Minecraft.World/SetObjectivePacket.h @@ -0,0 +1,28 @@ +#pragma once + +#include "Packet.h" + +class Objective; + +class SetObjectivePacket : public Packet, public enable_shared_from_this +{ +public: + static const int METHOD_ADD = 0; + static const int METHOD_REMOVE = 1; + static const int METHOD_CHANGE = 2; + + wstring objectiveName; + wstring displayName; + int method; + + SetObjectivePacket(); + SetObjectivePacket(Objective *objective, int method); + void read(DataInputStream *dis); + void write(DataOutputStream *dos); + void handle(PacketListener *listener); + int getEstimatedSize(); + +public: + static shared_ptr create() { return shared_ptr(new SetObjectivePacket()); } + virtual int getId() { return 206; } +}; \ No newline at end of file diff --git a/Minecraft.World/SetPlayerTeamPacket.cpp b/Minecraft.World/SetPlayerTeamPacket.cpp new file mode 100644 index 00000000..8c605784 --- /dev/null +++ b/Minecraft.World/SetPlayerTeamPacket.cpp @@ -0,0 +1,114 @@ +#include "stdafx.h" +#include "net.minecraft.world.scores.h" +#include "net.minecraft.world.entity.player.h" +#include "PacketListener.h" +#include "SetPlayerTeamPacket.h" + +SetPlayerTeamPacket::SetPlayerTeamPacket() +{ + name = L""; + displayName = L""; + prefix = L""; + suffix = L""; + method = 0; + options = 0; +} + +SetPlayerTeamPacket::SetPlayerTeamPacket(PlayerTeam *team, int method) +{ + name = team->getName(); + this->method = method; + + if (method == METHOD_ADD || method == METHOD_CHANGE) + { + displayName = team->getDisplayName(); + prefix = team->getPrefix(); + suffix = team->getSuffix(); + options = team->packOptions(); + } + if (method == METHOD_ADD) + { + unordered_set *playerNames = team->getPlayers(); + players.insert(players.end(), playerNames->begin(), playerNames->end()); + } +} + +SetPlayerTeamPacket::SetPlayerTeamPacket(PlayerTeam *team, vector *playerNames, int method) +{ + if (method != METHOD_JOIN && method != METHOD_LEAVE) + { + app.DebugPrintf("Method must be join or leave for player constructor"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + } + if (playerNames == NULL || playerNames->empty()) + { + app.DebugPrintf("Players cannot be null/empty"); +#ifndef _CONTENT_PACKAGE + __debugbreak(); +#endif + } + + this->method = method; + name = team->getName(); + this->players.insert(players.end(), playerNames->begin(), playerNames->end()); +} + +void SetPlayerTeamPacket::read(DataInputStream *dis) +{ + name = readUtf(dis, Objective::MAX_NAME_LENGTH); + method = dis->readByte(); + + if (method == METHOD_ADD || method == METHOD_CHANGE) + { + displayName = readUtf(dis, PlayerTeam::MAX_DISPLAY_NAME_LENGTH); + prefix = readUtf(dis, PlayerTeam::MAX_PREFIX_LENGTH); + suffix = readUtf(dis, PlayerTeam::MAX_SUFFIX_LENGTH); + options = dis->readByte(); + } + + if (method == METHOD_ADD || method == METHOD_JOIN || method == METHOD_LEAVE) + { + int count = dis->readShort(); + + for (int i = 0; i < count; i++) + { + players.push_back(readUtf(dis, Player::MAX_NAME_LENGTH)); + } + } +} + +void SetPlayerTeamPacket::write(DataOutputStream *dos) +{ + writeUtf(name, dos); + dos->writeByte(method); + + if (method == METHOD_ADD || method == METHOD_CHANGE) + { + writeUtf(displayName, dos); + writeUtf(prefix, dos); + writeUtf(suffix, dos); + dos->writeByte(options); + } + + if (method == METHOD_ADD || method == METHOD_JOIN || method == METHOD_LEAVE) + { + dos->writeShort(players.size()); + + for (AUTO_VAR(it,players.begin()); it != players.end(); ++it) + { + writeUtf(*it, dos); + } + } +} + +void SetPlayerTeamPacket::handle(PacketListener *listener) +{ + listener->handleSetPlayerTeamPacket(shared_from_this()); +} + +int SetPlayerTeamPacket::getEstimatedSize() +{ + return 1 + 2 + name.length(); +} \ No newline at end of file diff --git a/Minecraft.World/SetPlayerTeamPacket.h b/Minecraft.World/SetPlayerTeamPacket.h new file mode 100644 index 00000000..f6df9da2 --- /dev/null +++ b/Minecraft.World/SetPlayerTeamPacket.h @@ -0,0 +1,35 @@ +#pragma once + +#include "Packet.h" + +class PlayerTeam; + +class SetPlayerTeamPacket : public Packet , public enable_shared_from_this +{ +public: + static const int METHOD_ADD = 0; + static const int METHOD_REMOVE = 1; + static const int METHOD_CHANGE = 2; + static const int METHOD_JOIN = 3; + static const int METHOD_LEAVE = 4; + + wstring name; + wstring displayName; + wstring prefix; + wstring suffix; + vector players; + int method; + int options; + + SetPlayerTeamPacket(); + SetPlayerTeamPacket(PlayerTeam *team, int method); + SetPlayerTeamPacket(PlayerTeam *team, vector *players, int method); + void read(DataInputStream *dis); + void write(DataOutputStream *dos); + void handle(PacketListener *listener); + int getEstimatedSize(); + +public: + static shared_ptr create() { return shared_ptr(new SetPlayerTeamPacket()); } + virtual int getId() { return 209; } +}; \ No newline at end of file diff --git a/Minecraft.World/SetPlayerTimeoutCommand.h b/Minecraft.World/SetPlayerTimeoutCommand.h new file mode 100644 index 00000000..4bc83e66 --- /dev/null +++ b/Minecraft.World/SetPlayerTimeoutCommand.h @@ -0,0 +1,36 @@ +/* +package net.minecraft.commands.common; + +import net.minecraft.commands.BaseCommand; +import net.minecraft.commands.CommandSender; +import net.minecraft.commands.exceptions.UsageException; +import net.minecraft.server.MinecraftServer; + +public class SetPlayerTimeoutCommand extends BaseCommand { + public String getName() { + return "setidletimeout"; + } + + @Override + public int getPermissionLevel() { + return LEVEL_ADMINS; + } + + @Override + public String getUsage(CommandSender source) { + return "commands.setidletimeout.usage"; + } + + public void execute(CommandSender source, String[] args) { + if (args.length == 1) { + int timeout = convertArgToInt(source, args[0], 0); + MinecraftServer.getInstance().setPlayerIdleTimeout(timeout); + logAdminAction(source, "commands.setidletimeout.success", timeout); + return; + } + + throw new UsageException("commands.setidletimeout.usage"); + } +} + +*/ \ No newline at end of file diff --git a/Minecraft.World/SetScorePacket.cpp b/Minecraft.World/SetScorePacket.cpp new file mode 100644 index 00000000..75887eb5 --- /dev/null +++ b/Minecraft.World/SetScorePacket.cpp @@ -0,0 +1,63 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.scores.h" +#include "PacketListener.h" +#include "SetScorePacket.h" + +SetScorePacket::SetScorePacket() +{ + owner = L""; + objectiveName = L""; + score = 0; + method = 0; +} + +SetScorePacket::SetScorePacket(Score *score, int method) +{ + owner = score->getOwner(); + objectiveName = score->getObjective()->getName(); + this->score = score->getScore(); + this->method = method; +} + +SetScorePacket::SetScorePacket(const wstring &owner) +{ + this->owner = owner; + objectiveName = L""; + score = 0; + method = METHOD_REMOVE; +} + +void SetScorePacket::read(DataInputStream *dis) +{ + owner = readUtf(dis, Player::MAX_NAME_LENGTH); + method = dis->readByte(); + + if (method != METHOD_REMOVE) + { + objectiveName = readUtf(dis, Objective::MAX_NAME_LENGTH); + score = dis->readInt(); + } +} + +void SetScorePacket::write(DataOutputStream *dos) +{ + writeUtf(owner, dos); + dos->writeByte(method); + + if (method != METHOD_REMOVE) + { + writeUtf(objectiveName, dos); + dos->writeInt(score); + } +} + +void SetScorePacket::handle(PacketListener *listener) +{ + listener->handleSetScore(shared_from_this()); +} + +int SetScorePacket::getEstimatedSize() +{ + return 2 + (owner.empty() ? 0 : owner.length()) + 2 + (objectiveName.empty() ? 0 : objectiveName.length()) + 4 + 1; +} \ No newline at end of file diff --git a/Minecraft.World/SetScorePacket.h b/Minecraft.World/SetScorePacket.h new file mode 100644 index 00000000..5f800be6 --- /dev/null +++ b/Minecraft.World/SetScorePacket.h @@ -0,0 +1,30 @@ +#pragma once + +#include "Packet.h" + +class Score; + +class SetScorePacket : public Packet , public enable_shared_from_this +{ +public: + static const int METHOD_CHANGE = 0; + static const int METHOD_REMOVE = 1; + + wstring owner; + wstring objectiveName; + int score; + int method; + + SetScorePacket(); + SetScorePacket(Score *score, int method); + SetScorePacket(const wstring &owner); + + void read(DataInputStream *dis); + void write(DataOutputStream *dos); + void handle(PacketListener *listener); + int getEstimatedSize(); + +public: + static shared_ptr create() { return shared_ptr(new SetScorePacket()); } + virtual int getId() { return 207; } +}; \ No newline at end of file diff --git a/Minecraft.World/SetTimePacket.cpp b/Minecraft.World/SetTimePacket.cpp index 2f707970..5936255c 100644 --- a/Minecraft.World/SetTimePacket.cpp +++ b/Minecraft.World/SetTimePacket.cpp @@ -4,26 +4,38 @@ #include "PacketListener.h" #include "SetTimePacket.h" - - SetTimePacket::SetTimePacket() { - time = 0; + gameTime = 0; + dayTime = 0; } -SetTimePacket::SetTimePacket(__int64 time) +SetTimePacket::SetTimePacket(__int64 gameTime, __int64 dayTime, bool tickDayTime) { - this->time = time; + this->gameTime = gameTime; + this->dayTime = dayTime; + + // 4J: We send daylight cycle rule with host options so don't need this + /*if (!tickDayTime) + { + this->dayTime = -this->dayTime; + if (this->dayTime == 0) + { + this->dayTime = -1; + } + }*/ } void SetTimePacket::read(DataInputStream *dis) //throws IOException { - time = dis->readLong(); + gameTime = dis->readLong(); + dayTime = dis->readLong(); } void SetTimePacket::write(DataOutputStream *dos) //throws IOException { - dos->writeLong(time); + dos->writeLong(gameTime); + dos->writeLong(dayTime); } void SetTimePacket::handle(PacketListener *listener) @@ -33,7 +45,7 @@ void SetTimePacket::handle(PacketListener *listener) int SetTimePacket::getEstimatedSize() { - return 8; + return 16; } bool SetTimePacket::canBeInvalidated() diff --git a/Minecraft.World/SetTimePacket.h b/Minecraft.World/SetTimePacket.h index 5b658a0b..7ded9ce1 100644 --- a/Minecraft.World/SetTimePacket.h +++ b/Minecraft.World/SetTimePacket.h @@ -6,10 +6,11 @@ using namespace std; class SetTimePacket : public Packet, public enable_shared_from_this { public: - __int64 time; + __int64 gameTime; + __int64 dayTime; SetTimePacket(); - SetTimePacket(__int64 time); + SetTimePacket(__int64 gameTime, __int64 dayTime, bool tickDayTime); virtual void read(DataInputStream *dis); virtual void write(DataOutputStream *dos); diff --git a/Minecraft.World/SharedConstants.cpp b/Minecraft.World/SharedConstants.cpp index 497822bc..00ff3a05 100644 --- a/Minecraft.World/SharedConstants.cpp +++ b/Minecraft.World/SharedConstants.cpp @@ -3,7 +3,7 @@ #include "InputOutputStream.h" #include "SharedConstants.h" -const wstring SharedConstants::VERSION_STRING = L"1.2.3"; +const wstring SharedConstants::VERSION_STRING = L"1.6.4"; const bool SharedConstants::TEXTURE_LIGHTING = true; wstring SharedConstants::readAcceptableChars() diff --git a/Minecraft.World/SharedConstants.h b/Minecraft.World/SharedConstants.h index bd6dae89..a8924e47 100644 --- a/Minecraft.World/SharedConstants.h +++ b/Minecraft.World/SharedConstants.h @@ -7,7 +7,8 @@ class SharedConstants public: static void staticCtor(); static const wstring VERSION_STRING; - static const int NETWORK_PROTOCOL_VERSION = 39; + static const int NETWORK_PROTOCOL_VERSION = 78; + static const bool INGAME_DEBUG_OUTPUT = false; // NOT texture resolution. How many sub-blocks each block face is made up of. // 4J Added for texture packs diff --git a/Minecraft.World/SharedMonsterAttributes.cpp b/Minecraft.World/SharedMonsterAttributes.cpp new file mode 100644 index 00000000..f434f1e7 --- /dev/null +++ b/Minecraft.World/SharedMonsterAttributes.cpp @@ -0,0 +1,108 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.ai.attributes.h" +#include "BasicTypeContainers.h" +#include "SharedMonsterAttributes.h" + +Attribute *SharedMonsterAttributes::MAX_HEALTH = (new RangedAttribute(eAttributeId_GENERIC_MAXHEALTH, 20, 0, Double::MAX_VALUE))->setSyncable(true); +Attribute *SharedMonsterAttributes::FOLLOW_RANGE = (new RangedAttribute(eAttributeId_GENERIC_FOLLOWRANGE, 32, 0, 2048)); +Attribute *SharedMonsterAttributes::KNOCKBACK_RESISTANCE = (new RangedAttribute(eAttributeId_GENERIC_KNOCKBACKRESISTANCE, 0, 0, 1)); +Attribute *SharedMonsterAttributes::MOVEMENT_SPEED = (new RangedAttribute(eAttributeId_GENERIC_MOVEMENTSPEED, 0.7f, 0, Double::MAX_VALUE))->setSyncable(true); +Attribute *SharedMonsterAttributes::ATTACK_DAMAGE = new RangedAttribute(eAttributeId_GENERIC_ATTACKDAMAGE, 2, 0, Double::MAX_VALUE); + +ListTag *SharedMonsterAttributes::saveAttributes(BaseAttributeMap *attributes) +{ + ListTag *list = new ListTag(); + + vector atts; + attributes->getAttributes(atts); + for (AUTO_VAR(it, atts.begin()); it != atts.end(); ++it) + { + AttributeInstance *attribute = *it; + list->add(saveAttribute(attribute)); + } + + return list; +} + +CompoundTag *SharedMonsterAttributes::saveAttribute(AttributeInstance *instance) +{ + CompoundTag *tag = new CompoundTag(); + Attribute *attribute = instance->getAttribute(); + + tag->putInt(L"ID", attribute->getId()); + tag->putDouble(L"Base", instance->getBaseValue()); + + unordered_set modifiers; + instance->getModifiers(modifiers); + + if (!modifiers.empty()) + { + ListTag *list = new ListTag(); + + for (AUTO_VAR(it,modifiers.begin()); it != modifiers.end(); ++it) + { + AttributeModifier* modifier = *it; + if (modifier->isSerializable()) + { + list->add(saveAttributeModifier(modifier)); + } + } + + tag->put(L"Modifiers", list); + } + + return tag; +} + +CompoundTag *SharedMonsterAttributes::saveAttributeModifier(AttributeModifier *modifier) +{ + CompoundTag *tag = new CompoundTag(); + + tag->putDouble(L"Amount", modifier->getAmount()); + tag->putInt(L"Operation", modifier->getOperation()); + tag->putInt(L"UUID", modifier->getId()); + + return tag; +} + +void SharedMonsterAttributes::loadAttributes(BaseAttributeMap *attributes, ListTag *list) +{ + for (int i = 0; i < list->size(); i++) + { + CompoundTag *tag = list->get(i); + AttributeInstance *instance = attributes->getInstance(static_cast(tag->getInt(L"ID"))); + + if (instance != NULL) + { + loadAttribute(instance, tag); + } + else + { + app.DebugPrintf("Ignoring unknown attribute '%d'", tag->getInt(L"ID") ); + } + } +} + +void SharedMonsterAttributes::loadAttribute(AttributeInstance *instance, CompoundTag *tag) +{ + instance->setBaseValue(tag->getDouble(L"Base")); + + if (tag->contains(L"Modifiers")) + { + ListTag *list = (ListTag *) tag->getList(L"Modifiers"); + + for (int i = 0; i < list->size(); i++) + { + AttributeModifier *modifier = loadAttributeModifier(list->get(i)); + AttributeModifier *old = instance->getModifier(modifier->getId()); + if (old != NULL) instance->removeModifier(old); + instance->addModifier(modifier); + } + } +} + +AttributeModifier *SharedMonsterAttributes::loadAttributeModifier(CompoundTag *tag) +{ + eMODIFIER_ID id = (eMODIFIER_ID)tag->getInt(L"UUID"); + return new AttributeModifier(id, tag->getDouble(L"Amount"), tag->getInt(L"Operation")); +} \ No newline at end of file diff --git a/Minecraft.World/SharedMonsterAttributes.h b/Minecraft.World/SharedMonsterAttributes.h new file mode 100644 index 00000000..7195462e --- /dev/null +++ b/Minecraft.World/SharedMonsterAttributes.h @@ -0,0 +1,26 @@ +#pragma once + +class SharedMonsterAttributes +{ +public: + static Attribute *MAX_HEALTH; + static Attribute *FOLLOW_RANGE; + static Attribute *KNOCKBACK_RESISTANCE; + static Attribute *MOVEMENT_SPEED; + static Attribute *ATTACK_DAMAGE; + + static ListTag *saveAttributes(BaseAttributeMap *attributes); + +private: + static CompoundTag *saveAttribute(AttributeInstance *instance); + static CompoundTag *saveAttributeModifier(AttributeModifier *modifier); + +public: + static void loadAttributes(BaseAttributeMap *attributes, ListTag *list); + +private: + static void loadAttribute(AttributeInstance *instance, CompoundTag *tag); + +public: + static AttributeModifier *loadAttributeModifier(CompoundTag *tag); +}; \ No newline at end of file diff --git a/Minecraft.World/ShearsItem.cpp b/Minecraft.World/ShearsItem.cpp index 7f4d8d51..dd0c2ac7 100644 --- a/Minecraft.World/ShearsItem.cpp +++ b/Minecraft.World/ShearsItem.cpp @@ -9,14 +9,14 @@ ShearsItem::ShearsItem(int itemId) : Item(itemId) setMaxDamage(238); } -bool ShearsItem::mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner) +bool ShearsItem::mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner) { - if (tile == Tile::leaves_Id || tile == Tile::web_Id || tile == Tile::tallgrass_Id || tile == Tile::vine_Id || tile == Tile::tripWire_Id) + if (tile == Tile::leaves_Id || tile == Tile::web_Id || tile == Tile::tallgrass_Id || tile == Tile::vine_Id || tile == Tile::tripWire_Id) { - itemInstance->hurt(1, owner); + itemInstance->hurtAndBreak(1, owner); return true; - } - return Item::mineBlock(itemInstance, level, tile, x, y, z, owner); + } + return Item::mineBlock(itemInstance, level, tile, x, y, z, owner); } bool ShearsItem::canDestroySpecial(Tile *tile) @@ -26,13 +26,13 @@ bool ShearsItem::canDestroySpecial(Tile *tile) float ShearsItem::getDestroySpeed(shared_ptr itemInstance, Tile *tile) { - if (tile->id == Tile::web_Id || tile->id == Tile::leaves_Id) + if (tile->id == Tile::web_Id || tile->id == Tile::leaves_Id) { - return 15; - } - if (tile->id == Tile::cloth_Id) + return 15; + } + if (tile->id == Tile::wool_Id) { - return 5; - } - return Item::getDestroySpeed(itemInstance, tile); + return 5; + } + return Item::getDestroySpeed(itemInstance, tile); } \ No newline at end of file diff --git a/Minecraft.World/ShearsItem.h b/Minecraft.World/ShearsItem.h index 06078645..3bf0c46f 100644 --- a/Minecraft.World/ShearsItem.h +++ b/Minecraft.World/ShearsItem.h @@ -7,7 +7,7 @@ class ShearsItem : public Item { public: ShearsItem(int itemId); - virtual bool mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner); + virtual bool mineBlock(shared_ptr itemInstance, Level *level, int tile, int x, int y, int z, shared_ptr owner); virtual bool canDestroySpecial(Tile *tile); virtual float getDestroySpeed(shared_ptr itemInstance, Tile *tile); }; \ No newline at end of file diff --git a/Minecraft.World/Sheep.cpp b/Minecraft.World/Sheep.cpp index 30eeefcd..32379c2a 100644 --- a/Minecraft.World/Sheep.cpp +++ b/Minecraft.World/Sheep.cpp @@ -1,5 +1,3 @@ -using namespace std; - #include "stdafx.h" #include "com.mojang.nbt.h" #include "net.minecraft.world.level.tile.h" @@ -8,6 +6,7 @@ using namespace std; #include "net.minecraft.world.item.h" #include "net.minecraft.world.item.crafting.h" #include "net.minecraft.world.inventory.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.ai.goal.h" #include "net.minecraft.world.entity.ai.navigation.h" #include "net.minecraft.world.entity.h" @@ -15,12 +14,13 @@ using namespace std; #include "net.minecraft.world.entity.player.h" #include "net.minecraft.world.entity.global.h" #include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.monster.h" #include "Sheep.h" #include "..\Minecraft.Client\Textures.h" #include "MobCategory.h" #include "GenericStats.h" -const float Sheep::COLOR[][3] = +const float Sheep::COLOR[Sheep::COLOR_LENGTH][3] = { { 1.0f, 1.0f, 1.0f }, // white { 0.85f, 0.5f, 0.2f }, // orange @@ -45,26 +45,23 @@ Sheep::Sheep(Level *level) : Animal( level ) // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); + registerAttributes(); + setHealth(getMaxHealth()); - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); - - this->textureIdx = TN_MOB_SHEEP; // 4J - was L"/mob/sheep.png"; - this->setSize(0.9f, 1.3f); + setSize(0.9f, 1.3f); eatAnimationTick = 0; eatTileGoal = new EatTileGoal(this); - float walkSpeed = 0.23f; getNavigation()->setAvoidWater(true); goalSelector.addGoal(0, new FloatGoal(this)); - goalSelector.addGoal(1, new PanicGoal(this, 0.38f)); - goalSelector.addGoal(2, new BreedGoal(this, walkSpeed)); - goalSelector.addGoal(3, new TemptGoal(this, 0.25f, Item::wheat_Id, false)); - goalSelector.addGoal(4, new FollowParentGoal(this, 0.25f)); + goalSelector.addGoal(1, new PanicGoal(this, 1.25)); + goalSelector.addGoal(2, new BreedGoal(this, 1.0)); + goalSelector.addGoal(3, new TemptGoal(this, 1.1, Item::wheat_Id, false)); + goalSelector.addGoal(4, new FollowParentGoal(this, 1.1)); goalSelector.addGoal(5, eatTileGoal, false); - goalSelector.addGoal(6, new RandomStrollGoal(this, walkSpeed)); + goalSelector.addGoal(6, new RandomStrollGoal(this, 1.0)); goalSelector.addGoal(7, new LookAtPlayerGoal(this, typeid(Player), 6)); goalSelector.addGoal(8, new RandomLookAroundGoal(this)); @@ -90,9 +87,12 @@ void Sheep::aiStep() Animal::aiStep(); } -int Sheep::getMaxHealth() +void Sheep::registerAttributes() { - return 8; + Animal::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(8); + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.23f); } void Sheep::defineSynchedData() @@ -108,13 +108,13 @@ void Sheep::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) if(!isSheared()) { // killing a non-sheared sheep will drop a single block of cloth - spawnAtLocation(shared_ptr( new ItemInstance(Tile::cloth_Id, 1, getColor()) ), 0.0f); + spawnAtLocation(shared_ptr( new ItemInstance(Tile::wool_Id, 1, getColor()) ), 0.0f); } } int Sheep::getDeathLoot() { - return Tile::cloth_Id; + return Tile::wool_Id; } void Sheep::handleEntityEvent(byte id) @@ -160,35 +160,36 @@ float Sheep::getHeadEatAngleScale(float a) return ((xRot / (180.0f / PI))); } -bool Sheep::interact(shared_ptr player) +bool Sheep::mobInteract(shared_ptr player) { - shared_ptr item = player->inventory->getSelected(); + shared_ptr item = player->inventory->getSelected(); // 4J-JEV: Fix for #88212, // Untrusted players shouldn't be able to sheer sheep. if (!player->isAllowedToInteract( shared_from_this() )) return false; //Animal::interact(player); - if (item != NULL && item->id == Item::shears->id && !isSheared() && !isBaby()) + if (item != NULL && item->id == Item::shears->id && !isSheared() && !isBaby()) { - if (!level->isClientSide) + if (!level->isClientSide) { - setSheared(true); - int count = 1 + random->nextInt(3); - for (int i = 0; i < count; i++) + setSheared(true); + int count = 1 + random->nextInt(3); + for (int i = 0; i < count; i++) { - shared_ptr ie = spawnAtLocation(shared_ptr( new ItemInstance(Tile::cloth_Id, 1, getColor()) ), 1.0f); - ie->yd += random->nextFloat() * 0.05f; - ie->xd += (random->nextFloat() - random->nextFloat()) * 0.1f; - ie->zd += (random->nextFloat() - random->nextFloat()) * 0.1f; - } + shared_ptr ie = spawnAtLocation(shared_ptr( new ItemInstance(Tile::wool_Id, 1, getColor()) ), 1.0f); + ie->yd += random->nextFloat() * 0.05f; + ie->xd += (random->nextFloat() - random->nextFloat()) * 0.1f; + ie->zd += (random->nextFloat() - random->nextFloat()) * 0.1f; + } player->awardStat( GenericStats::shearedEntity(eTYPE_SHEEP), GenericStats::param_shearedEntity(eTYPE_SHEEP) ); - } - item->hurt(1, player); - } + } + item->hurtAndBreak(1, player); + playSound(eSoundType_MOB_SHEEP_SHEAR, 1, 1); + } - return Animal::interact(player); + return Animal::mobInteract(player); } void Sheep::addAdditonalSaveData(CompoundTag *tag) @@ -220,6 +221,11 @@ int Sheep::getDeathSound() return eSoundType_MOB_SHEEP_AMBIENT; } +void Sheep::playStepSound(int xt, int yt, int zt, int t) +{ + playSound(eSoundType_MOB_SHEEP_STEP, 0.15f, 1); +} + int Sheep::getColor() { return (entityData->getByte(DATA_WOOL_ID) & 0x0f); @@ -295,18 +301,16 @@ void Sheep::ate() if (isBaby()) { // remove a minute from aging - int age = getAge() + SharedConstants::TICKS_PER_SECOND * 60; - if (age > 0) - { - age = 0; - } - setAge(age); + ageUp(60); } } -void Sheep::finalizeMobSpawn() +MobGroupData *Sheep::finalizeMobSpawn(MobGroupData *groupData, int extraData /*= 0*/) // 4J Added extraData param { - setColor(Sheep::getSheepColor(level->random)); + groupData = Animal::finalizeMobSpawn(groupData); + + setColor(getSheepColor(level->random)); + return groupData; } int Sheep::getOffspringColor(shared_ptr animal, shared_ptr partner) diff --git a/Minecraft.World/Sheep.h b/Minecraft.World/Sheep.h index 666e1d57..16ecfb4c 100644 --- a/Minecraft.World/Sheep.h +++ b/Minecraft.World/Sheep.h @@ -31,7 +31,8 @@ private: EatTileGoal *eatTileGoal; public: - static const float COLOR[][3]; + static const int COLOR_LENGTH = 16; + static const float COLOR[COLOR_LENGTH][3]; public: Sheep(Level *level); @@ -42,9 +43,9 @@ protected: public: void aiStep(); - virtual int getMaxHealth(); protected: + virtual void registerAttributes(); virtual void defineSynchedData(); public: @@ -58,7 +59,7 @@ public: float getHeadEatPositionScale(float a); float getHeadEatAngleScale(float a); - virtual bool interact(shared_ptr player); + virtual bool mobInteract(shared_ptr player); virtual void addAdditonalSaveData(CompoundTag *tag); virtual void readAdditionalSaveData(CompoundTag *tag); @@ -66,6 +67,7 @@ protected: virtual int getAmbientSound(); virtual int getHurtSound(); virtual int getDeathSound(); + virtual void playStepSound(int xt, int yt, int zt, int t); public: int getColor(); @@ -78,7 +80,7 @@ public: virtual void ate(); - void finalizeMobSpawn(); + MobGroupData *finalizeMobSpawn(MobGroupData *groupData, int extraData = 0); // 4J Added extraData param private: int getOffspringColor(shared_ptr animal, shared_ptr partner); diff --git a/Minecraft.World/ShortTag.h b/Minecraft.World/ShortTag.h index bfd7511b..989e1fb1 100644 --- a/Minecraft.World/ShortTag.h +++ b/Minecraft.World/ShortTag.h @@ -9,7 +9,7 @@ public: ShortTag(const wstring &name, int data) : Tag(name) {this->data = data; } void write(DataOutput *dos) { dos->writeShort(data); } - void load(DataInput *dis) { data = dis->readShort(); } + void load(DataInput *dis, int tagDepth) { data = dis->readShort(); } byte getId() { return TAG_Short; } wstring toString() diff --git a/Minecraft.World/ShovelItem.cpp b/Minecraft.World/ShovelItem.cpp index 79981bd1..8064cbe3 100644 --- a/Minecraft.World/ShovelItem.cpp +++ b/Minecraft.World/ShovelItem.cpp @@ -16,8 +16,7 @@ void ShovelItem::staticCtor() diggables->data[5] = Tile::snow; diggables->data[6] = Tile::clay; diggables->data[7] = Tile::farmland; - // 4J - brought forward from 1.2.3 - diggables->data[8] = Tile::hellSand; + diggables->data[8] = Tile::soulsand; diggables->data[9] = Tile::mycel; } diff --git a/Minecraft.World/ShowSeedCommand.h b/Minecraft.World/ShowSeedCommand.h new file mode 100644 index 00000000..fa7b3078 --- /dev/null +++ b/Minecraft.World/ShowSeedCommand.h @@ -0,0 +1,38 @@ +/* +package net.minecraft.commands.common; + +import net.minecraft.commands.*; +import net.minecraft.network.chat.ChatMessageComponent; +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; + +public class ShowSeedCommand extends BaseCommand { + @Override + public boolean canExecute(CommandSender source) { + return MinecraftServer.getInstance().isSingleplayer() || super.canExecute(source); + } + + @Override + public String getName() { + return "seed"; + } + + @Override + public int getPermissionLevel() { + return LEVEL_GAMEMASTERS; + } + + @Override + public String getUsage(CommandSender source) { + return "commands.seed.usage"; + } + + @Override + public void execute(CommandSender source, String[] args) { + Level level = source instanceof Player ? ((Player) source).level : MinecraftServer.getInstance().getLevel(0); + source.sendMessage(ChatMessageComponent.forTranslation("commands.seed.success", level.getSeed())); + } +} + +*/ \ No newline at end of file diff --git a/Minecraft.World/SignItem.cpp b/Minecraft.World/SignItem.cpp index 02ccf83d..c9cb627e 100644 --- a/Minecraft.World/SignItem.cpp +++ b/Minecraft.World/SignItem.cpp @@ -26,20 +26,25 @@ bool SignItem::useOn(shared_ptr instance, shared_ptr playe if (face == 4) x--; if (face == 5) x++; - if (!player->mayBuild(x, y, z)) return false; + if (!player->mayUseItemAt(x, y, z, face, instance)) return false; if (!Tile::sign->mayPlace(level, x, y, z)) return false; + if (level->isClientSide) + { + return true; + } + if(!bTestUseOnOnly) { if (face == 1) { int rot = Mth::floor(((player->yRot + 180) * 16) / 360 + 0.5) & 15; - level->setTileAndData(x, y, z, Tile::sign_Id, rot); + level->setTileAndData(x, y, z, Tile::sign_Id, rot, Tile::UPDATE_ALL); } else { - level->setTileAndData(x, y, z, Tile::wallSign_Id, face); + level->setTileAndData(x, y, z, Tile::wallSign_Id, face, Tile::UPDATE_ALL); } instance->count--; diff --git a/Minecraft.World/SignTile.cpp b/Minecraft.World/SignTile.cpp index 52dc1260..52d62a60 100644 --- a/Minecraft.World/SignTile.cpp +++ b/Minecraft.World/SignTile.cpp @@ -5,7 +5,7 @@ #include "SignTileEntity.h" #include "SignTile.h" -SignTile::SignTile(int id, eINSTANCEOF clas, bool onGround) : EntityTile(id, Material::wood, isSolidRender()) +SignTile::SignTile(int id, eINSTANCEOF clas, bool onGround) : BaseEntityTile(id, Material::wood, isSolidRender()) { this->onGround = onGround; this->clas = clas; @@ -32,7 +32,7 @@ AABB *SignTile::getAABB(Level *level, int x, int y, int z) AABB *SignTile::getTileAABB(Level *level, int x, int y, int z) { updateShape(level, x, y, z); - return EntityTile::getTileAABB(level, x, y, z); + return BaseEntityTile::getTileAABB(level, x, y, z); } void SignTile::updateShape(LevelSource *level, int x, int y, int z, int forceData, shared_ptr forceEntity) // 4J added forceData, forceEntity param @@ -112,10 +112,10 @@ void SignTile::neighborChanged(Level *level, int x, int y, int z, int type) if (remove) { spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); } - EntityTile::neighborChanged(level, x, y, z, type); + BaseEntityTile::neighborChanged(level, x, y, z, type); } int SignTile::cloneTileId(Level *level, int x, int y, int z) diff --git a/Minecraft.World/SignTile.h b/Minecraft.World/SignTile.h index 92163973..4d9dce62 100644 --- a/Minecraft.World/SignTile.h +++ b/Minecraft.World/SignTile.h @@ -1,12 +1,12 @@ #pragma once -#include "EntityTile.h" +#include "BaseEntityTile.h" #include "TileEntity.h" #include "stdafx.h" #include "Material.h" -class SignTile : public EntityTile +class SignTile : public BaseEntityTile { friend class Tile; private: diff --git a/Minecraft.World/SignTileEntity.cpp b/Minecraft.World/SignTileEntity.cpp index 09b8e022..74adc8cc 100644 --- a/Minecraft.World/SignTileEntity.cpp +++ b/Minecraft.World/SignTileEntity.cpp @@ -30,6 +30,8 @@ SignTileEntity::SignTileEntity() : TileEntity() m_iSelectedLine = -1; _isEditable = true; + + playerWhoMayEdit = nullptr; } SignTileEntity::~SignTileEntity() @@ -102,6 +104,20 @@ bool SignTileEntity::isEditable() void SignTileEntity::setEditable(bool isEditable) { this->_isEditable = isEditable; + if (!isEditable) + { + playerWhoMayEdit = nullptr; + } +} + +void SignTileEntity::setAllowedPlayerEditor(shared_ptr player) +{ + playerWhoMayEdit = player; +} + +shared_ptr SignTileEntity::getPlayerWhoMayEdit() +{ + return playerWhoMayEdit; } void SignTileEntity::setChanged() diff --git a/Minecraft.World/SignTileEntity.h b/Minecraft.World/SignTileEntity.h index b963f12f..9b06aaab 100644 --- a/Minecraft.World/SignTileEntity.h +++ b/Minecraft.World/SignTileEntity.h @@ -28,6 +28,7 @@ public: public: private: + shared_ptr playerWhoMayEdit; bool _isEditable; bool m_bVerified; bool m_bCensored; @@ -41,6 +42,8 @@ public: virtual shared_ptr getUpdatePacket(); bool isEditable(); void setEditable(bool isEditable); + void setAllowedPlayerEditor(shared_ptr player); + shared_ptr getPlayerWhoMayEdit(); virtual void setChanged(); static int StringVerifyCallback(LPVOID lpParam,STRING_VERIFY_RESPONSE *pResults); diff --git a/Minecraft.World/Silverfish.cpp b/Minecraft.World/Silverfish.cpp index 117dc41b..5cd4c77e 100644 --- a/Minecraft.World/Silverfish.cpp +++ b/Minecraft.World/Silverfish.cpp @@ -3,6 +3,8 @@ #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.phys.h" #include "net.minecraft.world.damagesource.h" +#include "net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.h" #include "..\Minecraft.Client\Textures.h" #include "Silverfish.h" @@ -15,21 +17,19 @@ Silverfish::Silverfish(Level *level) : Monster( level ) // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); + registerAttributes(); + setHealth(getMaxHealth()); - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); - - this->textureIdx = TN_MOB_SILVERFISH;// 4J was "/mob/silverfish.png"; - this->setSize(0.3f, 0.7f); - runSpeed = 0.6f; - - // 4J - Brought forward damage from 1.2.3 - attackDamage = 1; + setSize(0.3f, 0.7f); } -int Silverfish::getMaxHealth() +void Silverfish::registerAttributes() { - return 8; + Monster::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(8); + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.6f); + getAttribute(SharedMonsterAttributes::ATTACK_DAMAGE)->setBaseValue(1); } bool Silverfish::makeStepSound() @@ -69,8 +69,9 @@ int Silverfish::getDeathSound() } -bool Silverfish::hurt(DamageSource *source, int dmg) +bool Silverfish::hurt(DamageSource *source, float dmg) { + if (isInvulnerable()) return false; if (lookForFriends <= 0 && (dynamic_cast(source) != NULL || source == DamageSource::magic)) { // look for friends @@ -86,16 +87,14 @@ void Silverfish::checkHurtTarget(shared_ptr target, float d) if (attackTime <= 0 && d < 1.2f && target->bb->y1 > bb->y0 && target->bb->y0 < bb->y1) { attackTime = 20; - DamageSource *damageSource = DamageSource::mobAttack( dynamic_pointer_cast( shared_from_this() ) ); - target->hurt(damageSource, attackDamage); - delete damageSource; + doHurtTarget(target); } } void Silverfish::playStepSound(int xt, int yt, int zt, int t) { - level->playSound(shared_from_this(), eSoundType_MOB_SILVERFISH_STEP, 1, 1); + playSound(eSoundType_MOB_SILVERFISH_STEP, 0.15f, 1); } int Silverfish::getDeathLoot() @@ -140,9 +139,26 @@ void Silverfish::serverAiStep() int tile = level->getTile(baseX + xOff, baseY + yOff, baseZ + zOff); if (tile == Tile::monsterStoneEgg_Id) { - level->levelEvent(LevelEvent::PARTICLES_DESTROY_BLOCK, baseX + xOff, baseY + yOff, baseZ + zOff, - Tile::monsterStoneEgg_Id + (level->getData(baseX + xOff, baseY + yOff, baseZ + zOff) << Tile::TILE_NUM_SHIFT)); - level->setTile(baseX + xOff, baseY + yOff, baseZ + zOff, 0); + if (!level->getGameRules()->getBoolean(GameRules::RULE_MOBGRIEFING)) + { + int data = level->getData(baseX + xOff, baseY + yOff, baseZ + zOff); + + Tile *restoreTile = Tile::stone; + if (data == StoneMonsterTile::HOST_COBBLE) + { + restoreTile = Tile::cobblestone; + } + if (data == StoneMonsterTile::HOST_STONEBRICK) + { + restoreTile = Tile::stoneBrick; + } + + level->setTileAndData(baseX + xOff, baseY + yOff, baseZ + zOff, restoreTile->id, 0, Tile::UPDATE_ALL); + } + else + { + level->destroyTile(baseX + xOff, baseY + yOff, baseZ + zOff, false); + } Tile::monsterStoneEgg->destroy(level, baseX + xOff, baseY + yOff, baseZ + zOff, 0); if (random->nextBoolean()) @@ -167,7 +183,7 @@ void Silverfish::serverAiStep() int tile = level->getTile(tileX + Facing::STEP_X[facing], tileY + Facing::STEP_Y[facing], tileZ + Facing::STEP_Z[facing]); if (StoneMonsterTile::isCompatibleHostBlock(tile)) { - level->setTileAndData(tileX + Facing::STEP_X[facing], tileY + Facing::STEP_Y[facing], tileZ + Facing::STEP_Z[facing], Tile::monsterStoneEgg_Id, StoneMonsterTile::getDataForHostBlock(tile)); + level->setTileAndData(tileX + Facing::STEP_X[facing], tileY + Facing::STEP_Y[facing], tileZ + Facing::STEP_Z[facing], Tile::monsterStoneEgg_Id, StoneMonsterTile::getDataForHostBlock(tile), Tile::UPDATE_ALL); spawnAnim(); remove(); } @@ -186,7 +202,7 @@ void Silverfish::serverAiStep() float Silverfish::getWalkTargetValue(int x, int y, int z) { // silverfish LOVES stone =) - if (level->getTile(x, y - 1, z) == Tile::rock_Id) return 10; + if (level->getTile(x, y - 1, z) == Tile::stone_Id) return 10; return Monster::getWalkTargetValue(x, y, z); } diff --git a/Minecraft.World/Silverfish.h b/Minecraft.World/Silverfish.h index 0fd0cc06..e954fff1 100644 --- a/Minecraft.World/Silverfish.h +++ b/Minecraft.World/Silverfish.h @@ -13,9 +13,8 @@ private: public: Silverfish(Level *level); - virtual int getMaxHealth(); - protected: + virtual void registerAttributes(); virtual bool makeStepSound(); virtual shared_ptr findAttackTarget(); @@ -24,7 +23,7 @@ protected: virtual int getDeathSound(); public: - virtual bool hurt(DamageSource *source, int dmg); + virtual bool hurt(DamageSource *source, float dmg); protected: virtual void checkHurtTarget(shared_ptr target, float d); diff --git a/Minecraft.World/SimpleContainer.cpp b/Minecraft.World/SimpleContainer.cpp index e29bc790..147bab0a 100644 --- a/Minecraft.World/SimpleContainer.cpp +++ b/Minecraft.World/SimpleContainer.cpp @@ -5,9 +5,11 @@ #include "SimpleContainer.h" -SimpleContainer::SimpleContainer(int name, int size) +SimpleContainer::SimpleContainer(int name, wstring stringName, bool customName, int size) { this->name = name; + this->stringName = stringName; + this->customName = customName; this->size = size; items = new ItemInstanceArray( size ); @@ -46,14 +48,14 @@ shared_ptr SimpleContainer::removeItem(unsigned int slot, int coun { shared_ptr item = (*items)[slot]; (*items)[slot] = nullptr; - this->setChanged(); + setChanged(); return item; } else { shared_ptr i = (*items)[slot]->remove(count); if ((*items)[slot]->count == 0) (*items)[slot] = nullptr; - this->setChanged(); + setChanged(); return i; } } @@ -75,7 +77,7 @@ void SimpleContainer::setItem(unsigned int slot, shared_ptr item) { (*items)[slot] = item; if (item != NULL && item->count > getMaxStackSize()) item->count = getMaxStackSize(); - this->setChanged(); + setChanged(); } unsigned int SimpleContainer::getContainerSize() @@ -83,9 +85,25 @@ unsigned int SimpleContainer::getContainerSize() return size; } -int SimpleContainer::getName() +wstring SimpleContainer::getName() { - return name; + return stringName.empty() ? app.GetString(name) : stringName; +} + +wstring SimpleContainer::getCustomName() +{ + return hasCustomName() ? stringName : L""; +} + +bool SimpleContainer::hasCustomName() +{ + return customName; +} + +void SimpleContainer::setCustomName(const wstring &name) +{ + customName = true; + this->stringName = name; } int SimpleContainer::getMaxStackSize() @@ -95,16 +113,18 @@ int SimpleContainer::getMaxStackSize() void SimpleContainer::setChanged() { - // 4J - removing this as we don't seem to have any implementation of a listener containerChanged function, and shared_from_this is proving tricky to add to containers -#if 0 if (listeners != NULL) for (unsigned int i = 0; i < listeners->size(); i++) { - listeners->at(i)->containerChanged(shared_from_this()); + listeners->at(i)->containerChanged();//shared_from_this()); } -#endif } bool SimpleContainer::stillValid(shared_ptr player) +{ + return true; +} + +bool SimpleContainer::canPlaceItem(int slot, shared_ptr item) { return true; } \ No newline at end of file diff --git a/Minecraft.World/SimpleContainer.h b/Minecraft.World/SimpleContainer.h index 98c193d3..b0baed70 100644 --- a/Minecraft.World/SimpleContainer.h +++ b/Minecraft.World/SimpleContainer.h @@ -8,35 +8,30 @@ class SimpleContainer : public Container { private: int name; + wstring stringName; int size; ItemInstanceArray *items; vector *listeners; + bool customName; public: - SimpleContainer(int name, int size); - - void addListener(net_minecraft_world::ContainerListener *listener); - - void removeListener(net_minecraft_world::ContainerListener *listener); - - shared_ptr getItem(unsigned int slot); - - shared_ptr removeItem(unsigned int slot, int count); - shared_ptr removeItemNoUpdate(int slot); - - void setItem(unsigned int slot, shared_ptr item); - - unsigned int getContainerSize(); - - int getName(); - - int getMaxStackSize(); - - void setChanged(); - - bool stillValid(shared_ptr player); - - void startOpen() { } // TODO Auto-generated method stub - void stopOpen() { } // TODO Auto-generated method stub + SimpleContainer(int name, wstring stringName, bool customName, int size); + virtual void addListener(net_minecraft_world::ContainerListener *listener); + virtual void removeListener(net_minecraft_world::ContainerListener *listener); + virtual shared_ptr getItem(unsigned int slot); + virtual shared_ptr removeItem(unsigned int slot, int count); + virtual shared_ptr removeItemNoUpdate(int slot); + virtual void setItem(unsigned int slot, shared_ptr item); + virtual unsigned int getContainerSize(); + virtual wstring getName(); + virtual wstring getCustomName(); + virtual bool hasCustomName(); + virtual void setCustomName(const wstring &name); + virtual int getMaxStackSize(); + virtual void setChanged(); + virtual bool stillValid(shared_ptr player); + virtual void startOpen() { } // TODO Auto-generated method stub + virtual void stopOpen() { } // TODO Auto-generated method stub + virtual bool canPlaceItem(int slot, shared_ptr item); }; \ No newline at end of file diff --git a/Minecraft.World/SimpleFoiledItem.cpp b/Minecraft.World/SimpleFoiledItem.cpp new file mode 100644 index 00000000..65894731 --- /dev/null +++ b/Minecraft.World/SimpleFoiledItem.cpp @@ -0,0 +1,12 @@ +#include "stdafx.h" + +#include "SimpleFoiledItem.h" + +SimpleFoiledItem::SimpleFoiledItem(int id) : Item(id) +{ +} + +bool SimpleFoiledItem::isFoil(shared_ptr itemInstance) +{ + return true; +} diff --git a/Minecraft.World/SimpleFoiledItem.h b/Minecraft.World/SimpleFoiledItem.h new file mode 100644 index 00000000..41bd884d --- /dev/null +++ b/Minecraft.World/SimpleFoiledItem.h @@ -0,0 +1,11 @@ +#pragma once + +#include "Item.h" + +class SimpleFoiledItem : public Item +{ +public: + SimpleFoiledItem(int id); + + bool isFoil(shared_ptr itemInstance); +}; \ No newline at end of file diff --git a/Minecraft.World/SitGoal.cpp b/Minecraft.World/SitGoal.cpp index 90180201..b79b2df7 100644 --- a/Minecraft.World/SitGoal.cpp +++ b/Minecraft.World/SitGoal.cpp @@ -20,7 +20,7 @@ bool SitGoal::canUse() if (mob->isInWater()) return false; if (!mob->onGround) return false; - shared_ptr owner = mob->getOwner(); + shared_ptr owner = dynamic_pointer_cast( mob->getOwner() ); if (owner == NULL) return true; // owner not on level if (mob->distanceToSqr(owner) < FollowOwnerGoal::TeleportDistance * FollowOwnerGoal::TeleportDistance && owner->getLastHurtByMob() != NULL) return false; diff --git a/Minecraft.World/Skeleton.cpp b/Minecraft.World/Skeleton.cpp index b6dbab1f..9afb95c6 100644 --- a/Minecraft.World/Skeleton.cpp +++ b/Minecraft.World/Skeleton.cpp @@ -1,14 +1,20 @@ #include "stdafx.h" #include "net.minecraft.world.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.dimension.h" +#include "net.minecraft.world.level.tile.entity.h" #include "net.minecraft.world.item.h" #include "net.minecraft.world.item.enchantment.h" +#include "net.minecraft.world.effect.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.ai.goal.h" #include "net.minecraft.world.entity.ai.goal.target.h" #include "net.minecraft.world.entity.ai.navigation.h" #include "net.minecraft.world.entity.projectile.h" #include "net.minecraft.world.entity.item.h" #include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.stats.h" #include "net.minecraft.world.damagesource.h" #include "SharedConstants.h" @@ -16,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..c7d1a029 100644 --- a/Minecraft.World/Slot.cpp +++ b/Minecraft.World/Slot.cpp @@ -116,6 +116,11 @@ bool Slot::mayPickup(shared_ptr player) return true; } +bool Slot::isActive() +{ + return true; +} + bool Slot::mayCombine(shared_ptr second) { shared_ptr first = getItem(); diff --git a/Minecraft.World/Slot.h b/Minecraft.World/Slot.h index 6289ec0e..12399783 100644 --- a/Minecraft.World/Slot.h +++ b/Minecraft.World/Slot.h @@ -36,6 +36,7 @@ public: virtual shared_ptr remove(int c); virtual bool isAt(shared_ptr c, int s); virtual bool mayPickup(shared_ptr player); + virtual bool isActive(); virtual bool mayCombine(shared_ptr item); // 4J Added virtual shared_ptr combine(shared_ptr item); // 4J Added }; \ No newline at end of file diff --git a/Minecraft.World/SmallFireball.cpp b/Minecraft.World/SmallFireball.cpp index a1fa5cb1..30f7a0b2 100644 --- a/Minecraft.World/SmallFireball.cpp +++ b/Minecraft.World/SmallFireball.cpp @@ -11,7 +11,7 @@ SmallFireball::SmallFireball(Level *level) : Fireball(level) setSize(5 / 16.0f, 5 / 16.0f); } -SmallFireball::SmallFireball(Level *level, shared_ptr mob, double xa, double ya, double za) : Fireball(level, mob, xa, ya, za) +SmallFireball::SmallFireball(Level *level, shared_ptr mob, double xa, double ya, double za) : Fireball(level, mob, xa, ya, za) { setSize(5 / 16.0f, 5 / 16.0f); } @@ -62,7 +62,7 @@ void SmallFireball::onHit(HitResult *res) }; if (level->isEmptyTile(tileX, tileY, tileZ)) { - level->setTile(tileX, tileY, tileZ, Tile::fire_Id); + level->setTileAndUpdate(tileX, tileY, tileZ, Tile::fire_Id); } } remove(); @@ -74,7 +74,7 @@ bool SmallFireball::isPickable() return false; } -bool SmallFireball::hurt(DamageSource *source, int damage) +bool SmallFireball::hurt(DamageSource *source, float damage) { return false; } \ No newline at end of file diff --git a/Minecraft.World/SmallFireball.h b/Minecraft.World/SmallFireball.h index 38ad8efd..bb2e67ae 100644 --- a/Minecraft.World/SmallFireball.h +++ b/Minecraft.World/SmallFireball.h @@ -12,7 +12,7 @@ public: public: SmallFireball(Level *level); - SmallFireball(Level *level, shared_ptr mob, double xa, double ya, double za); + SmallFireball(Level *level, shared_ptr mob, double xa, double ya, double za); SmallFireball(Level *level, double x, double y, double z, double xa, double ya, double za); protected: @@ -20,5 +20,5 @@ protected: public: virtual bool isPickable(); - virtual bool hurt(DamageSource *source, int damage); + virtual bool hurt(DamageSource *source, float damage); }; \ No newline at end of file diff --git a/Minecraft.World/SmoothStoneBrickTile.cpp b/Minecraft.World/SmoothStoneBrickTile.cpp index 372901ec..22fb6df5 100644 --- a/Minecraft.World/SmoothStoneBrickTile.cpp +++ b/Minecraft.World/SmoothStoneBrickTile.cpp @@ -2,7 +2,7 @@ #include "SmoothStoneBrickTile.h" #include "net.minecraft.world.h" -const wstring SmoothStoneBrickTile::TEXTURE_NAMES[] = {L"stonebricksmooth", L"stonebricksmooth_mossy", L"stonebricksmooth_cracked", L"stonebricksmooth_carved"}; +const wstring SmoothStoneBrickTile::TEXTURE_NAMES[] = {L"", L"mossy", L"cracked", L"carved"}; const unsigned int SmoothStoneBrickTile::SMOOTH_STONE_BRICK_NAMES[SMOOTH_STONE_BRICK_NAMES_LENGTH] = { IDS_TILE_STONE_BRICK_SMOOTH, IDS_TILE_STONE_BRICK_SMOOTH_MOSSY, @@ -38,6 +38,8 @@ void SmoothStoneBrickTile::registerIcons(IconRegister *iconRegister) for (int i = 0; i < SMOOTH_STONE_BRICK_NAMES_LENGTH; i++) { - icons[i] = iconRegister->registerIcon(TEXTURE_NAMES[i]); + wstring name = getIconName(); + if (!TEXTURE_NAMES[i].empty() ) name += L"_" + TEXTURE_NAMES[i]; + icons[i] = iconRegister->registerIcon(name); } } \ No newline at end of file diff --git a/Minecraft.World/SnowItem.cpp b/Minecraft.World/SnowItem.cpp new file mode 100644 index 00000000..73cb57ad --- /dev/null +++ b/Minecraft.World/SnowItem.cpp @@ -0,0 +1,45 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.h" +#include "SnowItem.h" + +SnowItem::SnowItem(int id, Tile *parentTile) : AuxDataTileItem(id, parentTile) +{ +} + +bool SnowItem::useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +{ + if (instance->count == 0) return false; + if (!player->mayUseItemAt(x, y, z, face, instance)) return false; + + int currentTile = level->getTile(x, y, z); + + // Are we adding extra snow to an existing tile? + if (currentTile == Tile::topSnow_Id) + { + Tile *snowTile = Tile::tiles[getTileId()]; + int currentData = level->getData(x, y, z); + int currentHeight = currentData & TopSnowTile::HEIGHT_MASK; + + if (currentHeight <= TopSnowTile::MAX_HEIGHT && level->isUnobstructed(snowTile->getAABB(level, x, y, z))) + { + if (!bTestUseOnOnly) + { + // Increase snow tile height + if (level->setData(x, y, z, (currentHeight + 1) | (currentData & ~TopSnowTile::HEIGHT_MASK), Tile::UPDATE_CLIENTS)) + { + level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, snowTile->soundType->getPlaceSound(), (snowTile->soundType->getVolume() + 1) / 2, snowTile->soundType->getPitch() * 0.8f); + instance->count--; + return true; + } + } + else + { + return true; + } + } + } + + return AuxDataTileItem::useOn(instance, player, level, x, y, z, face, clickX, clickY, clickZ, bTestUseOnOnly); +} \ No newline at end of file diff --git a/Minecraft.World/SnowItem.h b/Minecraft.World/SnowItem.h new file mode 100644 index 00000000..47b0049a --- /dev/null +++ b/Minecraft.World/SnowItem.h @@ -0,0 +1,11 @@ +#pragma once + +#include "AuxDataTileItem.h" + +class SnowItem : public AuxDataTileItem +{ +public: + SnowItem(int id, Tile *parentTile); + + bool useOn(shared_ptr instance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); +}; \ No newline at end of file diff --git a/Minecraft.World/SnowMan.cpp b/Minecraft.World/SnowMan.cpp index 958b8126..6c78b56f 100644 --- a/Minecraft.World/SnowMan.cpp +++ b/Minecraft.World/SnowMan.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.ai.goal.h" #include "net.minecraft.world.entity.ai.goal.target.h" #include "net.minecraft.world.entity.ai.navigation.h" @@ -22,20 +23,18 @@ SnowMan::SnowMan(Level *level) : Golem(level) // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); + registerAttributes(); + setHealth(getMaxHealth()); - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); - - this->textureIdx = TN_MOB_SNOWMAN;// 4J was "/mob/snowman.png"; this->setSize(0.4f, 1.8f); getNavigation()->setAvoidWater(true); - goalSelector.addGoal(1, new ArrowAttackGoal(this, 0.25f, ArrowAttackGoal::SnowballType, SharedConstants::TICKS_PER_SECOND * 1)); - goalSelector.addGoal(2, new RandomStrollGoal(this, 0.2f)); + goalSelector.addGoal(1, new RangedAttackGoal(this, this, 1.25, SharedConstants::TICKS_PER_SECOND * 1, 10)); + goalSelector.addGoal(2, new RandomStrollGoal(this, 1.0)); goalSelector.addGoal(3, new LookAtPlayerGoal(this, typeid(Player), 6)); goalSelector.addGoal(4, new RandomLookAroundGoal(this)); - targetSelector.addGoal(1, new NearestAttackableTargetGoal(this, typeid(Monster), 16, 0, true)); + targetSelector.addGoal(1, new NearestAttackableTargetGoal(this, typeid(Mob), 0, true, false, Enemy::ENEMY_SELECTOR)); } bool SnowMan::useNewAi() @@ -43,16 +42,19 @@ bool SnowMan::useNewAi() return true; } -int SnowMan::getMaxHealth() +void SnowMan::registerAttributes() { - return 4; + Golem::registerAttributes(); + + getAttribute(SharedMonsterAttributes::MAX_HEALTH)->setBaseValue(4); + getAttribute(SharedMonsterAttributes::MOVEMENT_SPEED)->setBaseValue(0.2f); } void SnowMan::aiStep() { Golem::aiStep(); - if (this->isInWaterOrRain()) hurt(DamageSource::drown, 1); + if (isInWaterOrRain()) hurt(DamageSource::drown, 1); { int xx = Mth::floor(x); @@ -74,7 +76,7 @@ void SnowMan::aiStep() { if (Tile::topSnow->mayPlace(level, xx, yy, zz)) { - level->setTile(xx, yy, zz, Tile::topSnow_Id); + level->setTileAndUpdate(xx, yy, zz, Tile::topSnow_Id); } } } @@ -94,4 +96,17 @@ void SnowMan::dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel) for (int i = 0; i < count; i++) { spawnAtLocation(Item::snowBall_Id, 1); } +} + +void SnowMan::performRangedAttack(shared_ptr target, float power) +{ + shared_ptr snowball = shared_ptr(new Snowball(level, dynamic_pointer_cast(shared_from_this()))); + double xd = target->x - x; + double yd = (target->y + target->getHeadHeight() - 1.1f) - snowball->y; + double zd = target->z - z; + float yo = Mth::sqrt(xd * xd + zd * zd) * 0.2f; + snowball->shoot(xd, yd + yo, zd, 1.60f, 12); + + playSound(eSoundType_RANDOM_BOW, 1.0f, 1 / (getRandom()->nextFloat() * 0.4f + 0.8f)); + level->addEntity(snowball); } \ No newline at end of file diff --git a/Minecraft.World/SnowMan.h b/Minecraft.World/SnowMan.h index cf6f094a..52dbb52f 100644 --- a/Minecraft.World/SnowMan.h +++ b/Minecraft.World/SnowMan.h @@ -1,8 +1,9 @@ #pragma once #include "Golem.h" +#include "RangedAttackMob.h" -class SnowMan : public Golem +class SnowMan : public Golem, public RangedAttackMob { public: eINSTANCEOF GetType() { return eTYPE_SNOWMAN; } @@ -12,10 +13,16 @@ public: SnowMan(Level *level); virtual bool useNewAi(); - virtual int getMaxHealth(); +protected: + virtual void registerAttributes(); + +public: virtual void aiStep(); protected: virtual int getDeathLoot(); virtual void dropDeathLoot(bool wasKilledByPlayer, int playerBonusLevel); + +public: + virtual void performRangedAttack(shared_ptr target, float power); }; \ No newline at end of file diff --git a/Minecraft.World/SnowTile.cpp b/Minecraft.World/SnowTile.cpp index dde16379..e73f5ceb 100644 --- a/Minecraft.World/SnowTile.cpp +++ b/Minecraft.World/SnowTile.cpp @@ -25,11 +25,11 @@ void SnowTile::tick(Level *level, int x, int y, int z, Random *random) if (level->getBrightness(LightLayer::Block, x, y, z) > 11) { this->spawnResources(level, x, y, z, level->getData(x, y, z), 0); - level->setTile(x, y, z, 0); + level->removeTile(x, y, z); } } bool SnowTile::shouldTileTick(Level *level, int x,int y,int z) { - return level->getBrightness(LightLayer::Block, x, y, z) > 11; + return level->getBrightness(LightLayer::Block, x, y, z) > 11; } \ No newline at end of file diff --git a/Minecraft.World/Snowball.cpp b/Minecraft.World/Snowball.cpp index cdcefb1b..6588ac96 100644 --- a/Minecraft.World/Snowball.cpp +++ b/Minecraft.World/Snowball.cpp @@ -19,7 +19,7 @@ Snowball::Snowball(Level *level) : Throwable(level) _init(); } -Snowball::Snowball(Level *level, shared_ptr mob) : Throwable(level,mob) +Snowball::Snowball(Level *level, shared_ptr mob) : Throwable(level,mob) { _init(); } @@ -34,12 +34,12 @@ void Snowball::onHit(HitResult *res) if (res->entity != NULL) { int damage = 0; - if (dynamic_pointer_cast(res->entity) != NULL) + if ( res->entity->instanceof(eTYPE_BLAZE) ) { damage = 3; } - DamageSource *damageSource = DamageSource::thrown(shared_from_this(), owner); + DamageSource *damageSource = DamageSource::thrown(shared_from_this(), getOwner()); res->entity->hurt(damageSource, damage); delete damageSource; } diff --git a/Minecraft.World/Snowball.h b/Minecraft.World/Snowball.h index 82971726..d78dfade 100644 --- a/Minecraft.World/Snowball.h +++ b/Minecraft.World/Snowball.h @@ -16,7 +16,7 @@ private: public: Snowball(Level *level); - Snowball(Level *level, shared_ptr mob); + Snowball(Level *level, shared_ptr mob); Snowball(Level *level, double x, double y, double z); protected: diff --git a/Minecraft.World/SnowballItem.cpp b/Minecraft.World/SnowballItem.cpp index 41dd2b7c..0149e68d 100644 --- a/Minecraft.World/SnowballItem.cpp +++ b/Minecraft.World/SnowballItem.cpp @@ -8,7 +8,7 @@ SnowballItem::SnowballItem(int id) : Item(id) { - this->maxStackSize = 16; + this->maxStackSize = 16; } shared_ptr SnowballItem::use(shared_ptr instance, Level *level, shared_ptr player) @@ -17,7 +17,7 @@ shared_ptr SnowballItem::use(shared_ptr instance, Le { instance->count--; } - level->playSound((shared_ptr ) player, eSoundType_RANDOM_BOW, 0.5f, 0.4f / (random->nextFloat() * 0.4f + 0.8f)); - if (!level->isClientSide) level->addEntity( shared_ptr( new Snowball(level, player) ) ); - return instance; + level->playEntitySound((shared_ptr ) player, eSoundType_RANDOM_BOW, 0.5f, 0.4f / (random->nextFloat() * 0.4f + 0.8f)); + if (!level->isClientSide) level->addEntity( shared_ptr( new Snowball(level, player) ) ); + return instance; } \ No newline at end of file diff --git a/Minecraft.World/Socket.cpp b/Minecraft.World/Socket.cpp index 4b703403..bd0c2032 100644 --- a/Minecraft.World/Socket.cpp +++ b/Minecraft.World/Socket.cpp @@ -500,6 +500,14 @@ void Socket::SocketOutputStreamNetwork::writeWithFlags(byteArray b, unsigned int return; } +#ifdef _XBOX + bool lowPriority = ( ( flags & QNET_SENDDATA_LOW_PRIORITY ) == QNET_SENDDATA_LOW_PRIORITY ); + bool requireAck = lowPriority; +#else + bool lowPriority = false; + bool requireAck = ( ( flags & NON_QNET_SENDDATA_ACK_REQUIRED ) == NON_QNET_SENDDATA_ACK_REQUIRED ); +#endif + if( m_queueIdx == SOCKET_SERVER_END ) { //printf( "Sent %u bytes of data from \"%ls\" to \"%ls\"\n", @@ -507,7 +515,7 @@ void Socket::SocketOutputStreamNetwork::writeWithFlags(byteArray b, unsigned int //hostPlayer->GetGamertag(), //m_socket->networkPlayer->GetGamertag()); - hostPlayer->SendData(socketPlayer, buffer.pbyData, buffer.dwDataSize, QNET_SENDDATA_RELIABLE | QNET_SENDDATA_SEQUENTIAL | flags); + hostPlayer->SendData(socketPlayer, buffer.pbyData, buffer.dwDataSize, lowPriority, requireAck); // DWORD queueSize = hostPlayer->GetSendQueueSize( NULL, QNET_GETSENDQUEUESIZE_BYTES ); // if( queueSize > 24000 ) @@ -523,7 +531,7 @@ void Socket::SocketOutputStreamNetwork::writeWithFlags(byteArray b, unsigned int //m_socket->networkPlayer->GetGamertag(), //hostPlayer->GetGamertag()); - socketPlayer->SendData(hostPlayer, buffer.pbyData, buffer.dwDataSize, QNET_SENDDATA_RELIABLE | QNET_SENDDATA_SEQUENTIAL | flags); + socketPlayer->SendData(hostPlayer, buffer.pbyData, buffer.dwDataSize, lowPriority, requireAck); } } } diff --git a/Minecraft.World/SoulSandTile.cpp b/Minecraft.World/SoulSandTile.cpp new file mode 100644 index 00000000..4ebcf5f6 --- /dev/null +++ b/Minecraft.World/SoulSandTile.cpp @@ -0,0 +1,21 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.phys.h" +#include "SoulSandTile.h" + + +SoulSandTile::SoulSandTile(int id) : Tile(id, Material::sand) +{ +} + +AABB *SoulSandTile::getAABB(Level *level, int x, int y, int z) +{ + float r = 2 / 16.0f; + return AABB::newTemp(x, y, z, x + 1, y + 1 - r, z + 1); +} + +void SoulSandTile::entityInside(Level *level, int x, int y, int z, shared_ptr entity) +{ + entity->xd*=0.4; + entity->zd*=0.4; +} \ No newline at end of file diff --git a/Minecraft.World/SoulSandTile.h b/Minecraft.World/SoulSandTile.h new file mode 100644 index 00000000..b461de84 --- /dev/null +++ b/Minecraft.World/SoulSandTile.h @@ -0,0 +1,11 @@ +#pragma once +#include "Tile.h" +#include "Definitions.h" + +class SoulSandTile : public Tile +{ +public: + SoulSandTile(int id); + virtual AABB *getAABB(Level *level, int x, int y, int z); + virtual void entityInside(Level *level, int x, int y, int z, shared_ptr entity); +}; \ No newline at end of file diff --git a/Minecraft.World/SoundTypes.h b/Minecraft.World/SoundTypes.h index acbe9167..81e81d79 100644 --- a/Minecraft.World/SoundTypes.h +++ b/Minecraft.World/SoundTypes.h @@ -57,7 +57,7 @@ enum eSOUND_TYPE eSoundType_MOB_CAT_PURR, eSoundType_MOB_CAT_PURREOW, eSoundType_MOB_CAT_MEOW, - eSoundType_MOB_CAT_HITT, + eSoundType_MOB_CAT_HIT, // eSoundType_MOB_IRONGOLEM_THROW, // eSoundType_MOB_IRONGOLEM_HIT, // eSoundType_MOB_IRONGOLEM_DEATH, @@ -147,6 +147,72 @@ enum eSOUND_TYPE eSoundType_DIG_STONE, eSoundType_DIG_WOOD, + // 1.6.4 + eSoundType_FIREWORKS_LAUNCH, + eSoundType_FIREWORKS_BLAST, + eSoundType_FIREWORKS_BLAST_FAR, + eSoundType_FIREWORKS_LARGE_BLAST, + eSoundType_FIREWORKS_LARGE_BLAST_FAR, + eSoundType_FIREWORKS_TWINKLE, + eSoundType_FIREWORKS_TWINKLE_FAR, + + eSoundType_MOB_BAT_IDLE, + eSoundType_MOB_BAT_HURT, + eSoundType_MOB_BAT_DEATH, + eSoundType_MOB_BAT_TAKEOFF, + + + eSoundType_MOB_WITHER_SPAWN, + eSoundType_MOB_WITHER_IDLE, //"mob.wither.idle"; + eSoundType_MOB_WITHER_HURT, //"mob.wither.hurt"; + eSoundType_MOB_WITHER_DEATH,//"mob.wither.death"; + eSoundType_MOB_WITHER_SHOOT,//"mob.wither.shoot"; + + eSoundType_MOB_COW_STEP, + eSoundType_MOB_CHICKEN_STEP, + eSoundType_MOB_PIG_STEP, + eSoundType_MOB_ENDERMAN_STARE, + eSoundType_MOB_ENDERMAN_SCREAM, + eSoundType_MOB_SHEEP_SHEAR, + eSoundType_MOB_SHEEP_STEP, + eSoundType_MOB_SKELETON_DEATH, + eSoundType_MOB_SKELETON_STEP, + eSoundType_MOB_SPIDER_STEP, + eSoundType_MOB_WOLF_STEP, + eSoundType_MOB_ZOMBIE_STEP, + eSoundType_LIQUID_SWIM, + eSoundType_MOB_HORSE_LAND, + eSoundType_MOB_HORSE_ARMOR, + eSoundType_MOB_HORSE_LEATHER, + eSoundType_MOB_HORSE_ZOMBIE_DEATH, + eSoundType_MOB_HORSE_SKELETON_DEATH, + eSoundType_MOB_HORSE_DONKEY_DEATH, + eSoundType_MOB_HORSE_DEATH, + eSoundType_MOB_HORSE_ZOMBIE_HIT, + eSoundType_MOB_HORSE_SKELETON_HIT, + eSoundType_MOB_HORSE_DONKEY_HIT, + eSoundType_MOB_HORSE_HIT, + eSoundType_MOB_HORSE_ZOMBIE_IDLE, + eSoundType_MOB_HORSE_SKELETON_IDLE, + eSoundType_MOB_HORSE_DONKEY_IDLE, + eSoundType_MOB_HORSE_IDLE, + eSoundType_MOB_HORSE_DONKEY_ANGRY, + eSoundType_MOB_HORSE_ANGRY, + eSoundType_MOB_HORSE_GALLOP, + eSoundType_MOB_HORSE_BREATHE, + eSoundType_MOB_HORSE_WOOD, + eSoundType_MOB_HORSE_SOFT, + eSoundType_MOB_HORSE_JUMP, + eSoundType_MOB_WITCH_IDLE, + eSoundType_MOB_WITCH_HURT, + eSoundType_MOB_WITCH_DEATH, + eSoundType_MOB_SLIME_BIG, + eSoundType_MOB_SLIME_SMALL, + eSoundType_EATING, + eSoundType_RANDOM_LEVELUP, + + eSoundType_FIRE_NEWIGNITE, + eSoundType_MAX }; diff --git a/Minecraft.World/Source.h b/Minecraft.World/Source.h new file mode 100644 index 00000000..aab5b83d --- /dev/null +++ b/Minecraft.World/Source.h @@ -0,0 +1,5 @@ +#pragma once + +class Source +{ +}; \ No newline at end of file diff --git a/Minecraft.World/SpawnEggItem.cpp b/Minecraft.World/SpawnEggItem.cpp new file mode 100644 index 00000000..ab082bfb --- /dev/null +++ b/Minecraft.World/SpawnEggItem.cpp @@ -0,0 +1,378 @@ +#include "stdafx.h" +#include "..\Minecraft.Client\Minecraft.h" +#include "net.minecraft.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.tile.entity.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.npc.h" +#include "net.minecraft.world.h" +#include "HitResult.h" +#include "SpawnEggItem.h" +#include "Difficulty.h" + + +SpawnEggItem::SpawnEggItem(int id) : Item(id) +{ + setMaxStackSize(16); // 4J-PB brought forward. It is 64 on PC, but we'll never be able to place that many + setStackedByData(true); + overlay = NULL; +} + +wstring SpawnEggItem::getHoverName(shared_ptr itemInstance) +{ + wstring elementName = getDescription(); + + int nameId = EntityIO::getNameId(itemInstance->getAuxValue()); + if (nameId >= 0) + { + elementName = replaceAll(elementName,L"{*CREATURE*}",app.GetString(nameId)); + //elementName += " " + I18n.get("entity." + encodeId + ".name"); + } + else + { + elementName = replaceAll(elementName,L"{*CREATURE*}",L""); + } + + return elementName; +} + +int SpawnEggItem::getColor(shared_ptr item, int spriteLayer) +{ + AUTO_VAR(it, EntityIO::idsSpawnableInCreative.find(item->getAuxValue())); + if (it != EntityIO::idsSpawnableInCreative.end()) + { + EntityIO::SpawnableMobInfo *spawnableMobInfo = it->second; + if (spriteLayer == 0) { + return Minecraft::GetInstance()->getColourTable()->getColor( spawnableMobInfo->eggColor1 ); + } + return Minecraft::GetInstance()->getColourTable()->getColor( spawnableMobInfo->eggColor2 ); + } + return 0xffffff; +} + +bool SpawnEggItem::hasMultipleSpriteLayers() +{ + return true; +} + +Icon *SpawnEggItem::getLayerIcon(int auxValue, int spriteLayer) +{ + if (spriteLayer > 0) + { + return overlay; + } + return Item::getLayerIcon(auxValue, spriteLayer); +} + +// 4J-PB - added for dispenser +shared_ptr SpawnEggItem::canSpawn(int iAuxVal, Level *level, int *piResult) +{ + shared_ptr newEntity = EntityIO::newById(iAuxVal, level); + if (newEntity != NULL) + { + bool canSpawn = false; + + switch(newEntity->GetType()) + { + case eTYPE_CHICKEN: + if(level->canCreateMore( eTYPE_CHICKEN, Level::eSpawnType_Egg) ) + { + canSpawn = true; + } + else + { + *piResult=eSpawnResult_FailTooManyChickens; + } + break; + case eTYPE_WOLF: + if(level->canCreateMore( eTYPE_WOLF, Level::eSpawnType_Egg) ) + { + canSpawn = true; + } + else + { + *piResult=eSpawnResult_FailTooManyWolves; + } + break; + case eTYPE_VILLAGER: + if(level->canCreateMore( eTYPE_VILLAGER, Level::eSpawnType_Egg) ) + { + canSpawn = true; + } + else + { + *piResult=eSpawnResult_FailTooManyVillagers; + } + break; + case eTYPE_MUSHROOMCOW: + if(level->canCreateMore(eTYPE_MUSHROOMCOW, Level::eSpawnType_Egg) ) + { + canSpawn = true; + } + else + { + *piResult=eSpawnResult_FailTooManyMooshrooms; + } + break; + case eTYPE_SQUID: + if(level->canCreateMore( eTYPE_SQUID, Level::eSpawnType_Egg) ) + { + canSpawn = true; + } + else + { + *piResult=eSpawnResult_FailTooManySquid; + } + break; + case eTYPE_BAT: + if(level->canCreateMore( eTYPE_BAT, Level::eSpawnType_Egg) ) + { + canSpawn = true; + } + else + { + *piResult=eSpawnResult_FailTooManyBats; + } + break; + default: + if ( eTYPE_FLAGSET(eTYPE_ANIMALS_SPAWN_LIMIT_CHECK, newEntity->GetType()) ) + { + if( level->canCreateMore( newEntity->GetType(), Level::eSpawnType_Egg ) ) + { + canSpawn = true; + } + else + { + // different message for each animal + + *piResult=eSpawnResult_FailTooManyPigsCowsSheepCats; + } + } + // 4J: Use eTYPE_ENEMY instead of monster (slimes and ghasts aren't monsters) + else if(newEntity->instanceof(eTYPE_ENEMY)) + { + // 4J-PB - check if the player is trying to spawn an enemy in peaceful mode + if(level->difficulty==Difficulty::PEACEFUL) + { + *piResult=eSpawnResult_FailCantSpawnInPeaceful; + } + else if(level->canCreateMore( newEntity->GetType(), Level::eSpawnType_Egg) ) + { + canSpawn = true; + } + else + { + *piResult=eSpawnResult_FailTooManyMonsters; + } + } +#ifndef _CONTENT_PACKAGE + else if(app.DebugArtToolsOn()) + { + canSpawn = true; + } +#endif + break; + } + + if(canSpawn) + { + return newEntity; + } + } + + return nullptr; +} + +bool SpawnEggItem::useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) +{ + if (level->isClientSide) + { + return true; + } + + int tile = level->getTile(x, y, z); + +#ifndef _CONTENT_PACKAGE + if(app.DebugArtToolsOn() && tile == Tile::mobSpawner_Id) + { + // 4J Stu - Force adding this as a tile update + level->removeTile(x,y,z); + level->setTileAndData(x,y,z,Tile::mobSpawner_Id, 0, Tile::UPDATE_ALL); + shared_ptr mste = dynamic_pointer_cast( level->getTileEntity(x,y,z) ); + if(mste != NULL) + { + mste->setEntityId( EntityIO::getEncodeId(itemInstance->getAuxValue()) ); + return true; + } + } +#endif + + x += Facing::STEP_X[face]; + y += Facing::STEP_Y[face]; + z += Facing::STEP_Z[face]; + + double yOff = 0; + if (face == Facing::UP && (Tile::tiles[tile] != NULL && Tile::tiles[tile]->getRenderShape() == Tile::SHAPE_FENCE)) + { + // special case + yOff = .5; + } + + int iResult=0; + shared_ptr result = spawnMobAt(level, itemInstance->getAuxValue(), x + .5, y + yOff, z + .5, &iResult); + + if(bTestUseOnOnly) + { + return result != NULL; + } + + if (result != NULL) + { + // 4J-JEV: SetCustomName is a method for Mob not LivingEntity; so change instanceof to check for Mobs. + if ( result->instanceof(eTYPE_MOB) && itemInstance->hasCustomHoverName() ) + { + dynamic_pointer_cast(result)->setCustomName(itemInstance->getHoverName()); + } + if ( !player->abilities.instabuild ) + { + itemInstance->count--; + } + } + else + { + DisplaySpawnError(player, iResult); + } + + return true; +} + +shared_ptr SpawnEggItem::use(shared_ptr itemInstance, Level *level, shared_ptr player) +{ + if (level->isClientSide) return itemInstance; + + HitResult *hr = getPlayerPOVHitResult(level, player, true); + if (hr == NULL) + { + delete hr; + return itemInstance; + } + + if (hr->type == HitResult::TILE) + { + int xt = hr->x; + int yt = hr->y; + int zt = hr->z; + + if (!level->mayInteract(player, xt, yt, zt,0)) + { + delete hr; + return itemInstance; + } + if (!player->mayUseItemAt(xt, yt, zt, hr->f, itemInstance)) return itemInstance; + + if (level->getMaterial(xt, yt, zt) == Material::water) + { + int iResult=0; + shared_ptr result = spawnMobAt(level, itemInstance->getAuxValue(), xt, yt, zt, &iResult); + if (result != NULL) + { + // 4J-JEV: SetCustomName is a method for Mob not LivingEntity; so change instanceof to check for Mobs. + if ( result->instanceof(eTYPE_MOB) && itemInstance->hasCustomHoverName() ) + { + dynamic_pointer_cast(result)->setCustomName(itemInstance->getHoverName()); + } + if (!player->abilities.instabuild) + { + itemInstance->count--; + } + } + else + { + SpawnEggItem::DisplaySpawnError(player, iResult); + } + } + } + return itemInstance; +} + +shared_ptr SpawnEggItem::spawnMobAt(Level *level, int auxVal, double x, double y, double z, int *piResult) +{ + int mobId = auxVal; + int extraData = 0; + + //4J Stu - Enable spawning specific entity sub-types + mobId = auxVal & 0xFFF; + extraData = auxVal >> 12; + + if (EntityIO::idsSpawnableInCreative.find(mobId) == EntityIO::idsSpawnableInCreative.end()) + { + return nullptr; + } + + shared_ptr newEntity = nullptr; + + for (int i = 0; i < SPAWN_COUNT; i++) + { + newEntity = canSpawn(mobId, level, piResult); + + // 4J-JEV: DynCasting to Mob not LivingEntity; so change instanceof to check for Mobs. + if ( newEntity != NULL && newEntity->instanceof(eTYPE_MOB) ) + { + shared_ptr mob = dynamic_pointer_cast(newEntity); + newEntity->moveTo(x, y, z, Mth::wrapDegrees(level->random->nextFloat() * 360), 0); + newEntity->setDespawnProtected(); // 4J added, default to being protected against despawning (has to be done after initial position is set) + mob->yHeadRot = mob->yRot; + mob->yBodyRot = mob->yRot; + + mob->finalizeMobSpawn(NULL, extraData); + level->addEntity(newEntity); + mob->playAmbientSound(); + } + } + + return newEntity; +} + +void SpawnEggItem::registerIcons(IconRegister *iconRegister) +{ + Item::registerIcons(iconRegister); + overlay = iconRegister->registerIcon(getIconName() + L"_overlay"); +} + +void SpawnEggItem::DisplaySpawnError(shared_ptr player, int result) +{ + // some negative sound effect? + //level->levelEvent(LevelEvent::SOUND_CLICK_FAIL, x, y, z, 0); + switch(result) + { + case eSpawnResult_FailTooManyPigsCowsSheepCats: + player->displayClientMessage(IDS_MAX_PIGS_SHEEP_COWS_CATS_SPAWNED ); + break; + case eSpawnResult_FailTooManyChickens: + player->displayClientMessage(IDS_MAX_CHICKENS_SPAWNED ); + break; + case eSpawnResult_FailTooManySquid: + player->displayClientMessage(IDS_MAX_SQUID_SPAWNED ); + break; + case eSpawnResult_FailTooManyBats: + player->displayClientMessage(IDS_MAX_BATS_SPAWNED); + break; + case eSpawnResult_FailTooManyWolves: + player->displayClientMessage(IDS_MAX_WOLVES_SPAWNED ); + break; + case eSpawnResult_FailTooManyMooshrooms: + player->displayClientMessage(IDS_MAX_MOOSHROOMS_SPAWNED ); + break; + case eSpawnResult_FailTooManyMonsters: + player->displayClientMessage(IDS_MAX_ENEMIES_SPAWNED ); + break; + case eSpawnResult_FailTooManyVillagers: + player->displayClientMessage(IDS_MAX_VILLAGERS_SPAWNED ); + break; + case eSpawnResult_FailCantSpawnInPeaceful: + player->displayClientMessage(IDS_CANT_SPAWN_IN_PEACEFUL ); + break; + + } +} \ No newline at end of file diff --git a/Minecraft.World/SpawnEggItem.h b/Minecraft.World/SpawnEggItem.h new file mode 100644 index 00000000..dec0e351 --- /dev/null +++ b/Minecraft.World/SpawnEggItem.h @@ -0,0 +1,48 @@ +#pragma once + +#include "Item.h" + +class SpawnEggItem : public Item +{ +private: + static const int SPAWN_COUNT = 1; + + Icon *overlay; + +public: + + enum _eSpawnResult + { + eSpawnResult_OK=0, + eSpawnResult_FailTooManyPigsCowsSheepCats, + eSpawnResult_FailTooManyChickens, + eSpawnResult_FailTooManySquid, + eSpawnResult_FailTooManyBats, + eSpawnResult_FailTooManyWolves, + eSpawnResult_FailTooManyMooshrooms, + eSpawnResult_FailTooManyAnimals, + eSpawnResult_FailTooManyMonsters, + eSpawnResult_FailTooManyVillagers, + eSpawnResult_FailCantSpawnInPeaceful, + }; + + SpawnEggItem(int id); + + virtual wstring getHoverName(shared_ptr itemInstance); + virtual int getColor(shared_ptr item, int spriteLayer); + virtual bool hasMultipleSpriteLayers(); + virtual Icon *getLayerIcon(int auxValue, int spriteLayer); + virtual bool useOn(shared_ptr itemInstance, shared_ptr player, Level *level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly=false); + virtual shared_ptr use(shared_ptr itemInstance, Level *level, shared_ptr player); + + static shared_ptr spawnMobAt(Level *level, int mobId, double x, double y, double z, int *piResult); // 4J Added piResult param + + // 4J-PB added for dispenser + static shared_ptr canSpawn(int iAuxVal, Level *level, int *piResult); + + // 4J: Added for neatness + static void DisplaySpawnError(shared_ptr player, int result); + + //@Override + void registerIcons(IconRegister *iconRegister); +}; \ No newline at end of file diff --git a/Minecraft.World/Spider.cpp b/Minecraft.World/Spider.cpp index ba58ce54..49997db3 100644 --- a/Minecraft.World/Spider.cpp +++ b/Minecraft.World/Spider.cpp @@ -2,11 +2,14 @@ #include "net.minecraft.world.h" #include "net.minecraft.world.level.h" #include "net.minecraft.world.item.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.item.h" #include "net.minecraft.world.entity.player.h" #include "net.minecraft.world.effect.h" #include "net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.monster.h" #include "com.mojang.nbt.h" +#include "BasicTypeContainers.h" #include "Spider.h" #include "..\Minecraft.Client\Textures.h" #include "SoundTypes.h" @@ -18,13 +21,10 @@ Spider::Spider(Level *level) : Monster( level ) // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that // the derived version of the function is called this->defineSynchedData(); + registerAttributes(); + setHealth(getMaxHealth()); - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that the derived version of the function is called - health = getMaxHealth(); - - this->textureIdx = TN_MOB_SPIDER; // 4J was L"/mob/spider.png"; this->setSize(1.4f, 0.9f); - runSpeed = 0.8f; } void Spider::defineSynchedData() @@ -46,19 +46,12 @@ void Spider::tick() } } -int Spider::getMaxHealth() +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 96771be1..277be1f8 100644 --- a/Minecraft.World/TickNextTickData.cpp +++ b/Minecraft.World/TickNextTickData.cpp @@ -1,5 +1,5 @@ #include "stdafx.h" - +#include "net.minecraft.world.level.tile.h" #include "TickNextTickData.h" int64_t TickNextTickData::C = 0; @@ -13,41 +13,53 @@ TickNextTickData::TickNextTickData(int x, int y, int z, int tileId) this->y = y; this->z = z; this->tileId = tileId; + priorityTilt = 0; } -bool TickNextTickData::equals(const void *o) const +bool TickNextTickData::equals(const TickNextTickData *o) const { // TODO 4J Is this safe to cast it before we do a dynamic_cast? Will the dynamic_cast still fail? // We cannot dynamic_cast a void* - if ( dynamic_cast( (TickNextTickData *) o ) != NULL) + if ( o != NULL) { TickNextTickData *t = (TickNextTickData *) o; - return x == t->x && y == t->y && z == t->z && tileId == t->tileId; + return x == t->x && y == t->y && z == t->z && Tile::isMatching(tileId, t->tileId); } return false; } int TickNextTickData::hashCode() const { - return (((x * 1024 * 1024) + (z * 1024) + y) * 256) + tileId; + return (((x * 1024 * 1024) + (z * 1024) + y) * 256); } TickNextTickData *TickNextTickData::delay(int64_t l) { - this->m_delay = l; + m_delay = l; return this; } +void TickNextTickData::setPriorityTilt(int priorityTilt) +{ + this->priorityTilt = priorityTilt; +} + int TickNextTickData::compareTo(const TickNextTickData *tnd) const { if (m_delay < tnd->m_delay) return -1; if (m_delay > tnd->m_delay) return 1; + if (priorityTilt != tnd->priorityTilt) return priorityTilt - tnd->priorityTilt; if (c < tnd->c) return -1; if (c > tnd->c) return 1; return 0; } +bool TickNextTickData::operator==(const TickNextTickData &k) +{ + return equals( &k ); +} + //A class that takes two arguments of the same type as the container elements and returns a bool. //The expression comp(a,b), where comp is an object of this comparison class and a and b are elements of the container, //shall return true if a is to be placed at an earlier position than b in a strict weak ordering operation. @@ -65,5 +77,5 @@ int TickNextTickData::hash_fnct(const TickNextTickData &k) bool TickNextTickData::eq_test(const TickNextTickData &x, const TickNextTickData &y) { - return ( x.x == y.x ) && ( x.y == y.y ) && ( x.z == y.z ) && ( x.tileId == y.tileId ); + return x.equals(&y); } \ No newline at end of file diff --git a/Minecraft.World/TickNextTickData.h b/Minecraft.World/TickNextTickData.h index c83f6993..04d9ed5e 100644 --- a/Minecraft.World/TickNextTickData.h +++ b/Minecraft.World/TickNextTickData.h @@ -12,7 +12,8 @@ private: public: int x, y, z, tileId; - int64_t m_delay; + __int64 m_delay; + int priorityTilt; private: int64_t c; @@ -20,14 +21,16 @@ private: public: TickNextTickData(int x, int y, int z, int tileId); - bool equals(const void *o) const; + bool equals(const TickNextTickData *o) const; int hashCode() const; - TickNextTickData *delay(int64_t l); + TickNextTickData *delay(__int64 l); + void setPriorityTilt(int priorityTilt); int compareTo(const TickNextTickData *tnd) const; static bool compare_fnct(const TickNextTickData &x, const TickNextTickData &y); static int hash_fnct(const TickNextTickData &k); static bool eq_test(const TickNextTickData &x, const TickNextTickData &y); + bool operator==(const TickNextTickData &k); }; struct TickNextTickDataKeyHash diff --git a/Minecraft.World/Tile.cpp b/Minecraft.World/Tile.cpp index e0ef8dd9..df4e407e 100644 --- a/Minecraft.World/Tile.cpp +++ b/Minecraft.World/Tile.cpp @@ -10,6 +10,7 @@ #include "net.minecraft.world.level.tile.h" #include "net.minecraft.world.level.tile.entity.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.level.redstone.h" #include "net.minecraft.world.phys.h" #include "net.minecraft.world.food.h" #include "net.minecraft.world.h" @@ -43,10 +44,10 @@ bool Tile::propagate[TILE_NUM_COUNT]; Tile **Tile::tiles = NULL; -Tile *Tile::rock = NULL; +Tile *Tile::stone = NULL; GrassTile *Tile::grass = NULL; Tile *Tile::dirt = NULL; -Tile *Tile::stoneBrick = NULL; +Tile *Tile::cobblestone = NULL; Tile *Tile::wood = NULL; Tile *Tile::sapling = NULL; Tile *Tile::unbreakable = NULL; @@ -67,7 +68,7 @@ Tile *Tile::lapisOre = NULL; Tile *Tile::lapisBlock = NULL; Tile *Tile::dispenser = NULL; Tile *Tile::sandStone = NULL; -Tile *Tile::musicBlock = NULL; +Tile *Tile::noteblock = NULL; Tile *Tile::bed = NULL; Tile *Tile::goldenRail = NULL; Tile *Tile::detectorRail = NULL; @@ -77,12 +78,12 @@ TallGrass *Tile::tallgrass = NULL; DeadBushTile *Tile::deadBush = NULL; PistonBaseTile *Tile::pistonBase = NULL; PistonExtensionTile *Tile::pistonExtension = NULL; -Tile *Tile::cloth = NULL; +Tile *Tile::wool = NULL; PistonMovingPiece *Tile::pistonMovingPiece = NULL; Bush *Tile::flower = NULL; Bush *Tile::rose = NULL; -Bush *Tile::mushroom1 = NULL; -Bush *Tile::mushroom2 = NULL; +Bush *Tile::mushroom_brown = NULL; +Bush *Tile::mushroom_red = NULL; Tile *Tile::goldBlock = NULL; Tile *Tile::ironBlock = NULL; HalfSlabTile *Tile::stoneSlab = NULL; @@ -90,7 +91,7 @@ HalfSlabTile *Tile::stoneSlabHalf = NULL; Tile *Tile::redBrick = NULL; Tile *Tile::tnt = NULL; Tile *Tile::bookshelf = NULL; -Tile *Tile::mossStone = NULL; +Tile *Tile::mossyCobblestone = NULL; Tile *Tile::obsidian = NULL; Tile *Tile::torch = NULL; FireTile *Tile::fire = NULL; @@ -101,7 +102,7 @@ RedStoneDustTile *Tile::redStoneDust = NULL; Tile *Tile::diamondOre = NULL; Tile *Tile::diamondBlock = NULL; Tile *Tile::workBench = NULL; -Tile *Tile::crops = NULL; +Tile *Tile::wheat = NULL; Tile *Tile::farmland = NULL; Tile *Tile::furnace = NULL; Tile *Tile::furnace_lit = NULL; @@ -117,8 +118,8 @@ Tile *Tile::door_iron = NULL; Tile *Tile::pressurePlate_wood = NULL; Tile *Tile::redStoneOre = NULL; Tile *Tile::redStoneOre_lit = NULL; -Tile *Tile::notGate_off = NULL; -Tile *Tile::notGate_on = NULL; +Tile *Tile::redstoneTorch_off = NULL; +Tile *Tile::redstoneTorch_on = NULL; Tile *Tile::button = NULL; Tile *Tile::topSnow = NULL; Tile *Tile::ice = NULL; @@ -126,24 +127,24 @@ Tile *Tile::snow = NULL; Tile *Tile::cactus = NULL; Tile *Tile::clay = NULL; Tile *Tile::reeds = NULL; -Tile *Tile::recordPlayer = NULL; +Tile *Tile::jukebox = NULL; Tile *Tile::fence = NULL; Tile *Tile::pumpkin = NULL; -Tile *Tile::hellRock = NULL; -Tile *Tile::hellSand = NULL; -Tile *Tile::lightGem = NULL; +Tile *Tile::netherRack = NULL; +Tile *Tile::soulsand = NULL; +Tile *Tile::glowstone = NULL; PortalTile *Tile::portalTile = NULL; Tile *Tile::litPumpkin = NULL; Tile *Tile::cake = NULL; RepeaterTile *Tile::diode_off = NULL; RepeaterTile *Tile::diode_on = NULL; -Tile *Tile::aprilFoolsJoke = NULL; +Tile *Tile::stained_glass = NULL; Tile *Tile::trapdoor = NULL; Tile *Tile::monsterStoneEgg = NULL; -Tile *Tile::stoneBrickSmooth = NULL; -Tile *Tile::hugeMushroom1 = NULL; -Tile *Tile::hugeMushroom2 = NULL; +Tile *Tile::stoneBrick = NULL; +Tile *Tile::hugeMushroom_brown = NULL; +Tile *Tile::hugeMushroom_red = NULL; Tile *Tile::ironFence = NULL; Tile *Tile::thinGlass = NULL; Tile *Tile::melon = NULL; @@ -165,7 +166,7 @@ Tile *Tile::brewingStand = NULL; CauldronTile *Tile::cauldron = NULL; Tile *Tile::endPortalTile = NULL; Tile *Tile::endPortalFrameTile = NULL; -Tile *Tile::whiteStone = NULL; +Tile *Tile::endStone = NULL; Tile *Tile::dragonEgg = NULL; Tile *Tile::redstoneLight = NULL; Tile *Tile::redstoneLight_lit = NULL; @@ -175,7 +176,8 @@ Tile *Tile::stairs_sandstone = NULL; Tile *Tile::woodStairsDark = NULL; Tile *Tile::woodStairsBirch = NULL; Tile *Tile::woodStairsJungle = NULL; - +Tile *Tile::commandBlock = NULL; +BeaconTile *Tile::beacon = NULL; Tile *Tile::button_wood = NULL; HalfSlabTile *Tile::woodSlab = NULL; HalfSlabTile *Tile::woodSlabHalf = NULL; @@ -185,7 +187,7 @@ Tile *Tile::enderChest = NULL; TripWireSourceTile *Tile::tripWireSource = NULL; Tile *Tile::tripWire = NULL; Tile *Tile::emeraldBlock = NULL; - + Tile *Tile::cocoa = NULL; Tile *Tile::skull = NULL; @@ -195,11 +197,28 @@ Tile *Tile::flowerPot = NULL; Tile *Tile::carrots = NULL; Tile *Tile::potatoes = NULL; Tile *Tile::anvil = NULL; +Tile *Tile::chest_trap = NULL; +Tile *Tile::weightedPlate_light = NULL; +Tile *Tile::weightedPlate_heavy = NULL; +ComparatorTile *Tile::comparator_off = NULL; +ComparatorTile *Tile::comparator_on = NULL; + +DaylightDetectorTile *Tile::daylightDetector = NULL; +Tile *Tile::redstoneBlock = NULL; + Tile *Tile::netherQuartz = NULL; +HopperTile *Tile::hopper = NULL; Tile *Tile::quartzBlock = NULL; Tile *Tile::stairs_quartz = NULL; +Tile *Tile::activatorRail = NULL; +Tile *Tile::dropper = NULL; +Tile *Tile::clayHardened_colored = NULL; +Tile *Tile::stained_glass_pane = NULL; +Tile *Tile::hayBlock = NULL; Tile *Tile::woolCarpet = NULL; +Tile *Tile::clayHardened = NULL; +Tile *Tile::coalBlock = NULL; DWORD Tile::tlsIdxShape = TlsAlloc(); @@ -239,216 +258,219 @@ void Tile::staticCtor() Tile::tiles = new Tile *[TILE_NUM_COUNT]; memset( tiles, 0, sizeof( Tile *)*TILE_NUM_COUNT ); - Tile::rail = (new RailTile(66, false)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_rail, Item::eMaterial_iron)->setDestroyTime(0.7f)->setSoundType(Tile::SOUND_METAL)->setTextureName(L"rail")->setDescriptionId(IDS_TILE_RAIL)->sendTileData()->setUseDescriptionId(IDS_DESC_RAIL)->disableMipmap(); - Tile::goldenRail = (new RailTile(27, true)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_rail, Item::eMaterial_gold)->setDestroyTime(0.7f)->setSoundType(Tile::SOUND_METAL)->setTextureName(L"goldenRail")->setDescriptionId(IDS_TILE_GOLDEN_RAIL)->sendTileData()->setUseDescriptionId(IDS_DESC_POWEREDRAIL)->disableMipmap(); - Tile::detectorRail = (new DetectorRailTile(28)) ->setBaseItemTypeAndMaterial(Item::eBaseItemType_rail, Item::eMaterial_detector)->setDestroyTime(0.7f)->setSoundType(Tile::SOUND_METAL)->setTextureName(L"detectorRail")->setDescriptionId(IDS_TILE_DETECTOR_RAIL)->sendTileData()->setUseDescriptionId(IDS_DESC_DETECTORRAIL)->disableMipmap(); + Tile::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 cce04bdc..b6dd56d9 100644 --- a/Minecraft.World/system.cpp +++ b/Minecraft.World/system.cpp @@ -124,10 +124,9 @@ __int64 System::currentTimeMillis() __int64 System::currentRealTimeMillis() { #ifdef __PSVITA__ - SceDateTime Time; - sceRtcGetCurrentClockLocalTime(&Time); - __int64 systTime = (((((((Time.day * 24) + Time.hour) * 60) + Time.minute) * 60) + Time.second) * 1000) + (Time.microsecond / 1000); - return systTime; + SceFiosDate fileTime = sceFiosDateGetCurrent(); + + return fileTime/1000000; #else return currentTimeMillis(); #endif diff --git a/Minecraft.World/x64headers/extraX64.h b/Minecraft.World/x64headers/extraX64.h index d06b2420..2205ae05 100644 --- a/Minecraft.World/x64headers/extraX64.h +++ b/Minecraft.World/x64headers/extraX64.h @@ -50,9 +50,9 @@ typedef SQRNetworkManager::PresenceSyncInfo INVITE_INFO; #include #include #include -#include "..\..\Minecraft.Client\PSVita\PSVita_PlayerUID.h" #include "..\..\Minecraft.Client\PSVita\Network\SQRNetworkManager_Vita.h" #include "..\..\Minecraft.Client\PSVita\Network\SQRNetworkManager_AdHoc_Vita.h" +#include "..\..\Minecraft.Client\PSVita\4JLibs\inc\4J_Profile.h" typedef SQRNetworkManager_Vita::SessionID SessionID; typedef SQRNetworkManager_Vita::PresenceSyncInfo INVITE_INFO; @@ -70,7 +70,7 @@ class INVITE_INFO; #endif // __PS3__ -#ifndef _DURANGO +#if !(defined _DURANGO || defined __PSVITA__) typedef PlayerUID *PPlayerUID; #endif typedef struct _XUIOBJ* HXUIOBJ; @@ -332,6 +332,7 @@ void XSetThreadProcessor(HANDLE a, int b); const int QNET_SENDDATA_LOW_PRIORITY = 0; const int QNET_SENDDATA_SECONDARY = 0; + #if defined(__PS3__) || defined(__ORBIS__) || defined(_DURANGO) || defined(__PSVITA__) #define INVALID_XUID PlayerUID() #else @@ -560,7 +561,7 @@ const int XC_LANGUAGE_DUTCH =0x10; const int XC_LANGUAGE_SCHINESE =0x11; // for Sony -const int XC_LANGUAGE_LATINAMERICANSPANISH =0xF0; +// const int XC_LANGUAGE_LATINAMERICANSPANISH =0xF0; // 4J-JEV: Now differentiated via XC_LOCALE_LATIN_AMERICA const int XC_LANGUAGE_FINISH =0xF1; const int XC_LANGUAGE_GREEK =0xF2; const int XC_LANGUAGE_DANISH =0xF3; diff --git a/README.md b/README.md index f32b11fc..abbbb2d5 100644 --- a/README.md +++ b/README.md @@ -59,3 +59,7 @@ cmake --build build --config Debug --target MinecraftClient - Builds for other platforms have not been tested and are most likely non-functional - There are some render bugs in the Release mode build + +## Star History + +[![Star History Chart](https://api.star-history.com/svg?repos=smartcmd/MinecraftConsoles&type=date&legend=top-left)](https://www.star-history.com/?spm=a2c6h.12873639.article-detail.7.7b9d7fabjNxTRk#smartcmd/MinecraftConsoles&type=date&legend=top-left) diff --git a/cmake/ClientSources.cmake b/cmake/ClientSources.cmake index dae96fd4..f56b7ef0 100644 --- a/cmake/ClientSources.cmake +++ b/cmake/ClientSources.cmake @@ -1,21 +1,25 @@ set(MINECRAFT_CLIENT_SOURCES "AbstractTexturePack.cpp" - "crt_compat.cpp" "AchievementPopup.cpp" "AchievementScreen.cpp" "AllowAllCuller.cpp" "ArchiveFile.cpp" "ArrowRenderer.cpp" + "BatModel.cpp" + "BatRenderer.cpp" + "BeaconRenderer.cpp" "BlazeModel.cpp" "BlazeRenderer.cpp" "BoatModel.cpp" "BoatRenderer.cpp" "BookModel.cpp" + "BossMobGuiInfo.cpp" "BreakingItemParticle.cpp" "BubbleParticle.cpp" "BufferedImage.cpp" "Button.cpp" "Camera.cpp" + "CaveSpiderRenderer.cpp" "ChatScreen.cpp" "ChestModel.cpp" "ChestRenderer.cpp" @@ -29,6 +33,8 @@ set(MINECRAFT_CLIENT_SOURCES "Common/Audio/SoundEngine.cpp" "Common/Audio/SoundNames.cpp" "Common/Colours/ColourTable.cpp" + "Common/ConsoleGameMode.cpp" + "Common/Console_Utils.cpp" "Common/Consoles_App.cpp" "Common/DLC/DLCAudioFile.cpp" "Common/DLC/DLCCapeFile.cpp" @@ -49,6 +55,8 @@ set(MINECRAFT_CLIENT_SOURCES "Common/GameRules/CollectItemRuleDefinition.cpp" "Common/GameRules/CompleteAllRuleDefinition.cpp" "Common/GameRules/CompoundGameRuleDefinition.cpp" + "Common/GameRules/ConsoleGenerateStructure.cpp" + "Common/GameRules/ConsoleSchematicFile.cpp" "Common/GameRules/GameRule.cpp" "Common/GameRules/GameRuleDefinition.cpp" "Common/GameRules/GameRuleManager.cpp" @@ -60,12 +68,11 @@ set(MINECRAFT_CLIENT_SOURCES "Common/GameRules/StartFeature.cpp" "Common/GameRules/UpdatePlayerRuleDefinition.cpp" "Common/GameRules/UseTileRuleDefinition.cpp" - "Common/GameRules/ConsoleGenerateStructure.cpp" - "Common/GameRules/ConsoleSchematicFile.cpp" "Common/GameRules/XboxStructureActionGenerateBox.cpp" "Common/GameRules/XboxStructureActionPlaceBlock.cpp" "Common/GameRules/XboxStructureActionPlaceContainer.cpp" "Common/GameRules/XboxStructureActionPlaceSpawner.cpp" + "Common/Leaderboards/LeaderboardInterface.cpp" "Common/Leaderboards/LeaderboardManager.cpp" "Common/Network/GameNetworkManager.cpp" "Common/Network/PlatformNetworkManagerStub.cpp" @@ -84,6 +91,7 @@ set(MINECRAFT_CLIENT_SOURCES "Common/Tutorial/FullTutorial.cpp" "Common/Tutorial/FullTutorialActiveTask.cpp" "Common/Tutorial/FullTutorialMode.cpp" + "Common/Tutorial/HorseChoiceTask.cpp" "Common/Tutorial/InfoTask.cpp" "Common/Tutorial/InputConstraint.cpp" "Common/Tutorial/LookAtEntityHint.cpp" @@ -91,6 +99,7 @@ set(MINECRAFT_CLIENT_SOURCES "Common/Tutorial/PickupTask.cpp" "Common/Tutorial/ProcedureCompoundTask.cpp" "Common/Tutorial/ProgressFlagTask.cpp" + "Common/Tutorial/RideEntityTask.cpp" "Common/Tutorial/StatTask.cpp" "Common/Tutorial/TakeItemHint.cpp" "Common/Tutorial/Tutorial.cpp" @@ -101,100 +110,112 @@ set(MINECRAFT_CLIENT_SOURCES "Common/Tutorial/UseItemTask.cpp" "Common/Tutorial/UseTileTask.cpp" "Common/Tutorial/XuiCraftingTask.cpp" - "Common/ConsoleGameMode.cpp" - "Common/Console_Utils.cpp" "Common/UI/IUIScene_AbstractContainerMenu.cpp" "Common/UI/IUIScene_AnvilMenu.cpp" + "Common/UI/IUIScene_BeaconMenu.cpp" "Common/UI/IUIScene_BrewingMenu.cpp" + "Common/UI/IUIScene_CommandBlockMenu.cpp" "Common/UI/IUIScene_ContainerMenu.cpp" "Common/UI/IUIScene_CraftingMenu.cpp" "Common/UI/IUIScene_CreativeMenu.cpp" "Common/UI/IUIScene_DispenserMenu.cpp" "Common/UI/IUIScene_EnchantingMenu.cpp" + "Common/UI/IUIScene_FireworksMenu.cpp" "Common/UI/IUIScene_FurnaceMenu.cpp" + "Common/UI/IUIScene_HUD.cpp" + "Common/UI/IUIScene_HopperMenu.cpp" + "Common/UI/IUIScene_HorseInventoryMenu.cpp" "Common/UI/IUIScene_InventoryMenu.cpp" "Common/UI/IUIScene_PauseMenu.cpp" "Common/UI/IUIScene_StartGame.cpp" "Common/UI/IUIScene_TradingMenu.cpp" + "Common/UI/UIBitmapFont.cpp" + "Common/UI/UIComponent_Chat.cpp" + "Common/UI/UIComponent_DebugUIConsole.cpp" "Common/UI/UIComponent_DebugUIMarketingGuide.cpp" - "Common/UI/UIScene_Keyboard.cpp" + "Common/UI/UIComponent_Logo.cpp" "Common/UI/UIComponent_MenuBackground.cpp" + "Common/UI/UIComponent_Panorama.cpp" "Common/UI/UIComponent_PressStartToPlay.cpp" + "Common/UI/UIComponent_Tooltips.cpp" + "Common/UI/UIComponent_TutorialPopup.cpp" + "Common/UI/UIControl.cpp" "Common/UI/UIControl_Base.cpp" + "Common/UI/UIControl_BeaconEffectButton.cpp" "Common/UI/UIControl_BitmapIcon.cpp" + "Common/UI/UIControl_Button.cpp" + "Common/UI/UIControl_ButtonList.cpp" + "Common/UI/UIControl_CheckBox.cpp" + "Common/UI/UIControl_Cursor.cpp" "Common/UI/UIControl_DLCList.cpp" "Common/UI/UIControl_DynamicLabel.cpp" "Common/UI/UIControl_EnchantmentBook.cpp" "Common/UI/UIControl_EnchantmentButton.cpp" "Common/UI/UIControl_HTMLLabel.cpp" + "Common/UI/UIControl_Label.cpp" "Common/UI/UIControl_LeaderboardList.cpp" + "Common/UI/UIControl_MinecraftHorse.cpp" "Common/UI/UIControl_MinecraftPlayer.cpp" "Common/UI/UIControl_PlayerList.cpp" - "Common/UI/UIControl_SaveList.cpp" - "Common/UI/UIControl_SpaceIndicatorBar.cpp" - "Common/UI/UIControl_TexturePackList.cpp" - "Common/UI/UIFontData.cpp" - "Common/UI/UIScene_AnvilMenu.cpp" - "Common/UI/UIScene_ControlsMenu.cpp" - "Common/UI/UIScene_Credits.cpp" - "Common/UI/UIScene_DebugCreateSchematic.cpp" - "Common/UI/UIScene_DebugSetCamera.cpp" - "Common/UI/UIScene_DLCMainMenu.cpp" - "Common/UI/UIScene_DLCOffersMenu.cpp" - "Common/UI/UIScene_EndPoem.cpp" - "Common/UI/UIScene_EULA.cpp" - "Common/UI/UIScene_HowToPlay.cpp" - "Common/UI/UIScene_InGameHostOptionsMenu.cpp" - "Common/UI/UIScene_InGameInfoMenu.cpp" - "Common/UI/UIScene_InGamePlayerOptionsMenu.cpp" - "Common/UI/UIScene_LeaderboardsMenu.cpp" - "Common/UI/UIScene_MessageBox.cpp" - "Common/UI/UIBitmapFont.cpp" - "Common/UI/UIComponent_Chat.cpp" - "Common/UI/UIComponent_DebugUIConsole.cpp" - "Common/UI/UIComponent_Logo.cpp" - "Common/UI/UIComponent_Panorama.cpp" - "Common/UI/UIComponent_Tooltips.cpp" - "Common/UI/UIComponent_TutorialPopup.cpp" - "Common/UI/UIControl.cpp" - "Common/UI/UIController.cpp" - "Common/UI/UIControl_Button.cpp" - "Common/UI/UIControl_CheckBox.cpp" - "Common/UI/UIControl_Cursor.cpp" - "Common/UI/UIControl_Label.cpp" "Common/UI/UIControl_PlayerSkinPreview.cpp" "Common/UI/UIControl_Progress.cpp" - "Common/UI/UIControl_ButtonList.cpp" + "Common/UI/UIControl_SaveList.cpp" "Common/UI/UIControl_Slider.cpp" "Common/UI/UIControl_SlotList.cpp" + "Common/UI/UIControl_SpaceIndicatorBar.cpp" "Common/UI/UIControl_TextInput.cpp" + "Common/UI/UIControl_TexturePackList.cpp" + "Common/UI/UIController.cpp" + "Common/UI/UIFontData.cpp" "Common/UI/UIGroup.cpp" "Common/UI/UILayer.cpp" "Common/UI/UIScene.cpp" "Common/UI/UIScene_AbstractContainerMenu.cpp" + "Common/UI/UIScene_AnvilMenu.cpp" + "Common/UI/UIScene_BeaconMenu.cpp" "Common/UI/UIScene_BrewingStandMenu.cpp" "Common/UI/UIScene_ConnectingProgress.cpp" "Common/UI/UIScene_ContainerMenu.cpp" + "Common/UI/UIScene_ControlsMenu.cpp" "Common/UI/UIScene_CraftingMenu.cpp" "Common/UI/UIScene_CreateWorldMenu.cpp" "Common/UI/UIScene_CreativeMenu.cpp" + "Common/UI/UIScene_Credits.cpp" + "Common/UI/UIScene_DLCMainMenu.cpp" + "Common/UI/UIScene_DLCOffersMenu.cpp" "Common/UI/UIScene_DeathMenu.cpp" + "Common/UI/UIScene_DebugCreateSchematic.cpp" "Common/UI/UIScene_DebugOptions.cpp" "Common/UI/UIScene_DebugOverlay.cpp" + "Common/UI/UIScene_DebugSetCamera.cpp" "Common/UI/UIScene_DispenserMenu.cpp" + "Common/UI/UIScene_EULA.cpp" "Common/UI/UIScene_EnchantingMenu.cpp" + "Common/UI/UIScene_EndPoem.cpp" + "Common/UI/UIScene_FireworksMenu.cpp" "Common/UI/UIScene_FullscreenProgress.cpp" "Common/UI/UIScene_FurnaceMenu.cpp" - "Common/UI/UIScene_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,24 @@ set(MINECRAFT_CLIENT_SOURCES "VillagerZombieModel.cpp" "WaterDropParticle.cpp" "Windows64/Iggy/gdraw/gdraw_d3d11.cpp" + "Windows64/KeyboardMouseInput.cpp" "Windows64/Leaderboards/WindowsLeaderboardManager.cpp" "Windows64/Windows64_App.cpp" "Windows64/Windows64_Minecraft.cpp" - "Windows64/KeyboardMouseInput.cpp" "Windows64/Windows64_UIController.cpp" + "WitchModel.cpp" + "WitchRenderer.cpp" + "WitherBossModel.cpp" + "WitherBossRenderer.cpp" + "WitherSkullRenderer.cpp" "WolfModel.cpp" "WolfRenderer.cpp" "WstringLookup.cpp" "Xbox/Network/NetworkPlayerXbox.cpp" "ZombieModel.cpp" "ZombieRenderer.cpp" + "compat_shims.cpp" + "glWrapper.cpp" + "stdafx.cpp" + "stubs.cpp" ) diff --git a/cmake/WorldSources.cmake b/cmake/WorldSources.cmake index 3fca57b6..cd6c1b81 100644 --- a/cmake/WorldSources.cmake +++ b/cmake/WorldSources.cmake @@ -1,7 +1,9 @@ set(MINECRAFT_WORLD_SOURCES "AABB.cpp" "Abilities.cpp" + "AbsoptionMobEffect.cpp" "AbstractContainerMenu.cpp" + "AbstractProjectileDispenseBehavior.cpp" "Achievement.cpp" "Achievements.cpp" "AddEntityPacket.cpp" @@ -15,8 +17,11 @@ set(MINECRAFT_WORLD_SOURCES "AddSnowLayer.cpp" "AgableMob.cpp" "AirTile.cpp" + "AmbientCreature.cpp" "Animal.cpp" + "AnimalChest.cpp" "AnimatePacket.cpp" + "AnvilMenu.cpp" "AnvilTile.cpp" "AnvilTileItem.cpp" "ArmorDyeRecipe.cpp" @@ -24,20 +29,33 @@ set(MINECRAFT_WORLD_SOURCES "ArmorRecipes.cpp" "ArmorSlot.cpp" "Arrow.cpp" - "ArrowAttackGoal.cpp" "ArrowDamageEnchantment.cpp" "ArrowFireEnchantment.cpp" "ArrowInfiniteEnchantment.cpp" "ArrowKnockbackEnchantment.cpp" + "AttackDamageMobEffect.cpp" + "Attribute.cpp" + "AttributeModifier.cpp" "AuxDataTileItem.cpp" "AvoidPlayerGoal.cpp" "AwardStatPacket.cpp" + "BaseAttribute.cpp" + "BaseAttributeMap.cpp" + "BaseEntityTile.cpp" + "BaseMobSpawner.cpp" + "BasePressurePlateTile.cpp" + "BaseRailTile.cpp" "BasicTree.cpp" "BasicTypeContainers.cpp" + "Bat.cpp" "BeachBiome.cpp" + "BeaconMenu.cpp" + "BeaconTile.cpp" + "BeaconTileEntity.cpp" "BedItem.cpp" "BedTile.cpp" "BegGoal.cpp" + "BehaviorRegistry.cpp" "BinaryHeap.cpp" "Biome.cpp" "BiomeCache.cpp" @@ -51,14 +69,13 @@ set(MINECRAFT_WORLD_SOURCES "BlockGenMethods.cpp" "BlockRegionUpdatePacket.cpp" "BlockReplacements.cpp" + "BlockSourceImpl.cpp" "Boat.cpp" "BoatItem.cpp" "BodyControl.cpp" "BonusChestFeature.cpp" "BookItem.cpp" "BookshelfTile.cpp" - "BossMob.cpp" - "BossMobPart.cpp" "BottleItem.cpp" "BoundingBox.cpp" "BowItem.cpp" @@ -77,9 +94,11 @@ set(MINECRAFT_WORLD_SOURCES "ByteArrayInputStream.cpp" "ByteArrayOutputStream.cpp" "ByteBuffer.cpp" + "C4JThread.cpp" "CactusFeature.cpp" "CactusTile.cpp" "CakeTile.cpp" + "Calendar.cpp" "CanyonFeature.cpp" "CarrotOnAStickItem.cpp" "CarrotTile.cpp" @@ -102,29 +121,35 @@ set(MINECRAFT_WORLD_SOURCES "ClientSideMerchant.cpp" "ClockItem.cpp" "ClothDyeRecipes.cpp" - "ClothTile.cpp" - "ClothTileItem.cpp" "CoalItem.cpp" "CocoaTile.cpp" "Color.cpp" + "ColoredTile.cpp" "ColoredTileItem.cpp" + "CombatEntry.cpp" + "CombatTracker.cpp" "Command.cpp" + "CommandBlock.cpp" + "CommandBlockEntity.cpp" "CommandDispatcher.cpp" "CommonStats.cpp" + "ComparatorTile.cpp" + "ComparatorTileEntity.cpp" "CompassItem.cpp" "ComplexItem.cpp" "ComplexItemDataPacket.cpp" "CompoundContainer.cpp" "CompressedTileStorage.cpp" - "compression.cpp" "Connection.cpp" "ConsoleSaveFileConverter.cpp" + "ConsoleSaveFileInputStream.cpp" "ConsoleSaveFileOriginal.cpp" - "Container.cpp" + "ConsoleSaveFileOutputStream.cpp" "ContainerAckPacket.cpp" "ContainerButtonClickPacket.cpp" "ContainerClickPacket.cpp" "ContainerClosePacket.cpp" + "ContainerMenu.cpp" "ContainerOpenPacket.cpp" "ContainerSetContentPacket.cpp" "ContainerSetDataPacket.cpp" @@ -132,21 +157,9 @@ set(MINECRAFT_WORLD_SOURCES "ControlledByPlayerGoal.cpp" "CoralTile.cpp" "Cow.cpp" + "CraftItemPacket.cpp" "CraftingContainer.cpp" "CraftingMenu.cpp" - "DefaultGameModeCommand.cpp" - "EnchantItemCommand.cpp" - "ExperienceCommand.cpp" - "GameCommandPacket.cpp" - "GameModeCommand.cpp" - "GenericStats.cpp" - "GiveItemCommand.cpp" - "KillCommand.cpp" - "PerformanceTimer.cpp" - "TimeCommand.cpp" - "ToggleDownfallCommand.cpp" - "TradeItemPacket.cpp" - "CraftItemPacket.cpp" "Creature.cpp" "Creeper.cpp" "CropTile.cpp" @@ -157,9 +170,13 @@ set(MINECRAFT_WORLD_SOURCES "DataInputStream.cpp" "DataLayer.cpp" "DataOutputStream.cpp" + "DaylightDetectorTile.cpp" + "DaylightDetectorTileEntity.cpp" "DeadBushFeature.cpp" "DeadBushTile.cpp" "DebugOptionsPacket.cpp" + "DefaultDispenseItemBehavior.cpp" + "DefaultGameModeCommand.cpp" "DefendVillageTargetGoal.cpp" "DelayedRelease.cpp" "DerivedLevelData.cpp" @@ -177,13 +194,30 @@ set(MINECRAFT_WORLD_SOURCES "DirectoryLevelStorageSource.cpp" "DirtTile.cpp" "DisconnectPacket.cpp" + "DispenseItemBehavior.cpp" "DispenserTile.cpp" "DispenserTileEntity.cpp" + "Distort.cpp" "DoorInfo.cpp" "DoorInteractGoal.cpp" + "DoorItem.cpp" + "DoorTile.cpp" + "DownfallLayer.cpp" + "DownfallMixerLayer.cpp" "DragonFireball.cpp" + "DropperTile.cpp" + "DropperTileEntity.cpp" + "DummyCriteria.cpp" + "DungeonFeature.cpp" + "DyePowderItem.cpp" "EatTileGoal.cpp" + "EffectCommand.cpp" + "EggItem.cpp" "EggTile.cpp" + "Emboss.cpp" + "EmptyLevelChunk.cpp" + "EmptyMapItem.cpp" + "EnchantItemCommand.cpp" "EnchantedBookItem.cpp" "Enchantment.cpp" "EnchantmentCategory.cpp" @@ -193,206 +227,69 @@ set(MINECRAFT_WORLD_SOURCES "EnchantmentMenu.cpp" "EnchantmentTableEntity.cpp" "EnchantmentTableTile.cpp" + "EndPodiumFeature.cpp" "EnderChestTile.cpp" "EnderChestTileEntity.cpp" - "EnderEyeItem.cpp" - "EnderpearlItem.cpp" - "EndPodiumFeature.cpp" - "ExperienceItem.cpp" - "ExtremeHillsBiome.cpp" - "Feature.cpp" "EnderCrystal.cpp" "EnderDragon.cpp" - "EyeOfEnderSignal.cpp" - "FireAspectEnchantment.cpp" - "FireChargeItem.cpp" - "FleeSunGoal.cpp" - "FlippedIcon.cpp" - "FloatGoal.cpp" - "FlowerPotTile.cpp" - "FollowOwnerGoal.cpp" - "FollowParentGoal.cpp" - "Goal.cpp" - "GoalSelector.cpp" - "GoldenAppleItem.cpp" - "Golem.cpp" - "GroundBushFeature.cpp" - "GrowMushroomIslandLayer.cpp" - "HalfSlabTile.cpp" - "HangingEntity.cpp" - "HangingEntityItem.cpp" - "HellFlatLevelSource.cpp" - "HurtByTargetGoal.cpp" - "IceBiome.cpp" - "InteractGoal.cpp" - "ItemFrame.cpp" - "JumpControl.cpp" - "JungleBiome.cpp" - "KickPlayerPacket.cpp" - "KnockbackEnchantment.cpp" - "LavaSlime.cpp" - "LeapAtTargetGoal.cpp" - "LevelSoundPacket.cpp" - "LookAtPlayerGoal.cpp" - "LookAtTradingPlayerGoal.cpp" - "LookControl.cpp" - "LootBonusEnchantment.cpp" - "MakeLoveGoal.cpp" - "MegaTreeFeature.cpp" - "MeleeAttackGoal.cpp" - "MerchantContainer.cpp" - "MerchantMenu.cpp" - "MerchantRecipe.cpp" - "MerchantRecipeList.cpp" - "MerchantResultSlot.cpp" - "MilkBucketItem.cpp" - "MonsterPlacerItem.cpp" - "MoveControl.cpp" - "MoveIndoorsGoal.cpp" - "MoveThroughVillageGoal.cpp" - "MoveTowardsRestrictionGoal.cpp" - "MoveTowardsTargetGoal.cpp" - "MultiTextureTileItem.cpp" - "MushroomCow.cpp" - "MushroomIslandBiome.cpp" - "MycelTile.cpp" - "NearestAttackableTargetGoal.cpp" - "NetherBridgeFeature.cpp" - "NetherBridgePieces.cpp" - "NetherStalkTile.cpp" - "NonTameRandomTargetGoal.cpp" - "Npc.cpp" - "OcelotSitOnTileGoal.cpp" - "OfferFlowerGoal.cpp" - "OpenDoorGoal.cpp" - "OwnerHurtByTargetGoal.cpp" - "OwnerHurtTargetGoal.cpp" - "OxygenEnchantment.cpp" - "Ozelot.cpp" - "OzelotAttackGoal.cpp" - "PanicGoal.cpp" - "PathNavigation.cpp" - "PlayerAbilitiesPacket.cpp" - "PlayerEnderChestContainer.cpp" - "PlayGoal.cpp" - "PotatoTile.cpp" - "PotionBrewing.cpp" - "PotionItem.cpp" - "ProtectionEnchantment.cpp" - "QuartzBlockTile.cpp" - "RandomLookAroundGoal.cpp" - "RandomPos.cpp" - "RandomScatteredLargeFeature.cpp" - "RandomStrollGoal.cpp" - "Rarity.cpp" - "RedlightTile.cpp" - "RegionHillsLayer.cpp" - "RepairContainer.cpp" - "RepairMenu.cpp" - "RepairResultSlot.cpp" - "RestrictOpenDoorGoal.cpp" - "RestrictSunGoal.cpp" - "RotateHeadPacket.cpp" - "ScatteredFeaturePieces.cpp" - "SeedFoodItem.cpp" - "Sensing.cpp" - "SitGoal.cpp" - "SkullItem.cpp" - "SkullTile.cpp" - "SkullTileEntity.cpp" - "SparseDataStorage.cpp" - "SwampRiversLayer.cpp" - "SwellGoal.cpp" - "TakeFlowerGoal.cpp" - "TamableAnimal.cpp" - "TargetGoal.cpp" - "TemptGoal.cpp" - "ThornsEnchantment.cpp" - "TileDestructionPacket.cpp" - "TileEventData.cpp" - "TradeWithPlayerGoal.cpp" - "TripWireSourceTile.cpp" - "TripWireTile.cpp" - "Village.cpp" - "VillagerGolem.cpp" - "Villages.cpp" - "VillageSiege.cpp" - "VinesFeature.cpp" - "WallTile.cpp" - "WeighedTreasure.cpp" - "WoodSlabTile.cpp" - "C4JThread.cpp" - "WoodTile.cpp" - "WoolCarpetTile.cpp" - "XZPacket.cpp" - "ShoreLayer.cpp" - "SmoothStoneBrickTileItem.cpp" - "SparseLightStorage.cpp" - "SpikeFeature.cpp" - "NetherSphere.cpp" - "SmallFireball.cpp" - "SnowMan.cpp" - "StoneMonsterTileItem.cpp" - "TextureAndGeometryChangePacket.cpp" - "TextureAndGeometryPacket.cpp" - "TheEndBiome.cpp" - "TheEndBiomeDecorator.cpp" - "TheEndDimension.cpp" - "TheEndLevelRandomLevelSource.cpp" - "TheEndPortal.cpp" - "TheEndPortalFrameTile.cpp" - "TheEndPortalTileEntity.cpp" - "Throwable.cpp" - "ThrownEnderpearl.cpp" - "ThrownExpBottle.cpp" - "ThrownPotion.cpp" - "TileEntityDataPacket.cpp" - "UntouchingEnchantment.cpp" - "UpdateGameRuleProgressPacket.cpp" - "Distort.cpp" - "DoorItem.cpp" - "DoorTile.cpp" - "DownfallLayer.cpp" - "DownfallMixerLayer.cpp" - "DungeonFeature.cpp" - "DyePowderItem.cpp" - "EggItem.cpp" - "Emboss.cpp" - "EmptyLevelChunk.cpp" + "EnderEyeItem.cpp" "EnderMan.cpp" + "EnderpearlItem.cpp" "Enemy.cpp" "Entity.cpp" "EntityActionAtPositionPacket.cpp" "EntityDamageSource.cpp" "EntityEventPacket.cpp" + "EntityHorse.cpp" "EntityIO.cpp" "EntityPos.cpp" - "EntityTile.cpp" + "EntitySelector.cpp" + "ExperienceCommand.cpp" + "ExperienceItem.cpp" "ExperienceOrb.cpp" "ExplodePacket.cpp" "Explosion.cpp" + "ExtremeHillsBiome.cpp" + "EyeOfEnderSignal.cpp" "Facing.cpp" + "FacingEnum.cpp" "FallingTile.cpp" "FarmTile.cpp" "FastNoise.cpp" + "Feature.cpp" "FenceGateTile.cpp" "FenceTile.cpp" "File.cpp" "FileHeader.cpp" "FileInputStream.cpp" "FileOutputStream.cpp" - "Fireball.cpp" + "FireAspectEnchantment.cpp" + "FireChargeItem.cpp" "FireTile.cpp" + "Fireball.cpp" + "FireworksChargeItem.cpp" + "FireworksItem.cpp" + "FireworksMenu.cpp" + "FireworksRecipe.cpp" + "FireworksRocketEntity.cpp" "FishingHook.cpp" "FishingRodItem.cpp" "FixedBiomeSource.cpp" + "FlatGeneratorInfo.cpp" "FlatLayer.cpp" + "FlatLayerInfo.cpp" "FlatLevelSource.cpp" + "FleeSunGoal.cpp" "FlintAndSteelItem.cpp" + "FlippedIcon.cpp" "FloatBuffer.cpp" + "FloatGoal.cpp" "FlowerFeature.cpp" + "FlowerPotTile.cpp" "FlyingMob.cpp" "FoliageColor.cpp" + "FollowOwnerGoal.cpp" + "FollowParentGoal.cpp" "FoodConstants.cpp" "FoodData.cpp" "FoodItem.cpp" @@ -404,96 +301,156 @@ set(MINECRAFT_WORLD_SOURCES "FurnaceTile.cpp" "FurnaceTileEntity.cpp" "FuzzyZoomLayer.cpp" + "GameCommandPacket.cpp" "GameEventPacket.cpp" + "GameModeCommand.cpp" + "GameRules.cpp" "GeneralStat.cpp" + "GenericStats.cpp" "GetInfoPacket.cpp" "Ghast.cpp" "Giant.cpp" + "GiveItemCommand.cpp" "GlassTile.cpp" "GlobalEntity.cpp" + "GlowstoneTile.cpp" + "Goal.cpp" + "GoalSelector.cpp" + "GoldenAppleItem.cpp" + "Golem.cpp" "GrassColor.cpp" "GrassTile.cpp" "GravelTile.cpp" + "GroundBushFeature.cpp" + "GrowMushroomIslandLayer.cpp" + "HalfSlabTile.cpp" "HalfTransparentTile.cpp" + "HangingEntity.cpp" + "HangingEntityItem.cpp" "Hasher.cpp" "HatchetItem.cpp" + "HayBlockTile.cpp" + "HealthBoostMobEffect.cpp" + "HealthCriteria.cpp" + "HeavyTile.cpp" "HellBiome.cpp" "HellDimension.cpp" "HellFireFeature.cpp" + "HellFlatLevelSource.cpp" "HellPortalFeature.cpp" "HellRandomLevelSource.cpp" - "HellSandTile.cpp" "HellSpringFeature.cpp" - "HellStoneTile.cpp" "HitResult.cpp" "HoeItem.cpp" + "HopperMenu.cpp" + "HopperTile.cpp" + "HopperTileEntity.cpp" + "HorseInventoryMenu.cpp" "HouseFeature.cpp" + "HtmlString.cpp" "HugeMushroomFeature.cpp" "HugeMushroomTile.cpp" + "HurtByTargetGoal.cpp" "I18n.cpp" + "IceBiome.cpp" "IceTile.cpp" "ImprovedNoise.cpp" - "ContainerMenu.cpp" "IndirectEntityDamageSource.cpp" "InputStream.cpp" "InputStreamReader.cpp" "InstantenousMobEffect.cpp" "IntBuffer.cpp" "IntCache.cpp" + "InteractGoal.cpp" "InteractPacket.cpp" "Inventory.cpp" "InventoryMenu.cpp" "IslandLayer.cpp" "Item.cpp" + "ItemDispenseBehaviors.cpp" "ItemEntity.cpp" + "ItemFrame.cpp" "ItemInstance.cpp" "ItemStat.cpp" + "JavaMath.cpp" + "JukeboxTile.cpp" + "JumpControl.cpp" + "JungleBiome.cpp" "KeepAlivePacket.cpp" + "KickPlayerPacket.cpp" + "KillCommand.cpp" + "KnockbackEnchantment.cpp" "LadderTile.cpp" "LakeFeature.cpp" "Language.cpp" "LargeCaveFeature.cpp" "LargeFeature.cpp" + "LargeFireball.cpp" "LargeHellCaveFeature.cpp" + "LavaSlime.cpp" "Layer.cpp" "LeafTile.cpp" "LeafTileItem.cpp" - "LevelConflictException.cpp" - "LevelData.cpp" + "LeapAtTargetGoal.cpp" + "LeashFenceKnotEntity.cpp" + "LeashItem.cpp" "Level.cpp" "LevelChunk.cpp" + "LevelConflictException.cpp" + "LevelData.cpp" "LevelEventPacket.cpp" + "LevelParticlesPacket.cpp" "LevelSettings.cpp" + "LevelSoundPacket.cpp" "LevelStorage.cpp" "LevelStorageProfilerDecorator.cpp" "LevelSummary.cpp" "LevelType.cpp" "LeverTile.cpp" "LightGemFeature.cpp" - "LightGemTile.cpp" "LightningBolt.cpp" "LiquidTile.cpp" "LiquidTileDynamic.cpp" "LiquidTileStatic.cpp" + "LivingEntity.cpp" "LockedChestTile.cpp" "LoginPacket.cpp" + "LookAtPlayerGoal.cpp" + "LookAtTradingPlayerGoal.cpp" + "LookControl.cpp" + "LootBonusEnchantment.cpp" + "MakeLoveGoal.cpp" "MapItem.cpp" "MapItemSavedData.cpp" "Material.cpp" "MaterialColor.cpp" - "JavaMath.cpp" "McRegionChunkStorage.cpp" - "McRegionLevelStorageSource.cpp" "McRegionLevelStorage.cpp" + "McRegionLevelStorageSource.cpp" + "MegaTreeFeature.cpp" + "MeleeAttackGoal.cpp" "MelonTile.cpp" "MenuBackup.cpp" + "MerchantContainer.cpp" + "MerchantMenu.cpp" + "MerchantRecipe.cpp" + "MerchantRecipeList.cpp" + "MerchantResultSlot.cpp" "MetalTile.cpp" - "Minecart.cpp" - "MinecartItem.cpp" - "Minecraft.World.cpp" + "MilkBucketItem.cpp" "MineShaftFeature.cpp" "MineShaftPieces.cpp" "MineShaftStart.cpp" + "Minecart.cpp" + "MinecartChest.cpp" + "MinecartContainer.cpp" + "MinecartFurnace.cpp" + "MinecartHopper.cpp" + "MinecartItem.cpp" + "MinecartRideable.cpp" + "MinecartSpawner.cpp" + "MinecartTNT.cpp" + "Minecraft.World.cpp" "Mob.cpp" "MobCategory.cpp" "MobEffect.cpp" @@ -502,29 +459,62 @@ set(MINECRAFT_WORLD_SOURCES "MobSpawnerTile.cpp" "MobSpawnerTileEntity.cpp" "MockedLevelStorage.cpp" + "ModifiableAttributeInstance.cpp" "Monster.cpp" "MonsterRoomFeature.cpp" + "MoveControl.cpp" "MoveEntityPacket.cpp" "MoveEntityPacketSmall.cpp" + "MoveIndoorsGoal.cpp" "MovePlayerPacket.cpp" + "MoveThroughVillageGoal.cpp" + "MoveTowardsRestrictionGoal.cpp" + "MoveTowardsTargetGoal.cpp" "Mth.cpp" + "MultiEntityMobPart.cpp" + "MultiTextureTileItem.cpp" "Mushroom.cpp" - "MusicTile.cpp" + "MushroomCow.cpp" + "MushroomIslandBiome.cpp" "MusicTileEntity.cpp" + "MycelTile.cpp" + "NameTagItem.cpp" "NbtIo.cpp" + "NearestAttackableTargetGoal.cpp" + "NetherBridgeFeature.cpp" + "NetherBridgePieces.cpp" + "NetherSphere.cpp" + "NetherWartTile.cpp" + "NetherrackTile.cpp" "Node.cpp" + "NonTameRandomTargetGoal.cpp" "NotGateTile.cpp" + "NoteBlockTile.cpp" + "Npc.cpp" + "Objective.cpp" + "ObjectiveCriteria.cpp" "ObsidianTile.cpp" + "Ocelot.cpp" + "OcelotAttackGoal.cpp" + "OcelotSitOnTileGoal.cpp" + "OfferFlowerGoal.cpp" "OldChunkStorage.cpp" + "OpenDoorGoal.cpp" "OreFeature.cpp" "OreRecipies.cpp" "OreTile.cpp" + "OwnerHurtByTargetGoal.cpp" + "OwnerHurtTargetGoal.cpp" + "OxygenEnchantment.cpp" "Packet.cpp" "PacketListener.cpp" "Painting.cpp" + "PanicGoal.cpp" "Path.cpp" "PathFinder.cpp" + "PathNavigation.cpp" "PathfinderMob.cpp" + "PerformanceTimer.cpp" "PerlinNoise.cpp" "PerlinSimplexNoise.cpp" "PickaxeItem.cpp" @@ -537,70 +527,108 @@ set(MINECRAFT_WORLD_SOURCES "PistonPieceEntity.cpp" "PistonTileItem.cpp" "PlainsBiome.cpp" + "PlayGoal.cpp" "Player.cpp" + "PlayerAbilitiesPacket.cpp" "PlayerActionPacket.cpp" "PlayerCommandPacket.cpp" + "PlayerEnderChestContainer.cpp" "PlayerInfoPacket.cpp" "PlayerInputPacket.cpp" + "PlayerTeam.cpp" "PortalForcer.cpp" "PortalTile.cpp" "Pos.cpp" + "PotatoTile.cpp" + "PotionBrewing.cpp" + "PotionItem.cpp" + "PoweredMetalTile.cpp" + "PoweredRailTile.cpp" "PreLoginPacket.cpp" "PressurePlateTile.cpp" "PrimedTnt.cpp" + "ProtectionEnchantment.cpp" "PumpkinFeature.cpp" "PumpkinTile.cpp" + "QuartzBlockTile.cpp" "RailTile.cpp" "RainforestBiome.cpp" "Random.cpp" "RandomLevelSource.cpp" - "ReadOnlyChunkCache.cpp" + "RandomLookAroundGoal.cpp" + "RandomPos.cpp" + "RandomScatteredLargeFeature.cpp" + "RandomStrollGoal.cpp" + "RangedAttackGoal.cpp" + "RangedAttribute.cpp" + "Rarity.cpp" "Recipes.cpp" "RecordingItem.cpp" - "RecordPlayerTile.cpp" "RedStoneDustTile.cpp" "RedStoneItem.cpp" "RedStoneOreTile.cpp" - "ReedsFeature.cpp" + "RedlightTile.cpp" + "Redstone.cpp" "ReedTile.cpp" + "ReedsFeature.cpp" "Region.cpp" "RegionFile.cpp" "RegionFileCache.cpp" + "RegionHillsLayer.cpp" "RemoveEntitiesPacket.cpp" "RemoveMobEffectPacket.cpp" + "RepairContainer.cpp" + "RepairResultSlot.cpp" + "RepeaterTile.cpp" "RespawnPacket.cpp" + "RestrictOpenDoorGoal.cpp" + "RestrictSunGoal.cpp" "ResultContainer.cpp" "ResultSlot.cpp" "RiverInitLayer.cpp" "RiverLayer.cpp" "RiverMixerLayer.cpp" "Rotate.cpp" + "RotateHeadPacket.cpp" + "RotatedPillarTile.cpp" + "RunAroundLikeCrazyGoal.cpp" "SaddleItem.cpp" "SandFeature.cpp" "SandStoneTile.cpp" - "HeavyTile.cpp" "Sapling.cpp" "SaplingTileItem.cpp" "SavedData.cpp" "SavedDataStorage.cpp" "Scale.cpp" + "ScatteredFeaturePieces.cpp" + "Score.cpp" + "Scoreboard.cpp" + "SeedFoodItem.cpp" "SeedItem.cpp" + "Sensing.cpp" "ServerSettingsChangedPacket.cpp" + "ServersideAttributeMap.cpp" "SetCarriedItemPacket.cpp" "SetCreativeModeSlotPacket.cpp" + "SetDisplayObjectivePacket.cpp" "SetEntityDataPacket.cpp" + "SetEntityLinkPacket.cpp" "SetEntityMotionPacket.cpp" "SetEquippedItemPacket.cpp" "SetExperiencePacket.cpp" "SetHealthPacket.cpp" - "SetRidingPacket.cpp" + "SetObjectivePacket.cpp" + "SetPlayerTeamPacket.cpp" + "SetScorePacket.cpp" "SetSpawnPositionPacket.cpp" "SetTimePacket.cpp" "ShapedRecipy.cpp" "ShapelessRecipy.cpp" "SharedConstants.cpp" + "SharedMonsterAttributes.cpp" "ShearsItem.cpp" "Sheep.cpp" + "ShoreLayer.cpp" "ShovelItem.cpp" "SignItem.cpp" "SignTile.cpp" @@ -608,29 +636,43 @@ set(MINECRAFT_WORLD_SOURCES "SignUpdatePacket.cpp" "Silverfish.cpp" "SimpleContainer.cpp" + "SimpleFoiledItem.cpp" "SimplexNoise.cpp" + "SitGoal.cpp" "Skeleton.cpp" + "SkullItem.cpp" + "SkullTile.cpp" + "SkullTileEntity.cpp" "Slime.cpp" "Slot.cpp" + "SmallFireball.cpp" "SmoothFloat.cpp" "SmoothLayer.cpp" "SmoothStoneBrickTile.cpp" "SmoothZoomLayer.cpp" + "SnowItem.cpp" + "SnowMan.cpp" + "SnowTile.cpp" "Snowball.cpp" "SnowballItem.cpp" - "SnowTile.cpp" "Socket.cpp" + "SoulSandTile.cpp" + "SparseDataStorage.cpp" + "SparseLightStorage.cpp" + "SpawnEggItem.cpp" "Spider.cpp" + "SpikeFeature.cpp" "Sponge.cpp" "SpringFeature.cpp" - "SpringTile.cpp" "SpruceFeature.cpp" "Squid.cpp" + "StainedGlassBlock.cpp" + "StainedGlassPaneBlock.cpp" + "StairTile.cpp" "Stat.cpp" "Stats.cpp" - "StairTile.cpp" - "stdafx.cpp" "StemTile.cpp" + "StoneButtonTile.cpp" "StoneMonsterTile.cpp" "StoneSlabTile.cpp" "StoneSlabTileItem.cpp" @@ -639,69 +681,121 @@ set(MINECRAFT_WORLD_SOURCES "StrongholdFeature.cpp" "StrongholdPieces.cpp" "StructureFeature.cpp" + "StructureFeatureIO.cpp" + "StructureFeatureSavedData.cpp" "StructurePiece.cpp" "StructureRecipies.cpp" "StructureStart.cpp" "SwampBiome.cpp" + "SwampRiversLayer.cpp" "SwampTreeFeature.cpp" + "SwellGoal.cpp" "SynchedEntityData.cpp" "Synth.cpp" - "system.cpp" "Tag.cpp" "TaigaBiome.cpp" + "TakeFlowerGoal.cpp" "TakeItemEntityPacket.cpp" "TallGrass.cpp" "TallGrassFeature.cpp" + "TamableAnimal.cpp" + "TargetGoal.cpp" + "Team.cpp" "TeleportEntityPacket.cpp" "TemperatureLayer.cpp" "TemperatureMixerLayer.cpp" + "TemptGoal.cpp" + "TextureAndGeometryChangePacket.cpp" + "TextureAndGeometryPacket.cpp" "TextureChangePacket.cpp" "TexturePacket.cpp" + "TheEndBiome.cpp" + "TheEndBiomeDecorator.cpp" + "TheEndDimension.cpp" + "TheEndLevelRandomLevelSource.cpp" + "TheEndPortal.cpp" + "TheEndPortalFrameTile.cpp" + "TheEndPortalTileEntity.cpp" "ThinFenceTile.cpp" + "ThornsEnchantment.cpp" "ThreadName.cpp" + "Throwable.cpp" "ThrownEgg.cpp" + "ThrownEnderpearl.cpp" + "ThrownExpBottle.cpp" + "ThrownPotion.cpp" "TickNextTickData.cpp" "Tile.cpp" + "TileDestructionPacket.cpp" + "TileEditorOpenPacket.cpp" + "TileEntity.cpp" + "TileEntityDataPacket.cpp" + "TileEventData.cpp" "TileEventPacket.cpp" "TileItem.cpp" - "TileEntity.cpp" "TilePlanterItem.cpp" "TilePos.cpp" "TileUpdatePacket.cpp" + "TimeCommand.cpp" "TntTile.cpp" + "ToggleDownfallCommand.cpp" "ToolRecipies.cpp" "TopSnowTile.cpp" "TorchTile.cpp" + "TradeItemPacket.cpp" + "TradeWithPlayerGoal.cpp" "TransparentTile.cpp" "TrapDoorTile.cpp" "TrapMenu.cpp" "TreeFeature.cpp" - "TreeTileItem.cpp" + "TreeTile.cpp" + "TripWireSourceTile.cpp" + "TripWireTile.cpp" + "UntouchingEnchantment.cpp" + "UpdateAttributesPacket.cpp" + "UpdateGameRuleProgressPacket.cpp" "UpdateMobEffectPacket.cpp" "UpdateProgressPacket.cpp" "UseItemPacket.cpp" "Vec3.cpp" + "Village.cpp" "VillageFeature.cpp" "VillagePieces.cpp" + "VillageSiege.cpp" "Villager.cpp" + "VillagerGolem.cpp" + "Villages.cpp" "VineTile.cpp" + "VinesFeature.cpp" "VoronoiZoom.cpp" + "WallTile.cpp" + "WaterAnimal.cpp" "WaterColor.cpp" "WaterLevelChunk.cpp" - "WaterlilyFeature.cpp" "WaterLilyTile.cpp" "WaterLilyTileItem.cpp" "WaterWorkerEnchantment.cpp" + "WaterlilyFeature.cpp" "WeaponItem.cpp" "WeaponRecipies.cpp" - "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" )